问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

红魔Mars打游戏加载特慢

发布网友 发布时间:2022-04-12 12:47

我来回答

2个回答

懂视网 时间:2022-04-12 17:09

我们游戏项目中的 ui 实现方式,采用的是用 cocostudio 编辑ui ,导出 exportjson 和大图的方式实现的. 这样实现一直都存在一个问题: 当一个页面用到较多的 ui模板时, 加载速度会非常慢. 比如点击一个 按钮,展示一个 由 7, 8 个ui模板组成的 页面时,要花费一

我们游戏项目中的 ui 实现方式,采用的是用 cocostudio 编辑ui ,导出 exportjson 和大图的方式实现的.

这样实现一直都存在一个问题: 当一个页面用到较多的 ui模板时, 加载速度会非常慢. 比如点击一个 按钮,展示一个 由 7, 8 个ui模板组成的 页面时,要花费一两秒的时间,体验非常不好.

导致问题的根本原因是 widgetFromJsonFile() 这个函数非常慢。

起初我怀疑是 io 的问题, 也就是说认为是这个函数里面调用 CCFileUtils::sharedFileUtils()->getFileData() 这个函数慢,但后来验证发现这个函数花费的时间非常少,

影响性能的是这个函数里面调用的 widgetFromJsonDictionary(widgetTree); 函数非常慢。这个函数是在根据 json 字符串解析出各个 ui控件。


为了解决卡顿的问题,我尝试了以下几个方法:

1. 相同 ui模板交替位置,实现无限循环。

比如我们有个页面,需要展示 几十个 相同 ui模板组成的 list view.这时可以计算 当前页面最多显示 n 个,在此基础上 +2,也就是一共调用 n+2 次 UIHelper::instance()->createWidgetFromJsonFile() 函数。

利用这个 n+2 个控件,当向下移动时,顶端控件挪下来,向上移动时下端控件挪上去,来实现几十个 ui模板的滚动。

这样的方法虽然节省了不少时间,但是即使仅读取 n+2 次 ui 模板,还是要花费1 ~ 2秒,效果不理想


2. ui 控件不从 json file 解析,而从内存中拷贝

我们项目的 cocos2dx 版本比较老, UIWidget 没有 clone() 函数。

起初我就根据 UIWidget* CCSGUIReader::widgetFromJsonDictionary(const rapidjson::Value& data) 函数里调用的各个子函数

setPropsForButtonFromJsonDictionary() setPropsForCheckBoxFromJsonDictionary() 等等函数,来按照这些函数写一些 属性赋值函数。但是写得很辛苦,而且复制效果也不好,许多不同的 UIWidget 类需要 不同的参数设置,很难保证正确性。

后来下载了 cocos2dx 2.2.5 版本, UIWidget 以及它的各个子类都实现了 clone() 函数。我把这些 clone() 函数移植到了我们项目里面。

但结果非常悲剧 : 用 UIWidget 的 clone() 竟然 比 每次读取 json file 的方法更慢! 并且在 2.2.5 版本上试验一番,也证明了 UIWidget 类的 clone() 函数效率低下。

所以从内存中拷贝这样的方法行不通。


3. 给游戏增加 loading 界面,在进入游戏前缓存足够的 UIWidget

为此写了一个 singleton 的类 UIPool ,在游戏开始时加载足够多的 所需要的 UIWidget 控件,修改 UIHelper::instance()->createWidgetFromJsonFile() ,当 UIPool里面有相应的空闲控件时,直接拿来用,否则再去 调用 read from jsonfile 相关函数。

起初以为这个UIPool 实现起来, 对缓存的 UIWidget 的内存控制会比较麻烦,但是写了代码后发现,采用 CCDictionary 里面存储 n个 CCArray ,每个 CCArray 存储控件实例的方式,实现起来非常简单。并且 CCDictionary 和 CCArray 都可以使用 cocos2dx 的内存管理机制,实现起来很方便。


这样,使用方法3 和 方法1 相结合, 就可以消灭大部分游戏中由于 UIWidget 读取导致的的严重卡顿了。

热心网友 时间:2022-04-12 14:17

