游戏中一直不是很清楚配置数据占用了多少内存,现在是使用json转c#对象,转化使用时间也不清楚。
scriptableobject和json相比也不知道谁的性能更优。
现在使用的是dictionary来存储的数据,和hashtable相比谁更快,不知道。现在使用的key是string,使用int是否更快。
以上都需要测试结果:
1、先测试占用的内存。
打一个空场景。
占用的内存如图:
- total 44.6
- unity 13.8
- mono 0.7
- gfxdriver 17.0
- fmod 252
- profiler 12.2
- assets 19.7
- other 9.8
- builtin resources 243.6
- not saved 26.7
- scene memory 8.7
原来的工程场景和资源太多了,打包一次太费时间,这里重新建一个工程
内存占用如图:
- total 18.6
- unity 2.7
- mono 0.5
- gfxdriver 3.3
- fmod 310k
- profiler 12.1
- assets 1.5
- other 2.1
- builtin resources 231.1k
- not saved 145.6k
- scene memory 15.5k
log_config配置文件大小1M,json未压缩。使用resource.load导入内存增加:1.1M和原文件基本相同。多次使用Resources.load只会增加一份内存。(在assets中显示为text asset)
感觉消耗的内存由other移至assets中。再测试一次,unity死掉了。再重启测试一次,果真如此,other中asset0的东西没有了,assets中多了一个textasset名为log_config。
TextAsset text=Resources.Load(“log_config”) as TextAsset;
TextAsset text2 = Resources.Load(“log_config”) as TextAsset;
连续两行,内存也没有多少变化,TextAsset可能都是引用。果真只是引用。
神奇了。使用Resources.unload后,TextAsset log_config被释放内存。但是other中没有增加内存!!!
我把json中的字符串放入textbox中,内存消耗变的巨大:
主要是other中的managedHeap.usedSize变为了71M,在simple界面中可以看到mono也同步变为了71M。
测试结果,使用Resources.load 加载后,然后使用unload释放掉对象内存,但是好像该对象还可以继续使用 -.-!!。难道是因为内存区还保留着数据导致的?unloadAssets,如果被引用对象再次被使用,会从被加载的地方重新被加载。所以,一个对象完全不被使用后,再unloadAssets。
在这里,我们的配置文件被转化为了c#对象,所以可以直接unload掉,释放内存。
minijson中有个东西占用了内存,转换申请了6M内存,一直没有被释放。如果再转换一个小json比如“{}”就会将内存释放掉。
使用json进行转换,中间产生了8M内存占用,既使将引用对象设置为null,不调用GC.collection()也不会回收内存。
text asset转为json消耗2秒,json存入dictionary消耗1.5秒。
开始测试scriptableobject。
没有测试protobuf,scriptableobject比未压缩json容量仅为20%,加载时间仅为10%,内存消耗仅为20%。完全可以替代json。
另外,字符串可以考虑7z压缩,这样可以使用更小的内存,仅多消耗一点CPU。
scriptableobject无法定义为泛型类。
你好,看了你这篇文章还是有些疑惑,我这两天碰到了相应的问题,我们的技能数据是从txt中读取的,文件大小2.5M左右,加载到内存中以后Managed.UsedSize变成了55M,请问下有什么办法优化吗?你的意思是要用scriptableobject吗?
scriptableobject本身占用的内存小(自身已经是被压缩过了)。
解析速度也快。
推荐使用,但是scriptableobject生成的assetbundle必须和scriptableobject代码匹配,如果scriptableobject中修改/增加/删除属性值,需要重新进行打包。
目前我这边游戏是整包更新,先没有考虑这个问题。