Cocos2d-x 之性能检测

本文介绍了Cocos2d-x中OpenGL的性能指标,如FPS、GL Calls和GL Verts,以及如何通过集成android-ndk-profiler进行性能检测。建议包括使用SpriteBatchNode批量处理、减少不必要的绘制和设置不可见元素为false来优化性能。同时,详细阐述了如何在项目中集成android-ndk-profiler,并解读性能分析报告。
摘要由CSDN通过智能技术生成

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 指令的次数。这个数字越小越好,优化的方向有

    1. 使用 SpriteBatchNode 来批量处理
    2. 将小图片打包成合图,加载到 SpriteFrameCache 中
    3. 不可见的元素设置为不可见,而不是设置透明度为 0

使用 SpriteBatchNode 是 2.x 的做法,3.0 之后官方不建议使用。这种方式要求所有 Sprite 都要先添加到 SpriteBatchNode 上,虽然能提升效率,但有很多限制,而且某些情况下反而会降低效率。比如有 Sprite 在屏幕外时,SpriteBtachNode 并不会作检查,而是直接渲染所有的 Sprite;而直接使用 Sprite 的方式会判断 Sprite 是否在屏幕外,如果在屏幕外则不渲染。3.0 之后直接使用 Sprite 也可批量处理,只要多个 Sprite 使用同张纹理并且使用相同的着色器和混合函数(SpriteBatchNode 也有这些要求),所以推荐直接使用 Sprite 而不是 SpriteBatchNode。

参考文章 https://github.com/fusijie/Cocos2dx-Release-Note/blob/master/cocos2d-x_v3.0_release_notes.md#user-content-sprite-%E5%92%8C-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

10个sprite

把图片事先加载到精灵帧缓冲区并不影响 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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值