两年前我在博客上推荐了 《人力资源机器》 这款游戏,时隔一年半,原班人马在 2018 年再度发布力作《70 亿人类》(7 Billion Humans)。虽然名字看上去大不一样,但画风还是核心玩法都还是一样的味道,只不过这次编程面临着更大的挑战:你不再是为一个人编程,而是为一群人编程!
游戏介绍
在游戏中,玩家只有一个人,和游戏的交互方式就是在右边的程序框里用一些极其简单的指令编写程序,比如从地上捡起一个数据块、向一个方向移动一步等等。而游戏的目标则每关都不同,比如把所有的格子都放满数据块、或者把小于 50 的数据块都销毁掉。如果所有程序都执行完毕,游戏会检查数据块的摆放是否符合关卡要求,符合则通关,否则不通关。
这款游戏更像是功能游戏,玩的时候其实跟程序员写程序一样,可能会有点痛苦。但是它用一种更友好的方式来展现计算机的一些基本的运行原理,让一些不是学计算机的玩家也能体会到编程的感觉,甚至说不定就让玩家正式踏入了编程的大门。可以说,我就是受这款游戏启发,去学习了着色器编程。
如果你玩过《人力资源机器》 ,你一定不会对游戏界面感到陌生,但是会有一点惊讶。如果说《人力资源机器》是为 CPU 编程,那么《70 亿人类》就更像是为 GPU 编程——每个人执行的都是同样的程序。就这一个小小的改动,可能会使编程的难度直线上升:如何让同样的程序执行得到不同的结果?怎么保证程序之间不会互相冲突?更难的是,我们怎么调试程序?
还好,游戏提供了一种机制,能让我们在运行的时候单独观察每一个人的执行状态:
地上的洞则为游戏带来的更大的挑战:如果一个人掉进了洞里,那你就少了一个运行的程序(也就是崩溃了)。要是所有人都掉下去了,游戏则会直接宣告失败:
哪怕你写好了程序有惊无险地通关了,还有两个更大的挑战等着你:把程序写短、写快。
当然很多时候这两者是矛盾的,不可能同时达成,所以有可能需要玩家写出不同的程序来达成挑战。在选关界面也能看到自己完成了哪些挑战:
就像《人力资源机器》 一样,游戏用一种直观的方式教育玩家计算机的工作原理:就是让硬件执行一些非常简单的指令。然而就是这些简单的指令构成了强大的计算机软件。
而这款游戏个人感觉更像是告诉了玩家 GPU 的工作原理,GPU 中有许多小型的计算单元,它们的计算能力远远不如 CPU,甚至不支持逻辑运算,只支持算术运算。但是,人多力量大,只要精心编写程序,就能实现令人惊艳的效果。
GPU 中的着色器就是这样的原理,每个着色器都并行地执行一样的程序,只是输入有所不同,而且着色器只会做算术运算,所以运算速度特别快。就像下面这个神奇的隧道效果,就是短短一百多行的程序实现的( https://www.shadertoy.com/view/4lcGWr ):
而让程序写短,则是为了节省计算机的内存,让程序跑得快,则是带来更好的体验。想象一下,或许你能接受安装一个几十 GB 的大游戏,要是一个游戏卡成 PPT,你还会去玩吗?
如果你也想学习着色器编程,可以看看:https://thebookofshaders.com/