第十九章 克苏鲁神话

夜半鬼入梦 莫道梦魂遥

刚刚展示了两个肢体运动捕捉的案例,下面来看一下面部表情捕捉。这是很早很早以前的光学运动捕捉系统,可以看出对于表情的还原非常精确,惯性运动捕捉系统是做不到这一点的。还需要展示的是,动作动画的重定向。前面说过了,动作师在是骨骼的层面上工作,而不是模型。因此,我们做出的动作动画,可以使用在不同的模型上:面部表情捕捉重定向。这能够大大减少我们的工作量。

工作提交:作动师完成工作以后会得到大量的动作动画片段,包括但不限于:走、跑、蹲、跳、攻击、防御、受伤、死亡……动作动画片段展示剑盾战士。配上材质贴图,大概是这个样子:动作动画片段展示_士兵;再看一个的动作吧:刺客信条动作动画展示

3.9GUIDesigork

实际上我将略过这一环节。因为我认为游戏中最好的UI,就是没有UI。但这将是游戏发展的一个趋势,我看到许多大厂小厂都在加入这条道路,去UI化:只在最必要的地方,用干扰力最小的方式,给予玩家最需要提示。把屏幕空间,还给游戏世界,我们不需要那么多文字与图标。讲到这里,Alpha阶段的美术工作已经走过一遍。我们可以把必要的GUI,和前面做的所有3D美术资源提交给游戏设计师。在这个过程中,TeicalArtist将发挥一个重要的作用:他将编写Shader脚本,der也是一种美术资源——der告诉电脑如何用特有的一种方法去绘制物体。

比如在上面这幅对比图中,整个场景使用了完相同的模型、材质贴图,并且处于同一个时间状态,但是因为使用了不同的Shader,最后得到的效果也完不同。通过Shader,我们可以让一个非常写实的物体,变成卡通风格、水墨风格、像素风格,可以让它变成半透明,或是只有一个剪影。可以大致参考:

来自GarethStockell的Shader效果对比。

Shader的制作,属于编程工作,并且需要具有计算机图形学知识背景。那个以为做美术工作就是画画的少年,你有什么想法吗?

如果没有,那我们就进入声音制作的环节咯。

3.10AudioMusic

制作游戏不仅需要画面,还需要声音。声音包括:音效、音乐、配音。

3.10.1、音效制作。包括开枪的声音、汽车的声音、脚踩在木板阁楼上的声音、释放技能的声音、点击游戏菜单的声音。最基本的制作方法是实录,比如为了制作真实的枪声,去军营里实录了所有武器的声音。还有一种方法是拟音,这是更为经济实用的方案,用这两个视频来了解一下拟音艺术吧:拟音师忽悠女盆友、奇妙的工作:拟音师。我们做游戏的其实很少有成立专门的拟音组,去制作专门的音效,这在AAA级的StroyTelling游戏制作组中可能会有。我们更喜欢的是使用商业音效库,里面包含了许多现成的音效,像这样:

另外,我们还会用声音合成器去制作一些现实中并不存在的声音,比如说传送门的开启声。

3.10.2、音乐制作。专业术语是:编曲。编曲过程可以参考下面的视频,考虑到没接触过编曲的人可能看不懂,稍作解释:视频中音乐家CarolKay一个人用MID键盘,先后编写了:大镲、大鼓、日本太鼓、小鼓、小号、长号、大号、吊镲、小提琴、大提琴、贝低提琴、贝斯、竖琴、铜钹、格洛克、吟唱、长笛、定音鼓、钢琴、法国号等乐器的音轨:游戏配乐编曲过程。现在的游戏音乐,甚至其他流行乐、交响乐什么的都是这么编写出来的。一般是先在软件里编好,然后为了追求音质后期再找交响乐团实录。想要编写优秀的音乐,乐理是基础知识,然后需要去熟悉了解不同的乐器不同的音色。编曲和乐器演奏是两回事,但是具备多种乐器演奏能力是最好的。补一句,在传统的音乐编曲上,制作游戏音乐往往还需要考虑超长时间的loop循环,让人听一天也不会腻的单曲循环。还有需要程序控制的动态地音乐节奏切换、和弦进行切换、混响效果器切换,以适应游戏中的事件状态。所以游戏配乐会有一些不同。

