【问题标题】:Dispose of static/singleton in Unity在 Unity 中处理静态/单例
【发布时间】:2017-09-20 09:36:34
【问题描述】:

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

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

我明白这有什么意义,因为 Unity 的一般进程仍在运行。但是,很明显,我不希望这样。我想在应用停止时停止运行回调并正确处理我的Timer。而且我不知道该怎么做。

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

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

有人知道我应该如何管理吗?

非常感谢

编辑

刚刚发现this thread 准确描述了我的问题。还没解决……

【问题讨论】:

  • 为什么不使用 InvokeRepeating() 运行回调;还是协程?当播放模式停止时,它应该会停止。
  • 因为这意味着依赖一个游戏对象来调用我的回调。这意味着添加一个带有 DontDestroyOnLoad 的 GameObject,但我的库需要是跨平台的(不仅适用于 Unity),所以不能真正依赖它......
  • 停止尝试将您的问题变成其他问题。如果您的问题与 Unity 无关,则不要标记 Unity。它清楚地说 “如果我在 Unity 中测试我的库,将回调绑定到 Debug.Log 并点击 Play,计时器按预期启动,因此记录消息,但在离开 Play 模式时不会停止,导致内存泄漏(有时记录 OutOfMemoryException)。” 这就是我回答的第一部分所要解决的问题。这个问题现在应该已经解决了。
  • 我从一开始就说过我不能依赖游戏对象。我意识到我的问题并不清楚。我对其进行了编辑以避免进一步混淆。谢谢你的帮助

标签: c# unity3d memory-leaks timer singleton


【解决方案1】:

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

您可以在停止编辑器时调用的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

【讨论】:

  • 我编辑了我的问题以使其更清楚。我的库应该是跨平台的,所以我不能依赖 GameObject 定期调用函数。这就是为什么我决定首先使用计时器
【解决方案2】:

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

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

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

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

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

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

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

如果您让我们知道您还会考虑在哪里使用您的库,这可以帮助人们详细说明可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多