众所周知,当处理大型游戏时,一个场景中可能会同时存在几百上千个渲染对象,但是这些渲染对象却不一定都在屏幕中出现。而渲染一个对象是比较耗时的,如果我们能把这些不在屏幕中的渲染对象从渲染列表中剔除,性能势必能得到很大的提升。
假如我们在场景使用了100个精灵,但是目前只有50个精灵出现在屏幕中,剩余的 50个精灵玩家是看不到的,那么我们就没有必要花时间在这一帧上对这50个精灵进行渲染,这样就可以省下一半的性能来处理其他事情。
Cocos Creator逐步支持了比较常用的组件的剔除功能,比如Sprite、Label、RichText、DragonBones。一个游戏的表现基本上都是这些渲染组件组合而成的,如果能做到支持这些组件的剔除功能,游戏开发过程基本够用了。其他的渲染组件,比如粒子效果、绘画组件的剔除功能目前还没有进行支持,后续我们可以根据需求再进行讨论。
引擎团队早在v1.5版本就添加了Camera组件,而在上周刚正式发布的v1.6版本中则进一步完善了各组件在使用Camera组件情况下的剔除功能支持。假如我们在场景中使用了Camera组件,那么剔除功能将会按照Camera组件的视口来进行剔除。
测试例
这些渲染组件的剔除功能我们可以在example_cases/culling中找到相关测试。
支持剔除功能的组件我们在生成相关对象的时候可以观察到GL calls的变化,而不支持剔除功能的组件GL calls则不会发生变化。
从这两幅图中可以看到GL calls是完全不一样的。
点击Enable Camera则可以测试在使用摄像机的情况下剔除功能是否仍然正常。
TiledMap
之前经常有小伙伴反馈说webgl情况下的Tiled Map使用了Camera后有些地方看不到,这个问题在v1.6版本中得到了很好的修复。
目前TiledMap只在web平台有剔除功能,native平台上由于还是沿用老的TiledMap实现,使用SpriteBatchNode作为渲染实现。不过native平台的TiledMap,引擎团队正在考虑沿用web平台的实现方式进行重现,届时剔除功能可以一并实现。
还未尝试这个功能的小伙伴不妨进入「原文链接」下载Cocos Creator v1.6正式版,我们期待更多有效的反馈。
戳原文,更有料!