作者:小玉 链接:https://zhuanlan.zhihu.com/p/19974794 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 随着Unity5.0的发布,WebGL平台的部署也正式登场(目前还处于Beta状态)。WebGL是一项利用JavaScript API呈现3D电脑图形的技术。区别于其他需要浏览器加载插件的形式(比如Flash和Unity的Web Player),通过使用WebGL技术,我们只需要编写简单的网页代码即可以实现3D图像在浏览器中的展示。使用WebGL的好处是显而易见的:在玩游戏之前无需下载任何插件,打开浏览器,输入游戏地址,就可以直接进行游戏了。而且WebGL的这套JavaScript API透过浏览器直接和系统的显卡打交道,效率也可以得到保证。 WebGL在Unity中的实现 具体到技术细节,WebGL在Unity中是通过IL2CPP,Emscripten和asm.js这几大关键技术来实现的。
- IL2CPP:将脚本代码翻译成C++代码的模块。具体细节在上两篇有详细的讨论(、)这里直接略过。
- Emscripten:将编译后的Byte Code翻译成Javascript,通过这个步骤以后,代码就可以在浏览器中直接运行了。虽然Emscripten大多数情况下是翻译c/c++的代码(在Unity中的使用情况就是如此),但是它也可以接纳任何由符合LLVM标准的编译器生成的其他语言的Byte Code,将其转换成JavaScript。
- asm.js:相比前面两个模块,asm.js是最有趣的部分。也是Unity用来保证WebGL游戏运行效率的关键。他的主要作用就是对Javascript进行优化!提高JavaScript在浏览器中的运行效率。后面我们就具体的讲讲asm.js是如何做的。ASM.JS这次我们先直接看代码比较:先来个简单的C代码:
int f(int i){ return i+1;}
function f(i){ i=i|0; return (i+1)|0;}
size_t strlen(char *ptr){ char*curr = ptr; while(*curr !=0){ curr++; } return(curr-ptr);}
function strlen(ptr){//calculate length of C string ptr=ptr|0; var curr=0; curr=ptr; while(MEM8[curr]|0!=0){ curr=(curr +1)|0; } return(curr-ptr)|0;}
function MyAsmModule(){ "use asm" //module body}