第186章 风起赫尔辛基
作者:猪熊      更新:2022-05-25 01:50      字数:5085
  帕纳宁道:“或许我们不应该太先入为主顺着游戏引擎这个思路走,我们应该想想如果我们没有游戏引擎我们要怎么开发?”

  紧跟着帕纳宁问道:“我的老伙计,如果是你要你来开发《HILL CLIMB RACING》这款游戏中同样的效果的话,你会怎么做呢?你不妨就拿这款游戏屋顶地图涉及到的下雨情景分析一下。”

  贝尼托·瓦西里耶维奇说道:“关于这个我先前已经考虑过了几种可能。

  我觉得涉及到下雨这个情景,最让人啧啧称奇的其实是三点。

  首先,GRAY FOREST设计的‘下雨’很有层次感。

  其次,早GRAY FOREST设计的下雨场景中并没有出现一般游戏里天气粒子常常呈现的井喷或者断续。

  再有,就是《HILL CLIMB RACING》这款游戏里下雨场景开始和结束时涉及到的一些过渡很自然。”

  贝尼托·瓦西里耶维奇接着说道:“后两个问题稍微麻烦一些,但涉及到层级感的问题,倒是不难猜测GRAY FOREST是怎么做到的。

  无非就是以2D的形式进行了3D的表现而已,从而实现一种伪3D的效果。”

  帕纳宁印象中以2D形式进行类似于3D的表现:

  首先要在2D游戏场景中设置3D渲染区域。

  在3D渲染区域要放上想要表达的多个2D图片。

  当然2D图片并不是随意放置的,要将所述多个2D 图片渲染成相邻图片的两侧边缘顺次连接在一起的折叠册页的3D形式。

  这样做的话当程序开始接受到输入信息(诸如对触屏上的滑动手势之类的)做出响应时。

  就会将3D渲染区域提前“放置”的折叠册页向着程序先前设定的方向展开。

  这个过程还要智能地调整相应折叠册页中的排布顺序及图片的尺寸以实时地确定各2D图片的展开位置和展开角度。

  这一过程顺利实现的话可以将各2D图片渲染成与其展开位置和展开角度实时对应的伪3D表现形式。

  具体怎么理解这个过程呢?

  帕纳宁想到了“立体书”,就是一翻开能看到立体画面的那种书。

  某种程度上在2D游戏场景中设置3D渲染区域而后在所述3D渲染区域显示多个2D图片这一举动就很类似于立体书的运作过程。

  只不过架构这种“立体书”的过程远比绘制现实中那种小儿科般的立体书要复杂的多。

  这个过程需要涉及到对2D游戏场景进行分层。

  要将2D游戏场景中所述折叠册页所在的区域设置为采用3D渲染策略的3D渲染层。

  所述3D渲染层不光要对应于所述3D渲染区域,同时为了避免一些瑕疵的出现。

  还要将2D游戏场景中的背景区域设置为采用2D渲染策略的2D渲染层。

  而后要将3D渲染层覆盖到2D渲染层之上。

  通常这个覆盖的采用的形式是:

  ——对所述2D渲染层采用正交投影方式进行投影,对所述3D渲染层采用透视投影方式进行投影。

  并不是简简单单叠加就完事了。

  在游戏中涉及到具体到表现的时候还要绘制2D渲染层到颜色缓冲区。

  将2D渲染层的所有像素深度设为最大深度而形成为所述2D游戏场景的背景;

  绘制3D渲染层到颜色缓冲区:

  对于3D渲染层的所有像素深度设为小于所述最大深度。

  使得3D渲染层投影生成的画面覆盖背景所在2D渲染层的相应区域。

  如此才能在2D画面上实现的3D视觉效果。

  这个过程听起来就很麻烦。

  虽然不明白大道至简的道理,但帕/纳/宁同样认为而麻烦的事物往往意味着实际运行的时候容易出现这样那样的问题。

  反正帕/纳/宁觉得GRAY FOREST所用的绝对不是这种方法。

  在老搭档面前帕/纳/宁自然没有遮掩。

  他将他这个想法毫无保留地说给了贝尼托·瓦西里耶维奇。

  贝尼托·瓦西里耶维奇深以为然。

  帕/纳/宁道:“我的老伙计,你把我搞糊涂了。

  你刚才说GRAY FOREST所做的无非就是以2D的形式进行了3D的表现从而实现3D的视觉效果。

  可你也同意了我刚刚的观点——认为GRAY FOREST采用的不是通过引入3D渲染区域再构建‘折叠册’的那种做法。

  莫非你想说的是除了我刚才说的这种方法之外,还有别的方法可以在2D画面中进行3D表现?

  在电脑游戏中除了我刚才说的那个方法,确实还有很多别的方法在2D画面中进行3D表现。

  但恕我实在想不到在手游里除了构建3D渲染区域之外,还有哪些可以实现在2D画面中实现3D效果的技术。

  哦,我亲爱的贝尼托·瓦西里耶维奇,别绕弯子了,快告诉我你究竟是怎么想的。”

  贝尼托·瓦西里耶维奇理了理思路,而后开口说道:“首先说到你刚才提到的观点,我和你也是同样的见解。

  利用类似于折叠册的形式实现《HILL CLIMB RACING》这款游戏里下雨场景中那种颇具层次感的画面虽然在理论上行得通。

  但仅仅是理论上,GRAY FOREST在《HILL CLIMB RACING》用的绝对不是这种方法。

  如果按照你说得那种方法在实际操作的时候涉及到将3D渲染层覆盖到2D渲染层之上时。

  这个过程需要对2D渲染层采用正交投影方式进行投影,对所述3D渲染层采用透视投影方式进行投影。

  而这两种投影涉及到的计算都极其庞大。

  尤其是透视投影是典型的计算密集型投影,这个过程涉及到三角计算。

  并不是sin x、cos x那种简单的三角计算,涉及到这个过程中的三角计算通常伴随附加有包括矩阵和矢量相乘的运算。

  随着场景中所记录细节的量的增大时,用来渲染该场景的冗长计算的数量也将增大,这对CPU是个极大的考验。

  常规情况下,涉及到一般物体的投影计算都很吃CPU。

  更何况是涉及到下雨这个场景,如果按照你说得这种办法进行透视投影的话。

  实时计算量将随着雨滴数量的增多而呈现出指数增长。

  恕我直言,别说5s中的A7处理器是一枚桌面级处理器。

  就是A7处理器的处理效能在此基础上再翻一番恐怕也只能勉强满足这种运算需求。

  巧妇难为无米之炊,如果真的是采用这种方式的话,现有的CPU水平根本无法提供技术支撑。

  假设GRAY FOREST所采用的真是这种方式的话。

  那么在现有的技术水平下,运行这么一款计算量超级多的游戏时会出现什么样的反应呢?

  这些额外的计算大概率会要求以移动设备减小的帧速率进行游戏。

  但经过我们的实测同样的5s机型在运行《HILL CLIMB RACING》这款游戏时在屋顶场景的小雨环节并不会出现帧速率减小的情况。

  这也从侧面验证了我们先前的判断。

  即—GRAY FOREST在《HILL CLIMB RACING》用的绝对不是引入3D渲染区域而后构建折叠册的方式。

  除此之外,我觉得GRAY FOREST所采用的方式也不是传统意义上的游戏渲染。

  一般来说涉及到2D游戏画面相对应的游戏渲染通常所采取的步骤通常是:

  先获取2D游戏画面数据而后分析2D游戏画面元件的初始坐标;

  在获得初始坐标之后根据所述初始坐标构建所述2D游戏画面元件的实际坐标系。

  接着,基于上面所构筑的实际坐标系,将2D游戏画面映射成3D游戏画面才具有的视觉效果。

  再之后要将映射的3D游戏画面的数据缓存到缓存器中。

  当接收2D游戏的运行指令,只需要根据所述运行指令调取缓存器中已经生成的3D游戏画面的数据就可以了。

  同时为了增强表现形式,还需要对调取的3D游戏画面进一步渲染。

  上述这个过程对GPU的要求很高,GPU必须有强大的实时渲染能力。

  这样的做法虽然理论上行得通,但也仅仅是在越狱后蘋果手机或者ROOT之后的安卓手机上菜行得通。

  但在正常状态的手机中根本不大现实。

  毕竟一个应用能调用的GPU大多数情况下都是相当有限的。

  因此我认为GRAY FOREST在《HILL CLIMB RACING》用的绝对不是这种方法。”

  帕/纳/宁:“那你认为GRAY FOREST采用的究竟是什么方式呢?”

  贝尼托·瓦西里耶维奇:“对此我也只能猜测,一个人设计游戏时采用的方式很大程度和其开发风格有很大的关系。

  GRAY FOREST虽然崛起的很迅速,像一颗冉冉兴起的新星,但此人开发手法是相当老练的。

  毕竟在开发《HILL CLIMB RACING》这款游戏之前,GRAY FOREST已经开发了三个作品了。

  这些作品都得到了市场的验证,广受游戏玩家的喜爱。

  能取得这样的成绩的GRAY FOREST也可以说得上是一个极其有经验的游戏开发者了。

  而这样的人在涉及到具体游戏开发时不可能凭空给自己制造麻烦。

  因此我推断GRAY FOREST所采取的一定是最简单的方式。

  另外不久前GRAY FOREST在GitHub上上传了他之前开发《2048》所设计的代码。

  开始的时候我并没怎么当回事,因为这段代码形式并不算很简洁。

  但绝对是在iOS上运行起来效率最高的。

  其实像《2048》这种简单的小游戏,即便是运行效率有点区别,也不会影响太大。

  可偏偏GRAY FOREST一定要搞一个效率最高的。

  这说明这个人骨子里就追求高效率。

  这样一个一味追求高效的人在设计《HILL CLIMB RACING》这款游戏中所采用场景构建一定是最高效的。

  而在2D游戏中最高效的做法绝对不是额外引入3D渲染区。

  基于效率方面的分析以及对游戏画面进行判断。

  我认为GRAY FOREST在下雨场景中雨滴之所以看起来很有层次感是因此采用了一种视觉欺骗。”

  帕/纳/宁疑惑道:“视觉欺骗?”

  贝尼托·瓦西里耶维奇:“对的,就是视觉欺骗,一般我们会下意识的认为‘近大远小’。

  因此涉及到雨滴层次感架构的时候,只需要将雨滴表现的大小不一即可。

  当然,涉及到如此浓密的雨滴,GRAY FOREST绝对不可能一滴滴地去绘制。

  正常来讲,2D画面,就是只有X、Y轴的画面,不存在Z轴;

  而3D画面,则是有X、Y、Z轴的画面。

  而GRAY FOREST采用的做法应该是在2D游戏中引入了虚拟的Z轴。

  我猜测GRAY FOREST具体来说是这样做的。

  因为在游戏中,像雨滴这种东西一般都是由粒子系统进行表示的。

  [一般来说粒子系统表示三维计算机图形学(CG)中模拟一些特定的模糊现象的技术。

  之所以将这些现象称为模糊现象是因为用其它传统的渲染技术难以实现的真实感的游戏图形。

  经常使用粒子系统模拟的现象有火、爆炸、烟、雨、火花、落叶、云、雾、发光轨迹这样的抽象视觉效果等等。

  粒子系统的核心是粒子发射器生成的一个个行为独立的粒子,共同构建出动画]

  在对游戏中引入虚拟的z轴之后。

  这样我们在游戏开发中进行雨滴层次感的构建的时候。

  完全可以让粒子发射器在发射天气粒子(雨滴)的时候,赋予天气粒子(雨滴)一个虚拟深度值Z。

  在天气粒子的整个生命周期中,虚拟深度值Z保持不变;

  Z值和天气粒子(雨滴)状态之间应该存在着一个函数,

  这个函数所起到的作用是缩放作用是对雨滴进行缩放。

  并且这个函数将赋予深度值不同的天气粒子以不同的视觉大小和运动状态。

  再之后将缩放变换结果分别发送至粒子大小显示单元和粒子运动状态显示单元

  如此一来,理论上应该会使2D游戏中的天气粒子具备层次感。

  当然,这只是我的猜测而已,想要知道问题真正的答案,还需要进一步的分析。

  再或者,我们要向GRAY FOREST本人寻求答案。”

  (ps:……天气粒子分层这个是猪场的技术,原本是14年末出现的)

  帕/纳/宁听到这个分析,似乎又收获了一些新的启发,不过他也有不解之处。

  帕/纳/宁说道:“只是这样吗?我记得在很多游戏的建筑场景都常用到这种类似的近大远小效应啊。尤其是涉及到一些城堡廊柱之类的游戏这种近大远小的设置其实是很普遍的。

  甚至这样的设计多多少少有点复古。”