Unity内存管理:加载的可编写脚本对象中的精灵 - 内存如何使用扩展?

问题描述 投票:2回答:1

我一直在使用可编写脚本的对象作为我游戏的模型(数据)层。我在那里存储单位统计数据。我也开始为这个单位添加精灵。

我的问题是:如果我加载一个脚本化对象,它具有对sprite的引用,那么sprite是否也会自动加载?如果我使用精灵引用加载1000个可编写脚本的对象,但我没有使用这些精灵(例如没有GameObject使用该精灵来渲染),这些精灵引用是否还会有内存损失?或者只有在GameObject开始使用精灵实际渲染时才会使用内存?如果是这样,如果我有多个脚本对象引用相同的sprite,这是否会增加内存?

我尝试使用检查器进行一些内存检查,但是我得到零星的结果,内存占用在运行之间变化太大,所以我无法弄清楚发生了什么(没有改变任何我会得到2.2gb,然后3.1 gb,然后2.6gb)。

unity3d memory memory-management sprite
1个回答
1
投票

就像Dave在他的评论中所说,Sprite是一个引用类型,因此Unity将精灵加载到内存中一次,然后将引用特定Sprite的所有其他Object实例加载到其内存地址(就像C指针系统一样) 。因此,在您的情况下,即使您从Scriptable对象创建1000个对象,它们都将指向相同的Sprite。

通常,如果您在Object上使用Resources.Load(),则每个加载的Object将使用父Scriptable Object具有的相同变量引用。但是,如果您每次要创建一个新对象时,比如使用类构造函数,那么每个对象(以及随后的变量)将在内存中拥有自己的空间。在您的情况下,如果您每次创建Scriptable对象时都使用Sprite mySprite = new Sprite(),就会发生这种情况。

因此,在Scriptable Objects中添加同一Sprite的多个实例没有内存损失(CPU / GPU使用是另一个问题,与您的问题无关,但值得一提)。如果您在游戏中执行它以及正在执行的所有其他操作,您的内存检查可能会有波动值,因此我建议您创建一个新项目,然后尝试测量Inspector中的值。如果你这样做,请在这里分享你的发现,因为这是一个有趣的话题。

另外,请查看GameDev堆栈交换中的this post,了解有关您问题的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.