本文共 1129 字,大约阅读时间需要 3 分钟。
1.【Mac/Windows下程序闪退】平时每天项目打包测试都好用,今天打的Mac包,闪退,点开就会立即关闭….打到Windows上也不行,后来发现是因为选了一个错误的选项,上图吧
2.【场景互相跳转之后内存增加】关于内存优化的一个问题,一般大家的项目里都会有多个场景,比如在A场景,内存占用100M,切换到B的时候,Unity会主动的帮我们做一些事情,比如释放一些资源,回收一些垃圾,虽然C#自称非常NB可以自动回收垃圾,但是所有语言如果有回收机制那么我想,大概也都是相同的原理,就是当某个“对象”没有引用的时候,才会被回收,Unity的很多回收机制都不是立刻执行的,先不说这个…先说问题吧,切换到B场景的时候,Unity会主动的帮我们释放A中的资源,但是如果你将资源加载到了内存中,并且对这个内存中的资源保有引用的话,假如说用AssetBundle加载了20M的图片,这些图片都被用到了一些地方,那么从场景A—–>场景B,这20M就不会被释放,如果场景B自身大小100M,那么切换过来就会变成120M,然后反复这样操作,B–>A–>B,就会变成140M….出现这样的问题就是因为我们太过信赖Unity和C#的回收机制,Image的引用和Int、String、Char这样的数据类型不同,C#语法中有析构函数,但是在Unity中奇怪的是,当你从A–>B中,可能正常人都会觉得A中的数据应该被释放掉,当然我也是这么认为的,其实并不是,A到B的切换,A中所有函数都不会触发析构函数,那什么时候触发呢,答案再次切换场景的时候!对…就是A–>B–>C,就是你到C场景了,才会触发A中的析构函数,但是OnDestroy()这个函数是真真切切的会在场景销毁的时候自动的调用,所以大家需要把那么希望被释放掉的资源加上可以被回收的“标记”,也就是置成null,当一个对象失去引用的时候,才能真正的被回收~ 但是在Unity中开发需要注意的是,如果这个对象是从可见的变成不可见的状态,那么要细心一点了,这个时候不会触发OnDestroy(),所以你的手动取消引用可能就不灵验了~ 如果有特殊的需求记得使用OnDisable(),取消引用