浏览器中运行3D游戏的思考

Web技术突飞猛进,几乎无所不能,无所不在。然而在3D游戏领域,web技术乏善可陈,性能瓶颈问题制约其发展。但是开发者们没有放弃这个梦想,不断努力,孜孜不倦地改进和增强浏览器中运行3D游戏性能的方法和技术,目前已能看到一丝曙光。

对C/S架构的3D游戏而言,渲染和计算通常都在客户端,服务器端负责用户状态的管理和分发。同样对B/S架构的运行在浏览器中的3D游戏,所有的渲染和计算也应该在浏览器端。如果渲染和计算放在服务器端,将导致可怕的延迟,并严重损害3D游戏的可伸缩性。

当前很多3D游戏使用C/C++语言编写,如果能够将C/C++语言编译成JavaScript语言,可大大促进Web 3D游戏的开发。而编译器项目Emscripten正是一个这样的工具。它能将C/C++代码编译成一种叫做asm.js的Javascript变体。需要指出的是,Emscripten的输入,即C/C++代码最好是开放源代码的,因为Emscripten不支持闭源代码的编译。例如Emscripten不支持mfc程序的转换,因为mfc是闭源的[4]

asm.js是一个JavaScript的严格子集,它只提供32位带符号整数和64位带符号浮点数两种数据类型,其他Javascript类型如字符串、布尔值等以数值形式存在,保存在内存中,通过TypedArray调用。另外asm.js没有垃圾回收机制,所有内存操作都由程序员自己控制。asm.js是优化后的JavaScript,它在浏览器中的运行速度大约是原生代码的一倍左右[1]

asm.js虽然比原生javascript运行速度快了一倍左右,但是相比C/C++代码,运行速度还是有差距。幸运的是出现了名为WebAssembly的技术。WebAssembly或称wasm是一个实验性的低级编程语言,应用于浏览器内的客户端[5]。WebAssembly是便携式的抽象语法树,被设计来提供比JavaScript更快速的编译及运行。WebAssembly将让开发者能运用自己熟悉的编程语言(最初以C/C++作为实现目标)编译,再藉虚拟机引擎在浏览器内运行。WebAssembly的开发团队分别来自Mozilla、Google、Microsoft、Apple,代表着四大网络浏览器Firefox、Chrome、Microsoft Edge、Safari。2017年11月,所有以上四个浏览器都开始实验性的支持WebAssembly。目前,最新版本的Emscripten已支持将C/C++代码编译成wasm。

参考文献

  1. http://www.ruanyifeng.com/blog/2017/09/asmjs_emscripten.html. by 阮一峰.
  2. https://www.cnblogs.com/slly/p/6639173.html. by 李某龙.
  3. http://kripken.github.io/emscripten-site/. by emscripten.
  4. https://github.com/kripken/emscripten/issues/941. by emscripten.
  5. https://zh.wikipedia.org/wiki/WebAssembly. by wikipedia.