在这种情况下,它触发GC每一个帧。
我知道IEnumerator是句法糖,当生成IEnumerator函数时,它将创建一个新的对象。有办法保留IEnumrator并重用它吗!?我不想直接实现IEnumerator,因为它更复杂。
[ContextMenu("CoroutineGCTest2")]
public void CoroutineGCTest2()
{
Debug.LogFormat("[CoroutineMemoryTest.CoroutineGCTest2]");
StartCoroutine(GCTest());
}
struct ForGC
{
int a;
int b;
int c;
int d;
}
IEnumerator GCTest()
{
while (true)
{
yield return GC(new ForGC());
}
}
IEnumerator GC(ForGC g)
{
yield return null;
}通过实现WaitForSecondsRealtime重用方式实现IEnumerator
IEnumerator GCTest()
{
//cache it
WaitForSecondsRealtime wait = new WaitForSecondsRealtime(1f); ;
while (true)
{
yield return wait;
Debug.LogFormat("wait 1 sec");
wait.Reuse(2f);
yield return wait;
Debug.LogFormat("wait 2 sec");
//yield return GC();
}
}
public class WaitForSecondsRealtime : CustomYieldInstruction
{
public float waitTime { get; set; }
float m_WaitUntilTime = -1;
public override bool keepWaiting
{
get
{
if (m_WaitUntilTime < 0)
{
m_WaitUntilTime = Time.realtimeSinceStartup + waitTime;
}
bool wait = Time.realtimeSinceStartup < m_WaitUntilTime;
if (!wait)
{
// Reset so it can be reused.
m_WaitUntilTime = -1;
}
return wait;
}
}
public WaitForSecondsRealtime(float time)
{
waitTime = time;
}
public void Reuse(float time)
{
m_WaitUntilTime = -1;
waitTime = time;
}
}但更复杂..。
发布于 2021-06-03 10:11:34
不能重用IEnumerator函数。它是单向的,一次性的对象。IEnumerator有Reset函数,但在这种情况下不能使用。
IEnumerator GCTest()
{
// An attempt to cache and reuse IEnumerator function
var e = GC(new ForGC());
while (true)
{
yield return e;
e.Reset( ); // System.NotSupportedException: Specified method is not supported.
}
}那么现在呢?
yield return的需求。Update循环、状态和计时器来实现相同的代码效果。https://stackoverflow.com/questions/56830593
复制相似问题