vovgou / loxodon-framework

An MVVM & Databinding framework that can use C# and Lua to develop games
MIT License
1.86k stars 363 forks source link

AB中的资源在内存中会有多个副本的问题 #8

Closed kumakoko closed 4 years ago

kumakoko commented 4 years ago

在资源中,有一个字库文件zyt.ttf,该字库文件独立打包为一个AssetBundle,且此AB是能被其他AssetBundle中所引用到。但在运行时,经编辑器的Profiler分析,此字库文件在内存中会有多个副本的存在。所有资源文件未经预加载且未常驻内存。

vovgou commented 4 years ago

游戏中的一些公共资源,比如字体、shader等,需要在游戏启动时将对应的AssetBundle预加载到内存中,不要释放它们,这就不会出现多份副本。出现多份副本的原因是AssetBundle多次加载导致产生了多个实例。比如你加载A对象,引用了字体1,当把AssetBundle释放后,又加载B对象,也引用了字体1,因为AssetBundle的序列化没有全局缓存,会导致再次打开字体的AssetBundle,创建另外一个字体1的实例。所以A对象引用的字体1的实例和B对象引用的字体1的实例,不是同一个实例,所以会产生多个字体1的副本。如果使用我的Loxodon.Framework.Bundle,请将公共资源的AssetBundle预加载(见示例 BundleExamples /PreloadAssetBundleExample),保持IBundle对象不要释放,就不会产生多个副本。