WEB-IR,让 Web 玩上原汁原味的 Native 游戏

作者:转载小公举
2018-03-16
7 1 3

我们先看看现代浏览器为游戏都准备了什么?

  • 带 JIT 的 JavaScript 引擎,让 JavaScript 的性能大幅度提升,譬如知名的 Chrome V8引擎;
  • 比 JavaScript 快30倍的现代浏览器可执行代码新贵:WebAssembly(简称 WASM);
  • 让 Web 享受 GPU 加速快感的 WebGL 1/2;
  • 其他的超能力者:实现文件系统的基石 IndexedDB,声音系统的保证 WebAudio,网络系统的金刚:XHR,WebSocket 和 WebRTC。

看起来很美呀,但真相是……

首先我们看看有哪些基于 HTML5/JavaScript 的引擎?

耳熟能详的是 Construct 2, Three.js, Turbulenz, Cocos2D-X, Egret(白鹭),LayaBox 等等,这些都是非常优秀的开源或者专业引擎,拥有足够的开发者,也有很多成功的  Native 作品出现,但是他们作为一个真正能为 Web 开发游戏的完备引擎来说还有些远,主要表现在这些地方:

  • 对于很多算力要求高,视觉体验强的游戏来说,性能满足不了;
  • 视觉特效很有限,譬如对3D 这块支持的都不够好;
  • 不够完备的编辑器功能,这些对于游戏开发者来说挑战太大。


所以我们看到的一个事实是非常有限的 Web 游戏内容(尤其在类型上)基于这些引擎而开发。

我们会看到另一个情况是一些作为事实标准的伟大的工业级商业游戏引擎(像 Unity3D,Unreal Engine 4这样的)在某种程度上也为支持 HTML5/WebGL 做积极的推动,但实际情况又如何?

  • 只能商业化服务于那些游戏资源所需很小的游戏(大马拉小车);
  • 在线(强网络)游戏不被支持;
  • 非常漫长的下载和启动;
  • 而且还总会恼人地 CRASH!

面对现实中的 Web 游戏,这些引擎基本还处在实验室阶段,还不可用,这是为啥呀?


(Unity3D 对 WebAssembly 的描述)

  • 在 JavaScript 模式下这些引擎跑的非常吃力(浏览器跑不动这些大家伙);
  • 这些工业级商业引擎已经支持了 WASM,性能已经足够快了,为啥还是有问题?因为 WASM 毕竟是在浏览器中运行的,加载,初始化的时间还是会很长,而且更加糟糕的是随着代码体量的增加,经常会让浏览器崩溃掉,尤其在那些对系统资源限制颇高的系统(譬如 iOS)或者实现上还有些问题的第三方浏览器引擎(譬如腾讯 TBS X5)来说,有时就是噩梦;
  • 网络游戏多是基于多线程和 BSD Socket 的,而这些 HTML5/WASM 压根就不支持,这也造成了在线网游是无法用 Unity3D 或者 Unreal Engine 4等来实现 Web 化的;
  • 而且不论 Unity3D,还是 Unreal Engine 4都是利用浏览器内存来作为虚拟文件系统的,这无形中必然限制了游戏资源的体量,所以大引擎未必能做大游戏呀!

那 WEB-IR 到底能做啥呢?

啥是 WEB-IR,它是 WEB Intermediate Representation 的缩写,是木鸡科技独家自研的一项基于编译和云的 Web 化技术,它能将原生的游戏快速高效原汁原味地编译成 Web 游戏,而且 WEB-IR 技术与生俱来就是解决这些现实中的问题的:

  • 在浏览器里面可以运行 Giga 级别的大游戏;
  • 那些工业级大引擎做不到的,WEB-IR 把它们一一解决,譬如对于大文件系统,基于 TCP/UDP 的网络,多线程模型,都是支持的;
  • 游戏的下载和启动速度能比之前快一倍;
  • 游戏类型不再受限制。

耳听为虚,眼见为实,让我们看几个案例吧:

几个案例

蛇蛇争霸

非常好玩的一款 IO 类 Unity3D 游戏,这款游戏体量将近200M,这个对于很多浏览器来说有点大,对游览器的内存开销会有挑战,然后最大的挑战来自于这款游戏使用的是 UDP 来通信,对于 Unity3D 原始的 WebGL 输出版来说成为了不可能的任务,而经过 WEB-IR 技术的处理,所有的问题都被自动解决了而基本不需要改动游戏的代码。