3.10.3、配音。为NPC配音,为过场动画配音,为游戏角色的语音包配音。这个工作很好理解,现在不仅在StroyTelling游戏中很重要,在Gaplay游戏中也越来越重要,想一想、,打着打着莱因哈特会来一句:“护盾快撑不住啦!”;小美会说:“嗨呀~好气呀~”。但是做这份工作的人群,在国内的生存状态并不理想。我认为需要给予他们更多的关注,看这两个视频了解一吧:“替”声世界之生存现状;走进“替”声世界:夏磊_演讲。

声音资源制作和美术资源制作就到这里,这些资源统统都会交回到游戏设计师的手里。他们在游戏引擎中把这些资源整合到一起,来完成真正的游戏制作工作。

3.11LevelDesign

在GaDesign方面,我们刚刚讲到了StroyboardDesign。经过这项工作,我们设计了玩家的游戏流程。在这之后,我们需要进行进一步的设计:在游戏流程中的具体细节。就像我展示出的我曾经的工作内容一样,我们会去考虑玩家在流程中的每一步的感受,会去设计我们想要给他带去的体验。这就是Storyboard之后的GaplayDesign的工作意义。与原型阶段的GaplayDesign有一些区别。这更像是做PreExperienceDesign。

经过二次GaplayDesign,经过美术和声音资源制作工作,我们已经得到了制作一个世界所需的所有资源。在这个基础上,我们可以开始进行LevelDesign我认为可以分成两层:1、关卡设计;2、场景搭建。在我的语境中,关卡设计是一种游戏性设计,会去考虑玩家的行动路径、决策方案,会考虑战斗掩体的布置、地势高低的布置等元素。这项设计工作与它前置的GaplayDesign密不可分。

场景搭建呢,是一份艺术工作,目的是在游戏引擎中还原场景原画师所设计的游戏场景。其过程可以参考如下:

来自LevelDesignerMaverick的快速游戏场景搭建森林铁路以及快速游戏场景搭建村庄;

来自LevelDesignerKaanztüzün的快速游戏场景搭建城市;

上面三个是Unreal4的场景搭建,下面放一个Unity的:

来自LevelDesignerMaverick的快速游戏场景搭建入海口;

这些都是自由的游戏场景搭建,实际工作中,房屋的位置、街道的转折、物体的摆放,都已经由关卡制作的过程预先制定了。在关卡制作中,设计师们用各种简陋的方体来代替物品,定制关卡中所有碰撞体积的位置:

左图是艾兴瓦尔德的关卡设计示意图,右图是完成场景搭建后的效果。完成场景搭建后,我们的游戏基本就拥有了华丽的外表。还记得原型阶段给大家展示的截图吗,来看一下它们对应Alpha阶段的截图对比:

真是激动人心的时刻啊,我们的游戏完成了脱茧蜕变,完成了华丽丽的升级!但是我们要知道,这背后是许多艺术家、设计师挥汗如雨的辛勤工作。他们可能经历过灵感的匮乏,经历过方向的迷失,经历过未曾预知的错误,经历过拍桌叫板的争吵,经历过委屈与绝望,经历过一年又一年纷飞的雪。看着这些伟大的游戏的画面,鬼知道在这背后我们经历了什么。

3.12ExperienceDesign

