高马尔
一个信息发布的网站

《动物井》为什么只用33Mb?开发者在GDC上说,还可以更小

今天小编(甄正浩)要和大家分享的是《动物井》为什么只用33Mb?开发者在GDC上说,还可以更小,欢迎阅读~

独立开发的独特魅力。

作为去年独立游戏届的 " 双璧 ",《动物井》和《小丑牌》两款游戏有一个共同之处,那就是都是由一人开发者独立完成的优秀作品,两位开发者之间也多次 " 商业互吹 "。

前几天《小丑牌》的开发者 Localthunk分享了自己游戏开发的时间线,回顾了游戏开发的过程,而在近日的 GDC 游戏开发者大会上,《动物井》开发者 Billy Basso 也做了一场有关游戏开发背后的分享。

在《动物井》开发过程中,Billy Basso 曾在 Blog 上记录过一些游戏开发的过程,上线之后也接受过一些采访,所以这次的 GDC 分享并没有太多关于开发理念的内容,而是更专注于技术层面的探讨,他的主题是:《Developing at 5MB/Year—— The Making Of ANIMAL WELL》。

相信每个玩家都对这款现代游戏(PC 版本)只有 33M 感到惊讶,Billy Basso 的这个分享就对此进行了揭秘。

《动物井》于 2017 年开始开发,最初的计划只是一个时长 1 小时、耗时 6 个月完成的小型游戏,不过最后耗费了 Billy Basso 7 年的时间,内容丰富度自然也大大提升。在游戏开发的前 4 年里,Billy Basso 还有一份开发医疗模拟軟體的全职工作,直到 2022 年 1 月,Basso 辞去了这份工作专注于开发《动物井》。

结语

在演讲的开始,Billy Basso 坦言过去曾参与过多个大型游戏团队的项目,但始终未能拥有 "属于自己的游戏" 并最终完成,因此开发《动物井》的首要目标是选择一个他 "100% 确定能够发布 " 的项目。为了顺利完成这个目标,他在开发过程中做了很多的自我限制,只使用自己熟悉的技术,比如为了确保项目能够完成,他决定不采用新技术或复杂的 3D 建模,而是专注于自己熟悉的 2D 像素艺术,在引擎和开发工具上也是如此。

《动物井》的一个独特之处就是没有使用 Unity 或虚幻等常见的商业引擎进行开发,而是 Basso 基于 C++ 自行开发的游戏引擎,这需要自行处理大量底层工作,包括内存管理和资源加载等,但是也让他能够完全掌控游戏的各个方面,避免了与第三方合作的麻烦,同时也满足了他构建和理解底层系统的乐趣。

Billy Basso 介绍了自己使用的开发工具,没有任何复杂的技术工具:

使用Visual Studio 2019用于代码开发:

构建了自定义关卡编辑器,支持类似《超级马里奥制造》的瓦片绘制模式和世界地图的拖拽式构建。

使用Sprite进行像素艺术创作,并对其进行了修改,以支持自定义的动画格式和导出。

使用Reaper进行音频处理。

使用Notepad做文本设计与任务追踪。

自定义关卡编辑器有三种主要模式:

螢幕编辑模式:类似于《超级马里奥制造》的风格,可以在调色板中选择游戏中的精灵并进行绘制,创建游戏中的一个个螢幕。每个图块可以代表一种实体类型,从而在螢幕中生成可移动和更新的游戏对象。

世界构建模式:允许开发者将创建好的一个个 " 螢幕 " 拖拽组合成游戏的世界地图。最初,世界被限制为 16x16 的网格,因为每个房间都有一个单字节的 ID,最多只能有 256 个不同的房间。这个限制其实也是 Basso 有意为之,他希望通过约束来推动更具创意的设计,最终尽可能地使每个房间都内容丰富。

