用WebGL实现Game of Life
最近有些空闲时间,于是打算开始造轮子计划,正巧在进行GPU加速最近,就写了一些小项目来练手。顺便进行了诸多的GPU加速实验。其中之一就是Game of Life也就是生命游戏,wiki页面在此,就不赘述介绍了。
Demo与Code
使用方法很简单,滚轮缩放,拖动复活cells。纯WebGL,没有任何第三方依赖。
优化
做完初版后放在我的iPhone5上的Chrome打开后发现FPS只有非常蛋疼的7。
于是开始对Fragment Shader进行优化。于是在做了若干次实验后得到以下结论,也算是验证了以前一直听说但是从未确认的事实:
- 虽说
for
循环在编译期会进行优化,但是如果使用For
循环嵌套条件判断的话,fragment shader会变得很慢。去除这种使用方法后,FPS从7上升到了20~30左右。 - 尽可能使用
varing
传递来的参数,换句话说是把更多的计算集中在Vertex shader
进行,最开始使用了Fragment shader来直接计算邻居位置。也就是对8个方向遍历。随后在改用了vertex shader计算后,FPS从20~30上升到了40~50。 - 尽可能不使用
cast
操作,也就是类型转换。这会在这个例子中降低10左右FPS。 - 简单的
if
操作并没有像传闻中那样对性能造成致命打击,但是减少使用是正确的。
其他的未能完全确认的实验结果就不公布了,总之以上的优化都是尽可能为了让fragment shader在更适合GPU千核计算的性质。
浏览器兼容性
截止到目前为止已知的是,Chrome和Safari上浏览正常。百度浏览器FPS相对比较低,QQ浏览器表现异常。
果然是到了有压力的状况下才能看得出浏览器的好坏。XD