cocos2dx UI的一些碎碎念

被Hugo的更新弄得很伤,所以搬运下github上的博客

UI方面的工作比较碎,比较单调,但也有很多讲究,合理的UI设计可以节省很多DrawCall和CPU的开销,这里总结一些Tips。

需要时加载图集

为了节省DrawCall一般会把相同界面或者相同类型的图片用TexturePacker打包成一张整图,比如通用的UI框体,按钮可以打包成一个图集。在每个场景创建前,加载一些必用图集,然后看情况加载其他图集。

尽量把不同的窗口做成不同的Layer或Node,每个窗口管理自己所需要的图集,避免无用图集占用内存,做到需要时加载。这点有点像Unity的组件化Component-Based思想,尽量把重复的部分(甚至不重复的部分,你永远不会想到策划哪天会突发奇想,复用某一块界面)独立,然后按需加载。

图片纹理格式

Android:推荐ETC1图片加Alpha通道的格式

IOS:推荐PVRTC4

如果效果不满足可以往上升级,考虑RGBA4444加抖动,或者直接用RGBA8888原图品质。

详细的可以参考:

  1. iOS和android游戏纹理优化和内存优化(cocos2d-x)

  2. 浅谈Cocos2d-x纹理优化

利用Cache实现“只创建一次原则”

一个稍微复杂的界面里,各个标签切换可能会产生大量的重复的Button、Label或者自定义Node,利用Cache把它们存储起来进行重复利用,可以减少明显的卡顿和不必要的GC。

一个Lua的简单实现:


self.buttonCache = {

    buttonTable = {},

    index = 1,

    getButton = function()

        local index = self.buttonCache.index

        local button = self.buttonCache.buttonTable[index]

        if button then

            button:show()

        else

            button = WidgetHelper.quickItemWidget()

                :retain()

                :setAnchorPoint(0.5,0.5)

                :setTouchEnabled(true)

                :onTouch(handler(self,function(self,event) end))

            self.buttonCache.buttonTable[index] = button

        end

        self.buttonCache.index = self.buttonCache.index + 1

        return button

    end,

    recycleButton = function()

        for k,v in pairs(self.buttonCache.buttonTable) do

            v:removeFromParent()

            v:hide()

        end

        self.buttonCache.index = 1

    end,

    releaseButton = function()

        for k,v in pairs(self.buttonCache.buttonTable) do

            v:release()

        end

    end,

}

获取Button的时候只用调用getButton(),在切换标签或清空列表时调用recycleButton()回收Button并重新计数,在退出Scene的时候调用releaseButton()清除Cache。

不单单是Button,任何重复的组件都可以用类似的格式进行Cache存储和重复利用,可以节省一大笔创建和销毁的开销。

需要注意的是,Cache中的元素,在重复利用时要做好检查,避免出现重复添加子节点,Enable状态没有重置等问题。

提供统一的UI控件创建接口

游戏中最常见的组件,物品道具Button,TTFLabel文本,HtmlLabel文本,RichText文本,采用统一的接口创建。保持格式统一,减少重复代码。特别是物品Button,一般是一个Button底加Icon Sprite加数量Label的组合,提供一个统一接口,处理不同Item的样式,比如装备的彩色底框,碎片的角标,人物头像的星级等等,做到传入一个Item ID和Type,就能产生相应的Button。

延时加载

有时候运气比较背,一个列表里面要加载几十个子Node,每个Node上还都有动画和各种子Node,全部添加完需要2s左右,卡顿明显,除了怂恿策划美术改图之外,延时加载也是一个解决办法——不要等列表子Node加载完再显示,先显示列表,开一个计时器,每隔0.1s~0.2s添加一个子Node,在完全加载完前禁用用户交互,虽然时间差不多,但效果要明显好于让用户卡个几秒。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,370评论 25 709
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,979评论 1 180
  • 我拂掉了你肩上的羽毛 羽毛,掉了。风吹,又起了。 也不知道会再落到谁的肩上, 我看了你的肩上空空如也,安稳了。 又...
    南城微南阅读 265评论 0 2
  • 今天学的SPI 明天学习FLASH 加油哈
    宋涛1120阅读 167评论 0 0
  • 1.所有研发的产品要经过10个人以上交叉验证才能够给客户使用。 2.用有专长的人才。 3.寻求外部资源来配合。 4...
    我不是书生阅读 169评论 0 0

友情链接更多精彩内容