Unity:如何暂停执行直到函数终止,以便不跳过任何帧

Posted

技术标签:

【中文标题】Unity:如何暂停执行直到函数终止,以便不跳过任何帧【英文标题】:Unity: How to pause execution until function terminates, so as to skip no frames 【发布时间】:2016-06-08 14:06:49 【问题描述】:

我正在编写一个游戏/程序,每隔几秒钟就必须将大量数据写入硬盘 - 这需要几秒钟才能完成,并且自然会导致游戏在这段时间内挂起。

但是,当写入完成后游戏继续时,游戏会跳过几帧。

我需要 Unity 绝对跳过无帧。如何强制 Unity 引擎在写入完全完成之前停止执行,以便在恢复时不会跳过任何帧?


为了提供一些上下文,我每帧捕获一个屏幕截图,将它们作为 Texture2D 存储在队列中。当队列中有超过 100 帧的 Texture2D 时,我将其作为 PNG 写入磁盘,并清除队列。

我想在写入时暂停渲染/执行,以便输出(单独)是无缝的。

【问题讨论】:

如果它导致游戏在该功能完成时挂起,那么为什么不使用另一个线程来执行该功能,这样它就不会停止主线程?多线程。 因为这将允许渲染在数据写入磁盘时继续进行。在我的特定上下文中,我希望在写入 PNG 时完全暂停执行,然后在完成后立即恢复。我不希望它在尝试写入磁盘时执行/捕获帧,因为捕获比写入快得多。 但是你为什么要等着写呢?为什么不一边保存一边写?一个接一个。 顺便说一句,您正在尝试做的事情非常非常复杂。你会得到任何简单的罐头答案 Ben - 很抱歉这个坏消息:/ 【参考方案1】:

您可以将 timeScale 设置为 0,以便不调用 Animation 和 FixedUpdate。

至于更新,您必须添加一些检查:

void Update()

    if(Manager.cleaningTexture == true) return; 
    // Rest of the code

【讨论】:

我已经尝试过了,但效果并不好。它仍然跳过一两帧。不太确定我是否理解 If 语句如何帮助防止执行? 您不能停止更新,这根本不可能。如果 timeScale 为 0,则可以跳过 FixedUpdate。如果发生清理,if 语句会阻止任何代码在更新中运行。当你开始清洁时,你会设置一个标志。然后当标志为真时,更新跳过。但它仍然必须被调用,你无法阻止它。 谢谢fafase,我现在明白了。我最终在一个单独的线程中将 PNG 写入磁盘。这似乎工作得很好,尽管我认为这是错误的想法。 @BenHayward 你用过线程助手包吗(周围有一些,主要称为“Loom”之类的东西)...... @JoeBlow 最终我从 Unity 的答案中得到了答案 - answers.unity3d.com/questions/1147247/…。我创建了一个协程,尽管我最初的理解是,它在创建后立即将单个帧写入磁盘。我使用 Time.captureFramerate 强制统一仅在写入发生后执行。它完美运行,没有跳过任何帧

以上是关于Unity:如何暂停执行直到函数终止,以便不跳过任何帧的主要内容,如果未能解决你的问题,请参考以下文章

Unity 从各个点理解协程

Unity 从各个点理解协程

Unity 从各个点理解协程

使用 SQL Server Rank 函数对行进行排名而不跳过排名号

java中ExecutorService的线程池如何暂停所有的任务和继续所有的任务? 有这样的函数吗?

pytest 不跳过未标记的测试