先说下项目情况,我们做消除游戏,上微信和fb instant game,项目复杂程度类似开心消消乐,大量界面和预置prefab,代码量比较大系统也很多。之前是比较成熟的unity项目,持续开发了几年,现在移植到cc,cc这边还算新手。
最近进入了出包阶段,发现最大问题是prefab的加载。
现在的版本大概只放了unity版本1/3的系统,已经遇到了瓶颈。
微信版本问题是空间占用大,json文件2.2M,微信主包上限4M,意味着接下来几乎已经没法新增系统。
fb版本第一次进游戏json解析超慢,95%的装载时间在等json解析。
我看了下prefab文件,觉得有个简单的优化办法,比如我一个节点信息是这样
{
“type”: “cc.Node”,
“_name”: “UIStageInfo”,
“_objFlags”: 0,
“_parent”: null,
“_children”: [
{
“id”: 2
}
],
“_active”: true,
“_level”: 1,
“_components”: [],
“_prefab”: {
“id”: 5
},
“_opacity”: 255,
“_color”: {
“type”: “cc.Color”,
“r”: 255,
“g”: 255,
“b”: 255,
“a”: 255
},
“_contentSize”: {
“type”: “cc.Size”,
“width”: 0,
“height”: 0
},
“_anchorPoint”: {
“type”: “cc.Vec2”,
“x”: 0.5,
“y”: 0.5
},
“_position”: {
“type”: “cc.Vec3”,
“x”: 0,
“y”: 0,
“z”: 0
},
“_scale”: {
“type”: “cc.Vec3”,
“x”: 1,
“y”: 1,
“z”: 1
},
“_rotationX”: 0,
“_rotationY”: 0,
“_quat”: {
“type”: “cc.Quat”,
“x”: 0,
“y”: 0,
“z”: 0,
“w”: 1
},
“_skewX”: 0,
“_skewY”: 0,
“_zIndex”: 0,
“groupIndex”: 0,
“_id”: “”
},
里面大部分属性存储内容是属性的默认值。
像这样手动删掉这部分属性值,完全不影响使用和加载。可以大幅减少json的空间占用和解析速度。
“type”: “cc.Prefab”,
“_name”: “”,
“_objFlags”: 0,
“_native”: “”,
“data”: {
“id”: 1
},
“optimizationPolicy”: 0,
“asyncLoadAssets”: false
},
{
“type”: “cc.Node”,
“_name”: “UIStageInfo”,
“_objFlags”: 0,
“_parent”: null,
“_children”: [
{
“id”: 2
}
],
“_active”: true,
“_level”: 1,
“_components”: [],
“_prefab”: {
“id”: 5
},
“_id”: “”
},
我们接下来采用的方法是安排个专人来删除这部分内容,或者自己写工具来处理。
不知道引擎层面是否有办法自动实现?
如果没有,希望官方考虑在下个版本呢里增加这个优化。
我相信只要开发规模稍大的项目,都会遇到prefab的问题,论坛里讨论得很多都没看到好的解决方案。
目前prefab90%的内容存的是默认值,只要不再储存默认值,prefab的空间和加载速度都可以大幅提升。