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

内容摘要来源:游戏研究社独立开发的独特魅力。作为去年独立游戏届的“双璧”,《动物井》和《小丑牌》两款游戏有一个共同之处,那就是都是由一人开发者独立完成的优秀作品,两位开发者之间也多次“商业互吹”。前几天《小丑牌》的开发者Localthunk分享了自

来源:游戏研究社

独立开发的独特魅力。

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

前几天《小丑牌》的开发者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成功地完成了这样一个独特且充满创意的游戏,而从最初对熟悉技术的坚持,到后期对复杂效果的探索和对游戏体积的极致优化,也都体现了独立开发的独特魅力。

 
举报 收藏 打赏 评论 0
24小时热闻
今日推荐
浙ICP备19001410号-1