OpenGL 性能指标
cocos2d-x 中有三个跟 OpenGL 相关的性能指标,游戏运行时显示在左下角;cocos2d-x 默认会显示这些性能指标,可以手动在代码在开启或关闭,C++ 项目在 AppDelegate 的 applicationDidFinishLaunching 函数中设置
Director::getInstance()->setDisplayStats(true);
lua 项目在配置文件 config.lua 中设置
CC_SHOW_FPS = true
FPS(Frames Per Second)
fps 是帧率,顾名思义就是每秒绘制多少帧。帧率设置得超高,画面刷新得越频繁,游戏看起来更顺畅;但这也意味着每秒要做的运算更多,更加耗 CPU 或 GPU,而且如果运算量过大的话,可能会出现卡帧。一般游戏的帧率不会低于 30 帧,实时性要求比较高的场景可以设置成 60 帧。这个指标可以帮助我们查看游戏在什么时候计算量过大,然后降低计算量或分散计算到多个帧中去。GL Calls
gl call 是 opengl 渲染的次数,即每一帧调用 opengl 指令的次数。这个数字越小越好,优化的方向有- 使用 SpriteBatchNode 来批量处理
- 将小图片打包成合图,加载到 SpriteFrameCache 中
- 不可见的元素设置为不可见,而不是设置透明度为 0
使用 SpriteBatchNode 是 2.x 的做法,3.0 之后官方不建议使用。这种方式要求所有 Sprite 都要先添加到 SpriteBatchNode 上,虽然能提升效率,但有很多限制,而且某些情况下反而会降低效率。比如有 Sprite 在屏幕外时,SpriteBtachNode 并不会作检查,而是直接渲染所有的 Sprite;而直接使用 Sprite 的方式会判断 Sprite 是否在屏幕外,如果在屏幕外则不渲染。3.0 之后直接使用 Sprite 也可批量处理,只要多个 Sprite 使用同张纹理并且使用相同的着色器和混合函数(SpriteBatchNode 也有这些要求),所以推荐直接使用 Sprite 而不是 SpriteBatchNode。
使用 SpriteBatchNode
local batch = cc.SpriteBatchNode:create("popcap.png")
for i = 1, 10 do
local sprite = cc.Sprite:create("popcap.png")
batch:addChild(sprite)
end
self:addChild(batch)
batch:setPosition(cc.p(win_size.width / 2, win_size.height / 2))
直接使用 Sprite
for i = 1, 10 do
self._icon=cc.Sprite:create("popcap.png")
self._icon:setPosition(cc.p(win_size.width / 2, win_size.height / 2))
self:addChild(self._icon)
end
两种情况的 gl call 都是 1
把图片事先加载到精灵帧缓冲区并不影响 gl call,只是创建精灵时会快一些而已;但把小图片打包成合图,再加载到精灵帧缓冲区,则可以降低 gl call。
直接使用 Sprite
for i = 1, 10 do
self._icon=cc.Sprite:create("popcap.png")
self._icon:setPosition(cc.p(win_size.width / 2, win_size.height / 2))
self:addChild(self._icon)
end
for i = 1, 10 do
self._icon=cc.Sprite:create("popcap2.png")
self._icon:setPosition(cc.p(win_size.width / 2, win_size.height / 2))
self:addChild(self._icon)
end