摘要可以恢复出厂设置,或者刷一下机,这些都可以,最简单的就是重启啦咨询记录 · 回答于2021-10-23红魔Mars打游戏加载特慢可以恢复出厂设置,或者刷一下机,这些都可以,最简单的就是重启啦你是不是更新了系统,普遍更新完系统后都反映出运行速度慢#RedMagic OS 更新# 我的nubia NX619J已升级至RedMagic OS V1.8。Be Yourself,做最好的自己,我就是我,我为自己代言,来自个性与黑科技一体的nubia手机,查看更新http://bbs.nubia.cn这个系统更新这个系统好久了,之前也是这个系统玩都不卡,这几天卡的我都掉星耀了剧目前的情况来看,有可能是系统的事,两种解决方法,一是刷回之前的系统,二是等下个系统更新修正你是游戏卡?不是加载慢吗?我刚刚查,不是说不能刷以前系统,只能越升越高嘛,我是王者主页面点击手机画面反映卡顿,加载慢,游戏内不卡吃鸡也是非法手段可以刷回以前,不过有风险。你这种情况推荐你还是等等下次系统更新后再看看,毕竟手机的配置不应该出现这些问题对的加载速度还没我那个板砖OPPOA92s快,我都怀疑是不是845了现在网上很多人,都反应这种情况,怎么说的都有,但也没看谁真正解决了,所以建议你保险起见,还是等等下次系统更新
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么样的猫叫起司猫? 2021年春节后工地普遍是哪天开工? 美国大学介绍——印第安纳大学伯明顿分校 480-500分之间的大学有哪些 平安驾意险需要买两份保险吗? AI编译器技术剖析(一)-概述 AI编译器技术剖析(三)-树模型编译工具 Treelite 详解 研究性学习:人工智能产品的个人使用情况调研 全球变化中国现阶段水资源概况 我国水资源人均占有量现在只有 微软的IE3.0鼠标使用时候是不是要装它自带的驱动? 微软IE3.0复刻版在用的时候需要安装驱动么? 微软Ie3.0旁边2个键怎么设置成能用 欧盟CE认证的机构有哪些,要欧盟认可的,可以用来清关的,BCTC的CE认证海关认可吗? 我用网易邮箱注册了一个新浪微博,当时注册时叫我去邮箱激活,于是我马上就去了邮箱看。当时没有,可能是 一开始就用网易的邮箱注册新浪微博。使用一段时间后,想在这个微博账号下开通新浪的邮箱。 我在QQ开通微博时,是用网易邮箱注册的,忘记30分钟内回复确认邮件了,怎么重新申请? 我怎么注册新浪微博都没有用啊?还要激活网易邮箱?求解释 新浪微博可以用网易邮箱注册吗? 我用手机上网易微博,如何申请帐号。 如何下载这里的电影 如何调剂到陕西师范大学戏剧与影视学专业 4月18号才挂出来的,已经在研招网上报名了。 有4月18日(熊出没之雪岭熊风)的电影票吗 欲钱买盡入开烟火的动物十二生肖指那个? 过年烟花,什么生肖。 烟花上天大声响,五颜六色真美丽,猜一生肖 每日一囧418里说的电影叫什么名?谢谢 烟火扒手的谜底是扒手打一生肖 求一部欧美叫金臂小子的电影 找了N多网站都没有下载观看的 在线等待啊 谢谢了 烟花代表什么生肖? 如何把曼巴眼镜蛇的驱动设置和IE3.0一摸一样 QQ好友互动标志 qq最新版好友互动标识在哪弄 房间消毒可以用酒精吗 华为手机如何同时登录两个? take me out什么意思? take me out(带我出去) 美国版的take me out 是美国的版权吗 take me out 什么意思 歌词里有……take me out take me out Take Me Out--长谷川润 MP3 苹果手机忘了密码怎么办? Take me out有带我走的意思吗? 请问美版的《take me out》第一季播完了,为什么没有第二季了?还有第二季吗?在哪能看到呢? 为什么非诚勿扰跟外国的Take.me.out一样 怎么我不喜欢《非诚勿扰》更喜欢【TAKE ME OUT】呢??? take me out of myself 16瓦 LED灯与8瓦LED灯的驱动器能互用吗 谁能提供土屋安娜Take me out歌词大意?? 华为手机怎样注册第二个?