MetalCore for WebAssembly

用了一周时间,将 MetalCore 引擎移植到了 WebAssembly,实现了对 html5 平台的支持。

什么是 WebAssembly

简单的说就是一个可以让C++开发的程序在浏览器中运行的技术,从而实现高效率运行和现有项目移植的需求。目前大部分浏览器都已经不同程度的实现了对 webAssembly 的支持,这也是web 应用的一个发展方向。编译之后的 wasm 文件是二进制的,具有体积小、运行快、不可读等优点,技术成熟后,将会在 web 端出现大量的桌面应用。

如何移植现有的C++项目

通过 emscripten sdk 可以对 c++代码进行编译,sdk 将大量的 html5 接口进行了封装,同时还在 webGL 的基础上模拟了 OpenGLES2 和 3的图形接口,在 webAudio 基础上模拟了 OpenAL 接口。在移植时,只需要将对应的接口函数进行调整即可,总的来说,基本没什么大问题,很容易移植。具体可以参考 http://kripken.github.io/emscripten-site/

注意事项与发现的问题

  • C++中文件操作都是同步进行与 js 中的异步方式不同。emscripten 实现了同步文件操作机制,但需要将所有外部文件进行打包,并预加载到客户端,然后才能进行类似本地文件环境中的文件操作。这个过程有点缓慢。如果文件包过大,还可能引发手机端浏览器的内存不足异常。
  • 将相同的工程分别编译成 app 和 webAssembly 进行对比,渲染效率上,webAssembly 明显差很多。
  • 不同的浏览器存在差异,导致一些问题。比如 window.resize 事件,在微信 ios 版本中就无法从事件中直接获取到正确的窗口尺寸,导致画面变形。需要添加定时器进行处理。
  • iOS 版本中的微信浏览器和 safari 都无法播放出声音,而其它平台都是正常的,这个很奇怪。
  • WebAssembly 将应用封闭在一个独立的运行环境中,虽然可以直接调用 js 语句,但仍然造成一个很大的问题就是应用无法享受到一些浏览器本身的功能,比如字体、mp3 音频、图片格式解读甚至视频播放等,这些都需要在应用内部进行实现,比如需要包含 freetype、png、ogg 等函数库,应用的体积一下子大了很多。
  • 再一个很麻烦的问题就是调试非常不方便,暂时不能实现断点等功能。

总结

总结一下,我们发现目前来看,webAssembly 技术的问题比优点多,哈哈。暂时还无法运用到实际项目开发中,但我仍然希望这项技术能够更快的推进。

题外话

苹果公司又开始走上自我封闭的道路,下一代的 macOS 和 iOS 系统中都开始排斥并逐步抛弃 OpenGL 了。强推自己的 Metal 图形库。微软虽然一直在搞 DirectX,但并没有屏蔽第三方驱动中提供的 OpenGL 和 Vulkan 接口。苹果的这一做法相当的不地道,哈哈。

MetalCore
2018-6-12
  • {{comment.name}}{{comment.time | fDateTime}}

    • {{reply.name}}{{reply.time | fDateTime}}

Recent Articles

Recent Comments