王者之役

一款典型的多人在线3D ARPG 游戏,基于 Unity3D 开发,使用了多线程,第三方的通信模块(基于 BSD Socket),Unity3D 的原始 WebGL 输出版无法启动,因为不支持多线程和 BSD Socket,通过 WEB-IR 技术处理后可以在移动端浏览器内流畅运行。

武士 2 复仇 Demo

一款经典的第三人称动作游戏,基于 Unity3D 制作,对显示性能要求较高,对比启动速度来看 WEB-IR 技术处理版比 Unity3D 原始 WebGL 输出版在 Android Chrome 上快近50%,而在 iOS 上 Unity3D 原始 WebGL 输出版因为技术限制直接崩溃了,另外可以看到 WEB-IR 技术对代码体量优化十分明显,原始版需要42.6M,而优化版只有16.6M,极大的减小了带宽占用,流量占用,缩短了下载和加载时间,并且对浏览器环境更加友好。

这一切是怎么做到的呀?

WEB-IR 使用了一种基于云的代码动态生成技术:

WEB-IR 会根据来自于浏览器客户端的请求来动态生成所需的代码并发送给客户端,这些代码都是经过特别编码和优化的,在下载,加载和执行上都是极其高效的。

动态代码加载是按需完成的,这样可以极大地缩小实际使用的代码尺寸,譬如在一个常规的 Unity3D 游戏里面一般会有大约45K 个函数,经过动态代码生成技术实际需要的函数也就不到10K,经过特别编码和优化处理,能以不到原来 20% 的体量来完成整个过程,带来了非常好的玩家体验。

WEB-IR 支持渐进的资源加载:

因为 WEB-IR 支持独门绝技可以在 Web 上实现阻塞和同步,所以对于大文件资源加载就会变得非常轻松,以往的技术都需要把资源预加载进来,或者使用黑图的方式占位来异步加载资源,不是下载慢,费流量就是体验差,而 WEB-IR 做到了既可以按需加载资源,省时省力,又可以同步显示资源,体验自然,一举两得。

同时,WEB-IR 支持文件资源的分级存储,充分利用了服务器,浏览器本地持续存储和浏览器内存快速存储的能力,通过特别的算法来实现资源加载的优化。

因为没有阻塞同步支持,像 U3D,UE4这样的引擎就无法做到很好地支持大资源在 Web 上的操作,而 WEB-IR 不仅做到了还不需要开发者做任何的改动。

WEB-IR 实现了程序执行上下文的切换来实现阻塞:

通过程序里面对环境的保存和上下文的切换支持,WEB-IR 完成了在 Web 环境下的阻塞 I/O 的实现,将原来无法在 Web 实现同步操作变成了可能,从而为多种功能的实现提供了基石,这一切完全得益于 WEB-IR 的前端离线编译和后端在线编译技术,而开发者的代码不用为此做任何的改变。

WEB-IR 实现了协作例程来支持多线程:

利用阻塞,上下文,执行环境保存和恢复,还有调度器策略以及事件系统来实现多例程的协同工作,从而为多线程模型的移植铺平道路。

WEB-IR 更多:

WEB-IR 的代码是使用一种中间形式来表达,所以叫 WEB-IR,而中间表达可以用来支持 WEB-IR 系统中更多的先进技术;
WEB-IR 以一种和 WebAssembly 同样低层级的形式来工作,不过是基于 CFG 而不是 AST;
WEB-IR 以一种纯文本的格式来存储以便于生成和修改;
WEB-IR 可以从两种方式来生成,C/C++源码或者 WebAssembly 代码。

WEB-IR 的工作流是这样的:

说了这么多,亲自体验下吧!

(持续增加中,链接由木鸡科技提供)


近期点赞的会员

 分享这篇文章

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. 大城小胖 2018-03-18

    虽然看起来像软文, 虽然木鸡科技的logo是完全的山寨无印良品, 但还是感觉很厉害的样子, 满满的黑科技啊.

  2. shaderx 2018-03-18

    虽说像软文,不过诚意满满,为独立游戏推广添砖加瓦。

  3. 乌苏李 2018-06-12

    那么问题来了 在哪能下载或者得到支持呢?

您需要登录或者注册后才能发表评论

登录/注册