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

webapp在移动端加载速度慢,卡顿等性能问题怎么解决

发布网友 发布时间: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

加载慢 一个就是游戏载入量大 另一个就是硬盘性能不是太好 你的CPU够了显卡不管你载入 只管运行 你这显卡玩不了 别想了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我家300多k的网速为什么玩cf总是很迟钝,连切枪都很慢 CF切换枪的速度很慢 ...东西需要输入apple ID密码 我不知道怎么办?更新微信需要appleID_百... ...一遍id苹果手机的每次更新软件都需要输入id和密码请问怎么解决_百度... ...ID 我不知道密码是什么,也不懂怎么申请,想下个软件都下不了... 微信直播王者荣耀有收益吗 王者荣耀新手主播能挣多少 华为是如何进入手机市场的? ...用的那种安在船边上承鱼竿的那个座子中文叫什么?就是下图中的那个... 放在哪里不动钓鱼的叫什么? 请问使用WPS的WORD时,如何在同一个文档中插入不用的页码和页眉? 眼睛的眼能组什么词 山东省人事考试中心的电话是? 光宽带如何办理啊,申请套餐和更换档位怎么办呢? 自动挡档位只显示p档其他档位不显示是什么原因? 在支付宝社保档位核定错了怎么修改 代充风险1138多久好 更换充值档位是什么意思 王者荣耀档位限制1138 心悦俱乐部 1138 支付风险 巴奴火锅店 开业送对联 要有巴奴 兴旺 的游戏卡顿,贴图加载太慢怎么解决 你赞同巴奴火锅的“服务不是巴奴的特色,毛肚才是”的品牌定位吗? 四大文明古国的资料,包括名称,地域,诞生时间,文字,国家机构和制度 四大文明古国的灿烂历史 古巴比伦作为四大文明古国之一,它是在什么时候灭亡的? QQ邮箱里的收件箱里收件人一栏里看不到自己的邮箱地址,却有邮件 QQ邮箱,怎么看来信的收件人(一箱多名的情况下) 用QQ邮箱发出的邮件能査到收件人吗 镜前灯led 卫生间镜柜镜灯浴室防雾壁灯简约梳妆台镜子灯怎么更换光管? 烟花打一个动物三十六字花 在这两句诗中烟火指的是什么动物 烟火四射,打一个生肖? 日行千里,又如何,不食人间,有烟火.打一动物 烟火升上空打一动物 云间烟火是人家 谜语 打一动物 过年烟花打一生肖,必须是十二生肖里面的。 打一动物,南峰烟火是柴扉 戴尔一体机拥有HDMI in接口,如何把它当做显示器,点亮外接的主机? .举举国上下共欢庆一匹骏马在奔腾日行千里又如何不识人间在烟火打一动物 DELL一体机能单做显示器么 ?如何 才能像普通的台式机,只开显示器不开主机 徐州铁通的免费看电影的网站有哪些? 过年烟花打一动物 空中一队兵,哼哼不住声,棍棒都不怕,就怕烟火熏猜一动物 烟花代表什么生肖? 求一部欧美叫金臂小子的电影 找了N多网站都没有下载观看的 在线等待啊 谢谢了 烟火扒手的谜底是扒手打一生肖 每日一囧418里说的电影叫什么名?谢谢 烟花上天大声响,五颜六色真美丽,猜一生肖 过年烟花,什么生肖。