游戏还没有结束。我们要做最后一次设计工作。我称之为体验设计。体验设计,需要去考虑玩家从点开游戏的桌面图标开始,进入游戏看到的第一个画面,第一个菜单,听到的第一个声音,一直到玩家正式进入游戏场景,开始的第一个事件,收到的一个奖励,一直到玩家第一次保存并关闭游戏,下一次再进入游戏,遇到的最大的挑战,最紧张的时刻,最刻骨铭心的体验,一直到玩家人生中最后一次关闭游戏,把它永久地留在硬盘的某个角落,在这之中会经历的一切。这项工作会整合所有的游戏资源,去整体设计玩家的游戏体验。就像旅行体验设计师会做的那样。

在许多游戏的制作成员名单中,可能并不会看到ExperienceDesigner这个词。因为体验设计,是一个团队的工作,整个团队的工作。每一个环节都会为最终的体验负责。当然,我建议由熟知产品设计的游戏设计师来领导完成此事。

到此,游戏已经完成了Alpha阶段,也意味着游戏完成了部的开发工作。

4、Beta阶段

Beta阶段的主要工作,就是对游戏进行测试与迭代。QualityAssurance团队会进入制作组,对游戏进行方位的验收。他们会去测试游戏中的每一个按键,每一个功能,找出任何出现异常的地方,然后报告给Directors,让他们去修复和完善。同时他们也会再一次检验游戏的玩法。但愿他们不会在这时提出否定的意见。否则制作人会崩溃的。暴雪曾因为QA测试无法通过,最后放弃了已经开发了7年之久的,ChrisMetzen,曾主持过、、、开发工作的暴雪副总裁,崩溃了。在顶着巨大的心理压力,收拾残局,制作完后,他选择了离开暴雪,离开游戏界。这是为什么,我们需要有原型阶段,我们要在原型阶段检验游戏的玩法,对待复杂玩法的游戏,我们都小心翼翼。同时我也致敬暴雪,他们宁愿割掉自身的血肉,也不愿给玩家一个无聊的游戏。

好了,我致敬的方式是放两个EA的游戏视频……pia!

还记你在原型阶段下载下来玩的那个Ravenfield吗?想知道它在完成Alpha和Beta阶段之后是什么样子吗?请参照:联机对战实录;官方联机演示。

结语

到这里,整个游戏开发流程已经讲完了。谢谢你能够耐心地一直看到这里。,这个流程是我根据古今中外的实际项目和自己的理解总结出来的理想模型。它可能并不匹配任何一个市面上游戏的开发流程,也可能不匹配小团队独立游戏的开发流程。但我尽可能的把各类游戏开发中需要的工作都整合了进来,让大家看到一个面的工作介绍。有些工作,在你们的游戏中可能不需要出现,比如就不需要HighLevelDesign,或者你们开发2D游戏就不需要Modelling及之后的工作。甚至有的开发团队不采用这样的瀑布流开发模式,而是采用敏捷开发模式,这都没有问题。只是我个人倾向于采用完整的这套开发流程来制作游戏。

希望在阅读完本篇文章后,你已经对游戏开发的流程有了一个大致的了解。至少在设计和美术上,你已经心里有数。在分享美术部分的时候,因为这是看得见的部分,所以我高兴能够用视频和图片的形式来辅助讲解。虽然收集和筛选这些素材花费了我巨大的时间,但是能起到一定的帮助那我便觉得值得。设计部分能够展示的相对较少一点,程序部分就更少了,几乎没有。这也是因为程序部分即便是用视频图片还是用文字,都无法充分地展现其精髓。如果直接拿程序代码出来,绝大部分人又根本无法看懂。但是不用过于担心对于程序知识的欠缺,因为在本专栏正式引导新人自学游戏开发的第一部分,我们就会从编程开始。然后逐个地,把每一个工作内容,文中和视频中展示的每一项技术,每一个知识模块都学一遍。只要你学有余力,就可以跟着我把游戏开发的所需的所有技能都学一遍,成为一个能游戏设计师。在了解所有流程的基础上,如果你仍旧只是对某一部分感兴趣,那么你大可规划好你自己的职业定位,就像开篇所述的那样,然后针对性地学习,并深入钻研。