精灵图集编辑模式:最初 Basso 是直接在 C++ 檔案中硬编码精灵在图集中的 UV 坐标,后来他创建了一个自定义的精灵编辑器,可以直接在精灵周围绘制选框,并設定如碰撞、是否为泥土等标记。尽管如此,他最终还是实现了一个自定义的精灵打包工具(Sprite Packer),这是行业标准的解决方案,可以将檔案夹中的所有精灵自动打包成图集,但他最初的硬编码方式仍然保留了一部分。

在动画方面,Basso 表示他使用軟體Aseprite进行像素动画的制作,并且修改了 Aseprite 程式本身以便导出他自定义的二进制动画格式。他不希望在游戏中使用任何文本字元串,以防止数据挖掘,并且认为解析 JSON 会涉及动态内存分配,这也是他想要避免的。他的动画格式是以帧和图层的数组形式存储,可以在运行时快速循环播放并根据画布偏移量进行绘制。此外,他还编写了大量的过程化动画函数库,用于创建各种形状和效果,应用于游戏中的许多生物。

对于游戏中让玩家印象深刻的视觉效果和光照,Basso 表示没有采用单一的着色器,而是使用了约50 个小的独立技术,在演讲中介绍了他以其中几个技术举例进行了介绍。

动态阴影:通过在螢幕空间中使用光点数组,并对周围的图块进行相交测试,然后将生成的阴影遮罩渲染到大的精灵调色板上,再进行模糊和抖动处理,最终与场景进行叠加。他还实现了不同图层之间投射阴影的效果,通过将不同的游戏图层渲染到单个渲染目标的不同颜色通道中,然后在渲染背景时采样前景或中景来判断是否需要投射阴影。

边缘光照:通过对前景图层进行简单着色并模糊处理,然后根据设定的阈值来决定哪些部分需要着色,从而增强了平台和墙壁的对比度。同时虽然是 2D 游戏,但 Basso 后期为背景添加了手工绘制的法线贴图,以提供更具方向性的光照效果。

水体效果:每个螢幕都有一个定义水位线的单字节变量。渲染时,先正常渲染螢幕,然后进行第二次渲染,将相同的内容颠倒并扭曲(使用正弦波数学),并在底部逐渐淡化。

流体系统:《动物井》实现了一个复杂的 2D Navier-Stokes 流体模拟,用于烟雾、水花等效果。Basso 表示这个技术所采用的算法原理和实现方法并不是什么前沿技术,而是可以追溯到2004 年出版的技术书籍《GPU Gems》上,需要多个渲染目标和着色器,通过速度和压力的相互作用来模拟流体运动。

而在资产管线方面,《动物井》的所有游戏资产在离线状态下都被转换为 C++ 头檔案中的字节数组,并直接包含在代码中,这意味着游戏运行时不需要进行檔案 I/O,所有的内容都直接加载到内存中,从而实现了极快的加载速度。这种方式也方便了资产加密,Basso 使用 AES 加密离线加密资产,而解密密钥则与玩家在游戏中解决的谜题相关联。

Basso 最后概括总结了游戏为什么只有 33MB 这么小的原因,并且表示还可以更小:"如果我知道人们会如此印象深刻,我可能会更加努力地缩小它"。

自研引擎,所以没有第三方库冗余。

低分辨率像素艺术,纹理尺寸极小。

音频压缩和稀疏的音乐使用。

大量动态生成内容,提高资源利用率。

无文本内容,尽可能使用二进制格式。

通过这个分享我们可以看出,33M 的游戏檔案大小也并非是 Basso 刻意的追求,而是其技术选择和资源管理策略的自然结果。通过限制范围、专注于已知技术、自制工具和拥抱实验性的方法,Bily Basso 成功地完成了这样一个独特且充满创意的游戏,而从最初对熟悉技术的坚持,到后期对复杂效果的探索和对游戏体积的极致优化,也都体现了独立开发的独特魅力。

>

关于《动物井》为什么只用33Mb?开发者在GDC上说,还可以更小就分享完了,您有什么想法可以联系小编(甄正浩)。