美文网首页
cocos2dx UI的一些碎碎念

cocos2dx UI的一些碎碎念

作者: 口袋村的大猫 | 来源:发表于2018-02-18 22:55 被阅读0次

被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,在完全加载完前禁用用户交互,虽然时间差不多,但效果要明显好于让用户卡个几秒。

相关文章

  • cocos2dx UI的一些碎碎念

    被Hugo的更新弄得很伤,所以搬运下github上的博客 UI方面的工作比较碎,比较单调,但也有很多讲究,合理的U...

  • 改观

    我很少写碎碎念,但喜欢看别人的碎碎念。 最近几天阅读,发现碎碎念的文章少了。 讲真,碎碎念,发泄居多,正能量少。 ...

  • 2018-10-18

    碎碎念 碎碎念 很烦碎碎念 生活的确是琐碎,可我很讨厌碎碎念。 爸爸是个很软弱的人,生活只是基本自理,并不追求...

  • 树洞NO.2

    2019.02.07 (无意中翻到我这篇文章的人要小心了,接下来是我的一些碎碎念,请慎重查看。) 在开始碎碎念之前...

  • 2020年,我在百家号里的美食碎碎念之九十二

    腊月初八,下午起风了,因为一些事情心里特别难过,也非常无奈…… 继续转发我的美食碎碎念。 天天碎碎念——第92天 ...

  • 贷款相关算法之还款公式函数实现

    原文作者:------ 沙蒿 ------关注我吧《程序员的碎碎念》作者,不会ui的前端不是好后端不忘初心,牢记使...

  • 常用的php公共封装函数--不断更新

    原文作者:------ 沙蒿 ------关注我吧《程序员的碎碎念》作者,不会ui的前端不是好后端不忘初心,牢记使...

  • 2018.7.2碎碎念

    为什么总写一些碎碎念 因为我懒 懒得构思 所以就写一些不怎么用脑子的流水账,写不需要严密逻辑的个人碎碎念 想改变 ...

  • 发现日常工作碎碎念

    碎碎念害人,紫雨老师手帐课里面曾经就碎碎念单独有专门的一节课,而且我的碎碎念也是很多,这些不经意的碎碎念就会让我们...

  • 08主题碎碎念追踪:如何发现高频发的碎碎念和场景剧情?课后感

    这节课老师讲的是记录主题式的碎碎念的方法。 主题式的碎碎念:就是从日常碎碎念中把主题式碎碎念给抽离出来。 自己最长...

网友评论

      本文标题:cocos2dx UI的一些碎碎念

      本文链接:https://www.haomeiwen.com/subject/ruzbtftx.html