扩展阅读:

欧美3A游戏公司的游戏设计与制作——jiayangyang

北美游戏业入行门道和从业体验——AvatarYe

想要自己做一款游戏,需要学习哪些知识?——窦月汐

这里是知乎专栏第二篇文章:。我是窦月汐。如果你是第一次看到本专栏,建议你跳转到自学游戏开发关于本专栏进行了解。如果这篇文章和本专栏对你所帮助,希望你在看到其他游戏人需要帮助时也能把本专栏推荐给他,向每一个游戏人致敬。

我公开了我的一个兴趣交流群,群号为:474891082。

是时候尝试解决这个终极问题了。

玩游戏很浪费时间但为什么那么多人沉迷其中?

玩游戏是浪费时间吗?

玩游戏真的浪费时间吗?

为什么很多人觉得玩游戏浪费时间?

我想打游戏,但觉得那很浪费时间,怎么办?

知乎上这类的问题多得都可以谱上曲子唱出来了。

那天看到@延静斋孙回答:

人活一辈子最终都要死,到底干什么事不是浪费时间呢?

看得我也是一笑,

瞎说什么大实话呢。

这么说话吓到小朋友多不好呀。

实话就要慢慢说。

1

“XX是不是浪费时间”通常对应着“XX有没有用”这样的问题。

玩游戏有没有用?

看艺术有没有用?

上知乎有没有用?

通识教育有没有用?

撸管有没有用?

...

而一般的回答都从有啊有啊有用啊出发,

艺术可以陶冶情操,可以装逼,可以让你与更多人谈笑风生;

游戏其中有很多的历史、地理内容,可以丰富你的知识;

游戏还可以锻炼你的手眼协调能力,提高智力;

但是其实这都不过只是拿一些附带的次生品来强行回答罢了。

何不就大方地承认:

玩游戏没有用!

卵用都没有。

2

所谓“没有用”,指的通常就是其要达成的目标没有意义。

很简单,

比如你把一堆书从书架上拿到地上再拿回去;

比如说你和朋友约定看谁可以单脚站得久;

比如你捧着自己的大脸对着窗外发呆;

...

在一般人眼中,它们当然比不上:

参加一次劳动,

参加一次实习,

努力工作,

认真刷GPA,

等等。

因为前者并不能有什么“成果”,

而后者这些“有用的东西”总是更有收益。

如果困难的活动如此美好,必定是指向某种目标:挑战是目标的达成。

但是问题在于,

如果目标本身是好的,那么追求过程的重要性就会被忽略;

一旦成功了,这个活动也只是被赋予工具性价值,或被视为好的手段。

这种生活需求层面的价值会妨碍我们注意到这件事本身所具备的价值。

我们可能会忘记本该在和朋友游戏过程中的欢声笑语;

我们可能会忘记看书过程中宁静的灯光和纸张的触感;

我们可能会太执着于追求生活的富足而忘记了自己当下就正在活着;

所以,

当某件事目标没什么用的时候,做这件事的选择就会让其本身的价值凸显出来。

那么,是否存在完没有用的东西?

是否存在一种完没有“生活需求层面”目标的事物呢?

好让我们可以专心着眼于事情本身的价值呢?

有,那就是游戏。

在游戏中再清楚不过了,游戏的目标不具有内在价值。

RogerCaillois在开篇就说:

Ilévoqueuivitésanstrainte,isaussisansséquencepourlavieréelle.Ils‘opposeausérieuxdecellecietsevoitainsiqualifiéeffet,lejeuneproduitrien:nibiensnioeuvres.Ilestessentiellentstérile.

游戏是一个没有强制性,但是同样于现实生活没有任何结果的活动。它与严肃相反,被视为“无聊的”...实际上,游戏什么都不产出,没有好处也没有作品。它就是完无用的。

哲学家ThosHurka也在一书的导读中提到过:

游戏的前游戏目标,比如跑过跑道,把高尔夫球放洞里,这些东西本身都是微不足道的。

