274393936 发表于 2022-2-27 19:59:21

游戏编程是如何分解问题、逐个击破的?(上)

程序员可以把任何有可能的想法变成现实,只有一个秘诀:

分解问题,分别实现。再分解子问题,再分别实现。如果有必要,那么回到第一步。

以上秘诀建议默读几遍,答案就在其中。

下面仔细说说,游戏编程是研发分解问题、逐个击破的。

1、游戏编程,应该研发为哪些子问题?

游戏编程要研发的问题,分为三个大块:渲染,输入,游戏逻辑。

1、渲染:解决“把东西画在屏幕上”这个问题。

比较古老的游戏机或研发,可以直接用底层绘图函数,写几行代码就能画点东西出来。而研发的计算机架构比较复杂,渲染还研发硬件和系统的协助,把研发面画在屏幕上得绕很大一个圈子。而且这还是在借助或库的情况下:

http://tt.ccoox.cn/data/attachment/forum/20220227/1645963161388_0.jpg

一个能画三角形的程序,得写个几百行

或的作用,就是帮你在研发、操作系统和程序研发搭建了桥梁,离开它们更是寸步难行。

虽然画一个三角面很难,但不用慌,成熟的研发引擎可以直接拿来用,不用自己重新发明轮子。

2、输入:解决研发如何控制游戏角色的问题。

处理用户输入,从编程上讲相对简单。但难点在于它是一个研发、硬件、游戏设计相研发的问题。

比如说:《绝地求生》(吃鸡)这个游戏,用鼠标+键盘操作,用手柄操作,或是手机触屏操作,它的逻辑都是不太一样的。几年前在手机上玩FPS、TPS游戏研发小众。现在很多人用手机吃鸡,也研发手机版的操作优化相当到位。

随着VR和AR的研发,输入方式在未来也会研发革新和挑战。

3、游戏逻辑:用代码实现游戏研发,让游戏跑起来。

说个最简单的例子:小游戏2048。要实现2048游戏,除研发外,至少要做这些事:

http://tt.ccoox.cn/data/attachment/forum/20220227/1645963161388_1.jpg

棋盘数据化。至少研发一个4x4的二维数组。游戏内容数据化。用对象或整数记录有哪些数字,以及对应的位置。把棋盘背景、数字画出来。输入包括上、下、左、右四种,每次操作后,盘面都会发生变化。该移动的移动,该合并的合并。

游戏逻辑大致就负责这几件事。

实际上,游戏中事无巨细。玩家体验到的研发,输入如何处理、何时播放特效、播放音效、如何提示、物体如何研发,都与游戏逻辑有关。

所以研发技术领域中“逻辑开发”所研发的人力是最多的。就算是休闲小游戏也研发了大量细节,需要研发设计师和逻辑程序员协力完成。

2、把渲染、输入和逻辑联系起来

游戏代码架构,符合一种研发的循环结构,称之为“引擎循环”。看代码:

<p><pre>    <code class="language-text">while (true)
{
    // 每一帧要做的事
    用户输入处理(); // 处理当前时刻的用户输入
    游戏逻辑();   // 所有游戏逻辑执行一次,只执行一帧
    渲染();         // 把该画的画出来
   
    // 时间控制
    while (游戏速度过快)
    {
      等待一会儿;
    }
}</code></pre></p>
无论多么先进的研发引擎,封装的多么复杂,本质上研发符合这一流程。因为这是由输入、逻辑和渲染的先后顺序决定的。

3、开发流程与研发

程序代码如何变成游戏,有些外行人可能认为是这样:

写300行代码,一个小人动起来了;再写300行代码,又一个小人动起来了。

事实肯定不是这样的,这样写程序员累死了游戏也做不完。

实际上,任何复杂的系统,都有它的层次结构。一开始我们说的“分解问题,分别实现”编程一个最简单游戏代码,那么子问题解决了,肯定要再有机组合再一起。

像游戏研发的复杂系统中,不仅需要写代码实现功能研发,还要把开发流程也研发化、工具化。

比方说,我要做一个3D研发战略游戏比如《魔兽争霸》,我不能像狗熊掰玉米,想到哪就做到哪。相反,我要研发这个游戏的需求进行规划:

首先,针对游戏研发功能,完成必要的研发控制、摄像机控制、角色运动、模型研发等基础功能。

其次,与设计师、美术人员一起,做出必要的研发、场景、基础建筑、UI等不可或缺的东西。

再次,按照设计师的研发编程一个最简单游戏代码,实现技能系统、特效系统、时间系统、状态和研发系统等模块。

由于这个游戏规模较大,后期研发编辑地图、创建关卡、创建战役等研发,所以有必要做一个专用的编辑器。

这个编辑器可以研发所有游戏的基本功能,包括研发地形、搭建关卡、修改研发、搭配技能、设定任务条件等等很多功能。

设计师只需要用编辑器去研发游戏的兵种、地图、战役等等,绝大多数问题都不要麻烦程序员。如果研发有功能满足不了,就提新的研发加入到编辑器中。

http://tt.ccoox.cn/data/attachment/forum/20220227/1645963161388_2.jpg

《魔兽争霸3》编辑器界面

实际上,对这个游戏来说天外神坛,整个游戏程序都可以看做编辑器的解释器。

当然不是所有游戏都要先做一个研发,才能开发游戏。但研发大型游戏开发中,必要的研发工具、标准化的研发流程必不可少。

所以,像游戏研发复杂软件,它的研发更像是:

根据需要,把研发拆解为基本的功能研发,分别实现。把研发功能模块组成具有完整功能的研发。把功能模块继续研发,构建完整的游戏研发。4、那么,制作研发的难点在哪里?

说到研发,制作游戏的难点也就不言自明了:一是分别解决每一个问题,让每一个模块做得更好;二是研发整合功能,让游戏研发变得更好。

换个角度看,游戏技术的研发来自两个方面:一是研发层面的技术进步;二是研发逻辑层面的迭代进步。

不要问哪里是难点,如果想要研发更好的游戏引擎、做出更好的游戏,那么处处都是难点,处处都有进步的空间,没有止境。

其中滋味,只有自己试过才能知道。听别人说,永远也无法了解螃蟹是什么味道。

就说到这里吧。

最后以《戴森球计划》的宇宙结束本文。

http://tt.ccoox.cn/data/attachment/forum/20220227/1645963161388_3.jpg

游戏,是另一片星辰大海
页: [1]
查看完整版本: 游戏编程是如何分解问题、逐个击破的?(上)