【发布时间】:2020-06-27 06:32:26
【问题描述】:
第一次在这里问。我的经验只是“高级初学者”。问题是由于 Unity 中的对象实例化导致的内存中的变量存储。
需要解释一下设置:
在我的场景中,我实例化了整个 starsystem。该脚本最多可以创建 8 个行星,每个行星最多有 3 个卫星和 4 个锚点(空gameObjects)。我不改变场景,我只销毁starsystem 并实例化新的,所以我需要确保所有旧的引用都从内存中消失。我想确保不会在内存中使用永远不会被删除的gameObjects 填充内存来造成内存泄漏。
下面是我的脚本中实例化卫星的部分,可以在单个系统实例化中多次调用。月亮gameObject 将在实例化后“返回”给调用者,并添加到调用者中创建的另一个变量中,这是它的官方变量planetXMoonY,每个系统只能存在一次,并且在a之前是nulled新系统实例化。
在版本 1 中,我在方法中创建临时变量,而在版本 2 中,我在外部创建它们并在实例化之前先重置它们。
这是如何在内存中处理的?我是否认为在版本 1 中一段时间后在技术上可能有几十个或更多 newMoon GameObjects 在内存中?同名,但当然有单独的实例ID,我会填满内存。
当对象planetXMoonY 被销毁时会发生什么?当我理解正确时,与newMoon变量没有更多的联系,但planetXMoonY的引用会被GC()及时删除。但是 newMoon 变量是否会在没有直接调用将其设置为 null 的情况下从内存中删除?
所以我想也许第 2 版是一个改进。首先将其重置为 null 是否有助于确保garbageCollector 及时删除所有newMoons,因为在返回gameObject 后不需要它们,这里只是用于实例化目的。但是我还是这样创建了几十个,还是只创建一个?
我希望问题足够清楚。我似乎在这里错过了对内存使用的一些基本了解。我想我在这里错过了关于如何正确和安全地创建变量的非常重要的知识,我想确保我未来的工作流程得到改进。提前感谢您的帮助。
B/R 星人
版本 1:
private GameObject InstantiateMoon(GameObject moon, GameObject planetSphere, float moonSphereRadius, float moonOrbit, float MoonOrbit_Y)
{
GameObject newMoon = Instantiate(moon, planetSphere.transform.position, Quaternion.identity, spheresContainer.transform) as GameObject;
GameObject newMoonSphere = newMoon.transform.Find("MoonSphere").gameObject;
newMoonSphere.transform.localScale = new Vector3(moonSphereRadius, moonSphereRadius, moonSphereRadius);
newMoonSphere.transform.localPosition = new Vector3(0,0,moonOrbit);
newMoon.transform.localRotation = Quaternion.AngleAxis(MoonOrbit_Y, Vector3.up);
DrawCircle orbitLine = newMoon.transform.Find("OrbitLine").gameObject.GetComponent<DrawCircle>();
orbitLine.InitializeLine(moonOrbit);
newMoon.transform.SetParent(planetSphere.transform);
return newMoon;
}
第 2 版
private GameObject newMoon;
private GameObject newMoonSphere;
private DrawCircle orbitLine;
private GameObject InstantiateMoon2(GameObject moon, GameObject planetSphere, float moonSphereRadius, float moonOrbit, float MoonOrbit_Y)
{
newMoon = null;
newMoonSphere = null;
orbitLine = null;
newMoon = Instantiate(moon, planetSphere.transform.position, Quaternion.identity, spheresContainer.transform) as GameObject;
newMoonSphere = newMoon.transform.Find("MoonSphere").gameObject;
newMoonSphere.transform.localScale = new Vector3(moonSphereRadius, moonSphereRadius, moonSphereRadius);
newMoonSphere.transform.localPosition = new Vector3(0,0,moonOrbit);
newMoon.transform.localRotation = Quaternion.AngleAxis(MoonOrbit_Y, Vector3.up);
orbitLine = newMoon.transform.Find("OrbitLine").gameObject.GetComponent<DrawCircle>();
orbitLine.InitializeLine(moonOrbit);
newMoon.transform.SetParent(planetSphere.transform);
return newMoon;
}
【问题讨论】:
标签: c# unity3d variables memory garbage-collection