对于游戏,目标理应是不重要的,

这种“不重要”正是游戏的价值所在。

所以就很清楚了,

就如对于现代电子游戏,得到某些游戏内的数值,达到某个段位,拿到某些五星御魂,刷刷到多少多少级这些目标其实根本就是微不足道。而废寝忘食,醒悟过来后发现这些目标对现实没有任何价值。

明知道其实微不足道,但是我们却依旧去追求,这样的原因很多。

最基础的原因就是大脑其实分不清楚现实的奖励与虚拟的奖励,虚拟和现实的奖励对于人类7万岁的大脑来说是一样的;而游戏中的奖励大部分都是被设计好的,简单而廉价。

不管我们是如何沉迷的,我想说的是:

我们错了。

这种对待游戏的方式是本末倒置的,

错把游戏的目标当做游戏的目的只能不断地扼杀游戏的乐趣,

因为这时候的你将游戏当成了工作。

3

再让我解构一层吧。

为什么我们会认为“事情一定要有结果”或者“事情的结果才重要呢?”

演化心理学提供的观点是:

即使到现在,我们的大脑和心灵依旧是以狩猎和采集的生活方式在思维,这个世界还牢牢地在我们的脑袋中。就像即使现在甜食如此泛滥,我们还是如甜食稀缺的石器时代时的人们一样,保留着想要大口吃下高热量食物的某种欲望。

即使在这个并不会轻易饿死的、生物性贫穷已经得到基本解决的环境中,我们依旧保留着一种渴望不断囤积,不断工作得到积累的思维,当然这一种思维也有可能是在农业革命后养成的。

用式的文化人类学视角来看:

所谓形塑我们价值观的、让我们觉得有用、无用的衡量标准的不过是文化罢了:

资本主义发展带来的资本主义伦理与消费主义,

帝国崩溃后形成的新型民族主义价值,

...

林林总总。

这并不是谎言,而是一场想象,

而这种想象塑造了我们的价值观,我们的欲望,

我们在文化之中生活、呼吸、感受着悲喜,

这是不可避免的。

在这样无对错或绝对价值的文化中:

我们对生活所赋予的任何意义,其实都只是错觉,本质上都完相同,没有高下之分。所谓的快乐很可能就是“让个人对意义的错觉和现行的集体错觉达成同步而已。”

所以我们不需要用大众文化的价值观去衡量“玩游戏”这一件事情的价值与否,我们只需要自己认为有意义就足够了。更何况如今的消费主义让我们这群Stea手党也生发出一种庞大的群体文化,并且不断发展,在这样的文化之中,社群和意义皆有。

在某种意义上,

真正热爱游戏的人,往往是最不功利的人,

也往往是最不会为各种功利主义的考量所影响的人,

他们是自由的人。

4

所以可以下结论了。

玩游戏是不是浪费时间?

这取决于你。

如果你玩游戏的时候:

认为游戏内的目标是最重要的,并且始终被其牵着鼻子走,那么你在浪费时间。

如果你觉得游戏对你没有意义,那么你在浪费时间。

5

所以,

我们应该怎样对待游戏并且保持一个良好的游戏态度呢?

首先,认识到游戏就是无用的。

游戏的价值只在其过程,所以只需要尽情地享受游戏的过程就好。

不要因为多巴胺或者是某些廉价的反馈而沉迷,

也不要因为游戏目标很诱人而被目标所牵引,走向工作式的劳动过程。

其次,认识到自己玩游戏是自我的选择。

玩游戏并不是对于现实的逃避,

并不是对自己反馈系统的妥协,

玩游戏就是自我自由自愿的选择

只要你觉得游戏之于自己,现在比其他东西有意义,那么现在就去玩就好了。

6

在这个社会中,密密麻麻的人挤着嚷着,寻找着自己的价值和意义,

常有人自大地宣扬自己的价值并且用其衡量他人,

