gpt4 book ai didi

multithreading - 使用 .NETs ThreadPool 时 Fps 下降

转载 作者:行者123 更新时间:2023-12-04 06:42:50 26 4
gpt4 key购买 nike

我之前问过这个问题,但没有提供代码,因为我没有一个简单的方法来做到这一点。但是,现在我在 Unity 中启动了一个新项目,并尝试在不附加所有不必要的包袱的情况下复制该行为。

所以这是我目前的设置:

public class Main : MonoBehaviour
{
public GameObject calculatorPrefab;
void Start ()
{
for (int i = 0; i < 10000; i++)
{
Instantiate(calculatorPrefab);
}
}
}

public class Calculator : MonoBehaviour
{
void Start ()
{
ThreadPool.QueueUserWorkItem(DoCalculations);
}

void DoCalculations(object o)
{
// Just doing some pointless calculations so the thread actually has something to do.
float result = 0;
for (int i = 0; i < 1000; i++)
{
// Note that the loop count doesn't seem to matter at all, other than taking longer.
for (int i2 = 0; i2 < 1000; i2++)
{
result = i * i2 * Mathf.Sqrt(i * i2 + 59);
}
}
}
}

两个脚本都附加到 GameObjects。 'Main' 脚本位于放置在场景中的游戏对象上,应该在启动时创建一堆其他游戏对象,然后依次为 ThreadPool 排队一些随机计算。显然,这会在启动时产生相当大的 CPU 峰值,但这不是问题。问题是主线程似乎被这个阻塞了。换句话说,它产生了可怕的fps。这是为什么 ?它不是应该在后台运行吗?这背后的重点难道不是让主线程无响应吗?

我真的很难弄清楚我做错了什么,因为据我所知,没有比这更简单的了。

最佳答案

在第一帧中,您实例化了 10000 个预制件。这对于单帧来说是相当大的负担。在第二帧中,您初始化了 10000 个线程池。这是相当多的线程,我相信您会遇到一些前期初始化成本。

后台任务没有那么复杂。我将后台任务用于真正长时间运行的操作。例如网络调用和长时间运行的计算。我不认为你的任务很合适。换句话说,前期成本超过了运行计算的成本。

尝试使用协程来分解您的计算和实例化。我认为这是针对此特定后台任务的更好解决方案。

编辑 根据下面的评论进行一些测试。

  • 10k 实例化平均(中值)104 毫秒。编辑器的帧率很差,使用了我的 I7 CPU 容量的 15% 左右。
  • 10k QueueUserWorkItem 平均(中值)23 毫秒。编辑器锁定了几秒钟。我的 CPU 容量有 99% 的惊人容量。

  • 结论
    排队工作线程有一些成本,但不是很多。问题主要与您的实例化有关。那,为什么我们要为如此简单的计算使用 1000 个工作线程?

    关于multithreading - 使用 .NETs ThreadPool 时 Fps 下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30042881/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com