2020-07-30 blog
我发现我有点奇怪。
在很长一段时间不玩游戏之后,会一直想着怎么找游戏玩。
在玩了某个游戏一段时间之后,会慢慢地进入一种半弃坑的状态,直到慢慢完全弃坑。然后后悔自己氪了金。
我发现,这个问题,虽然跟我自己有关系,但是跟游戏的设计其实也有很大关系。
其实我玩过这么多游戏,总结起来基本都是,刚开始玩的时候,肝点很多,基本上是连续几天都是几乎全部时间投进去那种。之后呢,发展开始进入平稳期,然后基本上也是可以保证每天登陆,做做日常什么的。再然后呢,爬到高层了,达到差不多第一梯队了甚至就是第一梯队了,然后发展就进入了瓶颈期。然后基本上就是在这个时间段附近退坑。
一方面是,随着玩家的游戏时长增加,游戏的内容被快速消耗,一方面是游戏的新内容增加不能跟上消耗的速度。然后就会出现两种情况:一种是玩家登顶了,没啥事情干了,游戏转为社交性质或者pvp性质;一种是游戏制作方将各种培养路线的斜率拉高,使玩家培养速度放慢,以适应缓慢的开发。前者不必多说,一大堆的游戏都是这种情况。而后者,其实就是我目前在玩的游戏的现状。
但是很明显,相比起前者,后者的问题是更大的。前者还可以说玩家登顶了,再创建一个小号继续培养。而后者最直观的体验就是:游戏刺激到玩家爽点的能力大幅下降。而且我更不明白的是,明明这是一个还在测试期,还没正式上线的游戏,为什么要这么早就用力过猛地“预先处理”这种游戏发展了几年大概到夕阳期才会遇到的问题呢?这是非常让人不解的。按理说,应该是让一部分玩家能够体验到游戏的完整内容,才更方便测试出游戏的bug,或者是各种平衡问题,设计问题等等。
想不明白。想不明白。
可能,是因为小团队吧。之前我写过一篇文章分析过这个团队的“经济学”,最后的结论是“没有人懂经济学”。
但是,同样曾经是小团队(现在是不是我已经不知道了),明日方舟就能做得很不错。
如果说是由我来做程序那一块(假设我有手游开发方面的一部分知识储备的话),可能我三个月的进度就顶得上他们半年以上?
而且现在回头看过来,这个游戏当初吸引我点进去玩的一些所谓吸引点,其实这些到了后期都是没有任何用处的。也就是说它只能成为一个吸引新人的卖点,但是不是游戏的特点。也许它这个游戏是有某一个或者某一些,在这一类游戏里面比较突出的点,但是没有办法形成一个足够强的特点或者卖点,能够让玩家以此为核心并且乐此不疲地玩下去。
而且你说这个游戏没有人氪金支持吗?也不是,至少能看得到的氪金十万以上的都有好几个,看不见的那就不知道了。十万以下但是至少7500以上的,也有不少。这样一个氪金量,对于一个小团队来说其实已经是一个很不错的成绩了。关键是,他们可能在某种程度上辜负了玩家的期待吧。
当然,你说我又不是这个公司的人,瞎操什么心呢?确实。但是我也并不是为他们着想,而是把它作为一个镜子。至少,我可以从中总结出:什么做法其实是不work的。
突然想到一种神经网络的运算机制,有点像图但是又不完全是。
输入部分,输入部分无论是多少维的,暂时理解为“展平后”的一维状态(当然第一个维度是batch就暂时忽略掉)。然后是中间的层,最后是输出。
首先是定义一下层。输入层,比方说输入是5x5x1
的图像。然后是神经层,边长可以是比5大的,也可以是比5小的,另外层有深度。假定边长为A,深度为C,也就是AxAxC
个Cell。
然后是数据流的问题。首先是数据映射,从输入层到神经层之间有一个映射,参照CNN卷积里面那种,一个映射到3×3或者5×5,然后是限制一个输入最多映射到T个Cell。为了运算的简单,可以认为是在一个KxK的域里面随机选择T个位置,记录坐标值,其他地方设置为0,而这些位置使用随机高斯分布创建初始权重。然后是映射到Cell之后,对所有接收到的值进行加总,然后是经过一个Gate ReLU,使得Cell接收到达到一定阈值的信号才被激活。激活之后得到的值,用X来表示。
接下来是重头戏。每一个Cell与它自己周围的3×3或者5×5的Cell之间创建一个单项连接,同样是在一个KxK的域里面随机选择Q个位置。用X乘以这些连接,进行一次信号传递,将这些传递的值与原来的X加到一起,并且同样是用Gate ReLU激活,得到的值用Y来表示。这一传递过程可以进行P次。
进行第P次之后的值O,即为该层的输出。
这个模型以这个描述的话,其实是一个不可增模型,虽然它预留出了可以增加连接的位置。所以之后可以思考一种“能够让连接的权重从0变成非0”的机制。
如果是不可增模型的话,其实初始化的过程还可以继续简化:数据映射和信号传递,可以是直接整个KxK映射域按照随即高斯分布创建权重,在后续训练的过程中它会自己裁切的(加上惩罚项)。不过还是要注意一个点,那就是信号传递阶段的权重,映射域的中间点权重为0,也就是信号传递不传递给自己。
而如果是增长模型的话,可能在基于“增加链接机制”的前提下,可以在初始的时候一个值只映射一个点。反正后续是可增的。
另外,对于KxK权重的创建,还有以下的考虑:靠近中心的映射肯定比远离中心的几率要高,可能可以根据到中心的距离来创建权重。比如说3×3的映射域,权重就是生成的值的1倍;5×5的映射域,内圈3×3的权重是生成值的q倍,而外圈5×5(挖掉中间的部分)的权重是生成值的(1-q)倍,(0<q<1)。然后比如说7×7的话,最内圈是q倍,中间圈是q^2
倍,外圈是1-q-q^2
倍。当然这个机制也可以作为这个模型的升级版,后续再尝试实现。目前暂时先按照最简单的来实现再说。
因此,比较有必要研究Initializers类的机制了。
整个过程可能比较硬核,可能还需要手动画图来辅助分析以及构建。
重新分析了一下,发现第一个过程和第二个过程可以拆开。
然后发现,第一个过程其实也可以分成两类,第一类是映射域在输入区,第二类是映射域在结果区。第一类就是卷积那种。然后可以通过映射的stride达到和卷积的stride一样的效果,以及padding。
然后发现,其实第二类跟第一类也非常接近,其实自身周围的映射,就相当于第二类映射,只不过比较特殊的是权重初始化的时候要把中间点设置为0。同时其实也可以用stride以及padding之类的来控制输出的尺寸。至于重复这一步,其实可以理解为把这个运算打包成一个新的Layer。
那么,接下来首先要做的事情就是,研究TensorFlow怎么自己实现出卷积算法。
然后就是研究如何自定义出符合自己想法的权重。
然后是写出这种自定义卷积。