形成各种社会的“主流价值”,

让那些本来有自己价值的人们都开始质疑自己,

甚至不得不为此伪装或者强行改变。

但是人都是要死的,

对于不走向佛教的我们,

用自己能找到意义的方式

活过,笑过,哭过就好,

就让你的悲喜自然地绽放和舒展。

参考书目:

1.尤瓦尔·赫拉利:北京:中信出版社,2014年。

2.伯尔纳德·舒兹:,自己截的。

5.本来之前的文末有一首诗,想想删了。但是还是列出名字:byRupertBrooke杨宪益译这个答案末尾可见

参考文章::

劝君莫再谈“游戏”

如何挽救沉迷守望屁股的玩家

写在卸载之前

游戏与人文

个人主页:@叶默哲

想法创意都有了,就差一个程序员了?有没有想过:也许你配不上一个程序员。

成为一个独立游戏开发者,我认为他自己首先应该成为半名程序员。

这里是知乎专栏,在上一篇文章中,我们已经概览了一个大型游戏的开发过程。但是由于程序方面的内容不便可视化展示,所以那篇文章主要是展示了设计和美术制作流程。现在我们需要来讲一讲的程序方面的事情。首先,我们需要认识到:

1、掌握编程技能的重要性

如果你想成为一个独立游戏开发者,不会编程几乎是不可能的事情。就像一个厨师不会用刀案锅铲。“电子游戏”是一个什么?我们这里不谈玩法设计,它的物理本质就可以说是一个计算机应用程序。开发游戏其实就是开发一个程序。而开发程序的过程,我们把它叫作编程。只有学会了编程、掌握了一款游戏引擎,我们才会真正明白:游戏,作为一款软件来说它的本质是怎样的,它是如何运作的。你不知道汽车是如何工作的,你就制造不出一辆车。了解程序,就是了解游戏在电脑上工作的原理。掌握这些知识,不单单是程序员的立身之本,也应该是每一位游戏设计者的基本素养。再者,如果你从未接触过游戏开发,现在开始学习任何其他游戏开发知识,你是不可能在两个月之内自己动手制作出一款可玩的游戏的。但是,你学习编程与游戏引擎的使用,你便能做到。群友真实经历,@小小故事汇在我的引导下从职业厨师开始学做游戏,经历两个月的学习之后已经能够独立做出“飞机大战”那样可玩的小游戏了。你若学习美术、或是“设计”,这都不可能实现。这是编程的强大之处。

作为一个专职的“游戏设计师”,并不是只会拍脑袋出主意就行了。我认为一个合格的“游戏设计师”至少应当能够编写逻辑脚本,把自己设想的主意用代码实现出来,不要把任何细小的事情都塞到专业程序员的待办事项里。职业的程序员会为设计师提供底层的服务,让设计师不用操心计算机底层的事务,只要把精力放在游戏逻辑本身上。事实上,现在各大游戏引擎的设计思路都是如此,比如UnrealEngine4强大的Blueprint系统和GINE推出的Flograph和Schetyc系统,都是为设计师们服务的,让他们不用敲任何代码就能编写出基本的游戏逻辑。为了让设计师们能够自己动手丰衣足食,程序员们已经做出了许多努力,想成为设计师的你,有什么理由不学习一下基础编程呢?千万不要想:程序的事情就交给专业的人来做吧。“我”就不需要学了。这种人,就是那种常常说“就差一个程序员了”的人;这种人,也常常是那种只会空想,给团队制造试错成本的那种人。因为他们不懂程序,但要让别人来为他的想法买单。他们不知道他们临时冒出的一个“好主意”可能要让一整个团队忙活好几个月。所以,我建议,每一个想要成为游戏设计师的朋友,都接触学习一下编程。

