深度干货:Cocos2d-x v3.11在HTML5方向的优化

前几天,Cocos2d-x v3.11已经发布,除去物理引擎升级,JSB新内存模型,Tizen平台支持等亮眼功能外,还有很重要的一点更新是,我们在Web引擎上强化了渲染器性能。总的来说,在行业对WebGL支持越来越好的背景下,我们大幅度强化了WebGL 渲染器的实现,让其支持自动批处理渲染。

背景介绍

WebGL是OpenGL ES的Web版本,它的诞生就是为了给Web平台带来更强劲的2D/3D渲染能力,可以说是为游戏行业而生。为什么说行业对WebGL支持越来越好呢?主要有下面几点利好:

· 腾讯X5引擎的Android版本在上个月完成了blink内核的集成,这意味着Android平台上QQ浏览器微信浏览器也都拥有了强大的WebGL支持。

·Android 5.0版本以上的系统浏览器也是默认支持WebGL的。

·而iOS平台的WebGL支持从iOS 8开始就已经非常完备了。

也就是说两大移动平台对WebGL的支持已经趋向成熟。

Cocos2d-html5自2012年诞生之日起就具有完备的WebGL支持,和Canvas的表现统一性也一直保持得很好。如果接触得早,会知道早在v3.1中,我们就已经彻底升级过一次渲染器,将渲染和逻辑分离。而这次,在行业重大利好的情况下,我们决定再次升级WebGL渲染器。最终,v3.11相较于v3.10在bunnymark测试中取得了4倍以上的成绩,让我们很受鼓舞。

Bunnymark测试运行画面

Bunnymark测试数据(均是WebGL渲染模式下的数据):

当然,这次升级还没有结束,我们测试仍然还有很大的优化空间,在后续版本中,我们将持续投入在WebGL渲染器的优化上,这些优化也会被同步到Cocos Creator中。

主要优化概述

在v3.11中我们完成的主要优化点如下:

1.在Android浏览器上默认开启WebGL(支持的话)

目前开启WebGL的环境有下面这些:

WebGL模式下,通过直接将渲染指令发送给GPU完成在GPU中的渲染,除此之外,一些计算也会在GPU上完成,相比Canvas渲染模式来说高效很多。

目前开启WebGL的环境有下面这些:

· 所有主流桌面端浏览器

· iOS 8.0以上版本的所有浏览器

· QQ浏览器内核6.2版本以上(包含微信最新版本)

· 百度浏览器6.2版本以上

· Android 5.0以上的系统浏览器和WebView

2.WebGL自动批处理渲染

众所周知,draw call(渲染指令的调用次数)是优化的重点,draw call的降低,就等同于渲染性能提升,发热和耗电量下降。

自动批处理渲染是在WebGL模式下专门针对draw call的一种常见优化技术,在渲染游戏场景过程中,如果发现使用同样贴图和混合模式的精灵,就会自动将他们的渲染指令合并为一个,将多个精灵在一次draw call中绘制出来。

在v3.11开发过程中,经过5个版本的自动批处理实现迭代,自动批处理渲染已经可以显著得降低draw call,在完全不改动游戏的情况下即可得到明显的性能提升,如果游戏本身设计对批处理更友好,那么会得到更大的提升,大型游戏控制draw call在50以下是完全有可能的。

下面是使用了v3.11内测版本的腾讯欢乐斗地主web版本的性能优化前后对比(均为WebGL渲染模式):

3.音频系统升级

除了渲染以外,我们对音频系统做了一次升级,提升了音频系统在Android平台上的适配度,降低了内存占用。

音频的播放方式主要分为两种:DOM Audio和WebAudio。之前的版本中,可以使用WebAudio的情况下都会选择使用WebAudio,因为它拥有更强大的音频控制和多音轨播放能力。而在测试过程中,我们发现WebAudio占用内存非常高。因为Web环境中对音频是软解码,所有数据都保存在内存中,而DOM Audio的内存占用则更加稳定。所以我们在v3.11 中,我们将playMusic接口改为使用DOM Audio,playEffect接口继续使用WebAudio,因为音效往往比较短,所以占用内存不多。这样可以有效得降低音频资源的内存占用,下面这张图是v3.11优化前后的音频占用内存对比。

4.让无法批处理的Sprite共享全局的渲染数据缓存,并减少WebGL函数调用

对于无法自动批处理的Sprite,目前已将渲染数据缓存合并为一个共享缓存,降低WebGL函数调用频率和缓存更新频率,这个优化对于中低端安卓机器比较有效。

5.将顶点位置运算从GPU转移到CPU(Mobile friendly)

这个版本中,我们将精灵顶点位置的运算从GPU shader中移到了CPU中,减轻GPU的运算压力发热量,这个改进在中低端机器上得到的效果较为明显。

未来优化方向

在这些优化之后,大家可以放心得在安卓上开启WebGL渲染模式,看看自己的游戏表现,相信可以让Web端的体验更上一层楼。

当然,优化还远远没有结束,下一个阶段我们会继续在三个方向上深入优化Web引擎的体验:

· 进一步提升WebGL渲染性能

· 降低引擎内部的计算损耗

· 降低引擎的内存使用

与此同时,我们的重点产品Cocos Creator和Web引擎共享同一套底层渲染机制,所以也将享受这些修改带来的优势。前一个阶段,我们在Cocos Creator上所投入的主要精力在于搭建数据驱动框架组件化机制以及核心功能的迭代,目前我们已经更多得投入在优化上,相信很快也会有成果展示给大家。