β

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

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

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

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

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


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

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

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


(Unity3D 对 WebAssembly 的描述)

那 WEB-IR 到底能做啥呢?

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

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

几个案例

蛇蛇争霸

非常好玩的一款 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 的工作流是这样的:

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

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


作者:indienova 独立游戏新闻,评测,开发教学
你的独立游戏第一站
原文地址:WEB-IR,让 Web 玩上原汁原味的 Native 游戏, 感谢原作者分享。