你只是想静静地画图,做一个安静的美术人员?如果你只是想平静地度过这一辈子,顺便在游戏制作领域出一些力,贡献一些艺术力量,那么你只需要专注于升华自己的艺术上限就好了。如果你想对这个领域搞点事情,比如说优化一下美术资源的制作流程,提升游戏画面的行业标准,那么你就不能只是会用Photoshop画画图、用3Dsx建建模,你需要知道Photoshop这款软件是怎么被开发出来的,它的每种图层混合模式采用了什么算法,这些算法用代码如何实现,如果我要扩展它的调色盘功能应该从哪里开始编写。一个能回答这些问题的艺术家,和一个只会用PS画画的艺术家,对于工具的理解是完不同的。而前者,更有可能推动整个数字绘画领域向前步进。为什么那些艺术创作软件都出自于国外的开发者呢?开发一款艺术创作软件,不仅需要专业的程序员,更需要具备编程素养的艺术家们来领导。而我国的艺术从业者们,有几个具备扎实的编程能力?而往往一说到这些,那些“大师”们就会开始贬低工具的重要性,转而强调艺术本身。从“从艺动机”层面,许多选择艺考的人其实就是因为文化成绩太差;从思想层面,几乎少有艺术家会想去改进他们所用的工具。如果你不是这样的人,如果你想要成为一个推动数字艺术领域进步的人,有机会的话,你就应当认真了解一下计算机的世界。另外,回到游戏美术本身,一个游戏最终如何展现你画的图、你做的模型,这完是由渲染管线和Shader脚本来控制的,这些都是代码写出来的。所以你认为游戏美术只是画画?那只是其中的一个小环节。当然了,说这些只是希望你能对游戏美术具备更多的认识。至于初学,我还是不会给你徒增痛苦让你去学编程的。别紧张,从窗户上下来吧朋友。

包括做音乐也是,现在编曲软件之强大,无不是具备音乐素养的程序员们的功劳。奥巴马说每一个现代人都应该学一下编程,不是随便说说的。写到这里,我希望每一位读者都已经在心里提升了掌握编程能力的重要性。

在后文中,我们开始来认识一下计算机与编程的世界,再之后是编程与游戏制作的关系,最后是编程学习路径。我会力图让每一个高中生看到下面的文字时也能够理解我在说什么,你不用具备什么前置知识,嗑着瓜子顺序看下去便好。

2、计算机与编程的世界

是先学C还是C?还是JAVA?还是Python?还是Unity?还是OpenGL?首先你都知道这些是什么吗?每一个想学游戏编程的人都经历过这样的问题:入门编程语言该学什么?我在知乎问答想要自己做一款游戏,需要学习哪些知识?中明确说明了先学ity。但是仍然有无数人私信问我到底该先学C还是C。这不是因为他们没有认真看我的回答,而是他们不知道为什么要这样安排,以及很多其他前辈建议他们要先学这样或那样。道听途说,只言片语的回答是解决不了大家心中的困惑的,因此在本篇文章中我想为大家介绍一下计算机和编程语言的世界,这可能会花费一些功夫,因为从来没有人能够在一篇文章的篇幅内完整地介绍整个计算机的世界。我也只能尽力尝试,让大家了解那些语言各是什么,之间是什么关系。在此章节完成之后,我再会解释我们学习安排是如何设置的。

请注意,我现在要开始装逼了:这件事情如果要溯源的话最早可以追溯到亚里士多德开创出“逻辑学”;19世纪的乔治·布尔在此基础上发展出“数理逻辑”;20世纪克劳德·艾尔伍德·香农在“数理逻辑”基础上发展出“逻辑电路”。“逻辑电路”就包括了我们高中所学的:继电器、与门、或门、非门、异或门等等。利用这些工具,我们就能够制造出会计算加法、减法的逻辑电路。我们得到了会计算的逻辑电路,又经历了一系列的升级和优化,那么现在我们的计算机是如何运作的呢?首先可以分为两个层,一层是CPU存储器的电路实现,一层是0与1的世界。如果我在这里讲电路设计的问题,我想很多只是单纯想做游戏的人可能会疯掉。有一本很好玩的书,叫,作者以闲谈扯淡的方式,从电与磁的发现一直讲到了CPU的实现,作为计算机硬件入门是一本不错的兴趣书。关于硬件,我们业余选手可以不用知道那么多,只要知道:CPU会执行我们的一些命令,我们的命令是存在“存储器”里的0101010110101001010…这样的数字来代表。

