在Unity中处理静态/单例

时间:2017-09-20 09:36:35

标签: c# unity3d memory-leaks timer singleton

我正在尝试创建一个跨平台的.NET库(这里用于Unity),我需要一个静态函数。 因此,作为示例,主函数将如下使用:MyLib.AddCallback(Action callback)。 然后我使用静态System.Timers.TimerAutoReset = true来定期运行该回调。 (这只是一个例子)

有问题。如果我在Unity中测试我的库,将回调绑定到Debug.Log并点击Play,计时器按预期启动,因此记录消息,但在离开播放模式时不会停止,导致内存泄漏(有时记录{{1 }})。

我看到这是有道理的,因为Unity的一般过程仍在运行。然而,显然,我不希望这样。我想停止运行回调并在应用程序停止时正确处理我的OutOfMemoryException。而且我不知道该怎么做。

我尝试创建一个单例,将我的Timer作为实例属性并在我的单例类中实现Timer接口。这并没有解决我的问题,因为单身人士从未被处理过。

最后一件事。我不能依靠IDisposable来调用我的Dispose或我的Update方法(而不是计时器),因为我不是专门针对Unity。

任何人都知道我应该如何管理它?

非常感谢

修改

刚刚找到this thread来描述我的问题。仍未解决......

2 个答案:

答案 0 :(得分:2)

看起来Timer正在另一个Thread中运行。

您可以在停止编辑器时调用的OnDisable函数中停止并处理计时器。

public class TimerTest: MonoBehaviour
{
    Timer timer = new Timer();

    void OnDisable()
    {
        timer.Stop();
        timer.Dispose();
    }
}

通常,您应该在Unity中使用协程执行此操作。

1秒计时器的示例:

void Start()
{
    StartCoroutine(startTimer(1));
}

IEnumerator startTimer(float time)
{
    while (true)
    {
        //Wait for x seconds
        yield return new WaitForSeconds(time);

        //Invoke function
        doSomthing();
    }

}

void doSomthing()
{

}

如果您需要查看计时器中的微秒或计时器值太小,请使用Time.deltaTime

答案 1 :(得分:0)

在你改述问题之后,这是我的两分钱。

不确定是否可以完全避免在Unity的生命周期中添加内容。

解决方案可能是您在库中创建了一个“OnExit()”函数,然后可以根据您使用的框架调用不同的位置。

在Unity中,您可以在OnDisable()生命周期方法中调用它。

在另一个框架中,您可以将它放在您知道将在应用程序退出时调用的其他位置。

有关Unity中存在哪些生命周期方法的参考,请查看以下链接。

https://docs.unity3d.com/Manual/ExecutionOrder.html

如果您告诉我们您在哪里考虑使用您的图书馆,那么可以帮助人们更多地阐述可能性。