【发布时间】:2020-03-06 23:48:42
【问题描述】:
当我们仍然制作 ScriptableObject 的多个副本/实例时,它对内存优化有什么好处?
过去,脚本附加到预制件上,在实例化时,每个脚本都用于在内存中创建/保留自己的插槽,这是一种不好的方法,因为同一脚本有多个副本。
我们在可编写脚本的对象中所做的是: 创建一个可编写脚本的对象,从 Asset>Create> 创建其多个实例,在这些实例中提供数据并在需要时访问数据。 它与在预制件上附加脚本并实例化它或制作包含数据的 ScriptableObject 的多个副本并从中访问数据有何不同。毕竟我们也在 scriptableobject 中制作了多个副本。
请解释一下 ScriptableObject 的多个副本与实例化的预制件的多个副本如何对内存友好的区别。?
【问题讨论】:
-
我认为 scritbleObject 没有 MonoBehavior 成本。比较简单,把它当成设置文件就好了。
-
@TimChang 我认为我们不会从 monobehaviour 继承它只是为了告诉 unity 这个脚本不能附加到任何游戏对象,但它仍然使用 monobehavior 函数。
-
Prefabs 和 SO 有不同的用途,prefabs 可能会使用 SO 作为数据提供者(sprite、其他 prefabs、数据)。您可以使用相同的 SO 拥有多个预制件(这是内存消耗的来源)。 SO 不是 MonoBehaviour,它们没有生命周期(开始、更新……),它们主要用于存储数据或事件。您可以将它们视为可以在编辑器中使用的高级 C# 类。
-
如果您在运行时创建所有 SO,那么您可能应该使用“普通”类并在运行时创建实例。否则,正如 Everts 已经说过的那样:目的完全不同。 SO 可以看作是序列化的 DataContainer,因此您可以在其中存储信息并引用,尤其是在需要时交换它们。 Prefabs 是您想要实例化到场景中的游戏对象或层次结构的整个部分的模板。不幸的是,Unity 有一些令人困惑的名称,例如 SO 的
OnEnableAwake,但它们的行为与MonoBehaviour不同! -
谢谢大家,现在一切都清楚了:)
标签: c# unity3d optimization encoding scriptable-object