作为常识我们知道,计算机只认识0和1,那么我们就来看一下它是如何运用0和1来工作的。

汇编:

请注意为了方便讲解我就自己创造例子了,可能和实际情况有出入,但是更容易帮助理解。先看一下这一行代码:

000000010000110000001010

看不懂?普通人类当然看不懂,但是机器看得懂,而且机器就只能看懂这种形式的信息。这个叫做机器语言,也是二进制码。二进制码是构成如今计算机世界的基础,我们电脑里的任何文件、应用程序归根结底的都是以二进制码的形式存在的。比如:我们常常能够在电脑的文件夹里看到这样一个文件夹:

这其中“Bin”就是单词“Binary”的缩写,意思是二进制文件。打开bin文件夹,xe和.dll文件。对于我们来说,.exe就是一个应用程序嘛,比如说:xe、xe。

大家难道没有好奇过:为什么应用程序的的后缀是“exe”呢?原因:“exe”是英文词组“ExecutableFile”的缩写,意思就是可执行文件。“可执行文件”的意思是:可以被CPU执行的文件。我们前面说过,CPU只能执行0101001这样的指令。所以“可执行文件”其实就是这种指令的集合,也就是是一堆二进制码“0000111101010011001001100000111101010011……”。所以它才会常常被放在bin文件夹里。

我们玩的每一个游戏,它们的本质都是这样的二进制文件。所以编写一个游戏,其实最终最本质就是编写出这样的文件:0101010101110010101010101001010101……可是……

我知道这也太特么为难人了!鬼看得懂这些01是什么意思啊!但没有办法,现代的计算机只能识别这种简单的机器语言。为了让这些机器语言更容易被我们人类所理解,先驱们发明了汇编语言。但其实汇编语言很简单,有了汇编,我就能跟你解释前面的0011是怎么回事了。再来看之前的那行代码:

000000010000110000001010

请注意这不是一串随便瞎写的0和1,它是有规律的!你们看,以八个0或1为一组,每组中间有个空格。这其中,每一组我们叫做一个“字节”,每一个0或者1,我们叫做一个“比特”。第一个字节:00000001,假设我们规定,它代表一个命令:加法。我们再规定,如果CPU遇到“加法”命令,它就把后面两个字节相加,把结果存到前一个字节所在的地方。于是我们的CPU就能够计算加法了。规则是给它这三个数:

第一个是表示加法命令的“00000001”,第二个A和第三个B是两个加数,每次都不同,所以我用x表示那些比特位。同样的道理我们能够制定出减法命令、乘法命令、复制命令等等。比如复制命令:我们规定“00001111”代表复制命令,如果CPU遇到“00001111”,它就把后面第二个字节的数据,复制到后面第一个字节的数据所表示的位置上。于是我们就有了复制数据的功能了。

这些功能,都是CPU中的逻辑电路为我们提供的,我们只需要发送规定好的指令便能使用这些功能。注意,指令的本质是一串0和1代表的信息,但是我们很难去记忆和区分00010011和01001101这样的数字,所以我们就用“ADD”代表00000001,用“COPY”代表00001111。Add和Copy在英文里本来就是加和复制的意思,这就很好记。而“ADD”、“COPY”等这些指令集合起来就形成了汇编语言。它实际上就是把机器语言直译成了英文单词。一般CPU认识的指令不多,就那么十几个。所以汇编语言中的指令一一对应也不多,大致分为三种:

数据传输类:复制、加载、存储……算数/逻辑类:布尔运算、加法运算、自加运算……控制类:转移、停止……