游戏中的并行编程

本文关键字:编程 并行 游戏 | 更新日期: 2023-09-27 18:13:51

在我的游戏中,我有一些实体(大约2000-5000个)每帧(或每第二或第三帧)执行非常繁重的性能计算。

我知道并行编程在这种情况下会有帮助。问题是我如何以最好的方式使用多个线程/cpu内核。

我尝试了。net中的静态并行类,但每个并行的启动成本。For/Parallel。ForEach太大了

是否每次调用并行类的函数时都会启动多个线程??游戏的目标fps是60fps,所以无论我使用什么方法,它都不应该在每个游戏帧启动多个线程!

我的问题是:对于并行处理多个实体,还有哪些其他替代方案?我应该自己创建线程吗?如果是的话,会有哪些陷阱?线程池是一个好的选择吗?

游戏中的并行编程

默认情况下Parallel. for/Parallel。Foreach使用ThreadPool线程。事实上,TPL api,如并行类,任务实例等使用ThreadPool线程。

TPL启动的线程数将取决于许多因素,如线程池中可用的理想线程数等。因此,假设TPL会在您提交请求时立即创建大量线程将不完全正确。

重要的一点是,您可以通过MaxDegreeOfParallelism标志来控制使用TPL执行任务的线程数量。通过将该值设置为数字"X",可以将处理的并发项目的数量限制为"X"。就我个人而言,我觉得这是TPL库的一个非常强大的功能。

另外,如果你不希望你的任务阻塞队列中的其他请求,那么你可以将TaskCreationOptions设置为"LongRunning"类型,在这种情况下,TPL将在专用线程上运行任务。

在您的情况下,您可以尝试使用Parallel。对于/ForEach,并设置maxdegreeofparallelism值为一些最优值,看看它的行为。

你需要一些电脑或服务器来测试你的并行编程游戏。否则,在单台计算机上,由于它将在线程上工作,因此将花费更多。

此外,由于游戏在一秒钟内计算和绘制60次,处理线程是不合乎逻辑的,你的游戏已经在线程上运行了。

也许你必须改变或优化你的算法。不要让所有的事情都由CPU来完成,尽量使用GPU。

没有一个简单的答案。

当你的游戏中的每个实体都可以在不知道任何其他实体的情况下进行计算时,你就可以简单地将计算移到给定的线程数量上。线程池将是一个很好的开始。您可以在程序启动时设置它。但即使这样做了,您也必须检查切换线程是否比使用单个线程更好。上下文切换是这里你可以搜索的关键字。

但是,当线程A上的实体A对线程B上的实体B进行计算并强制实体B被销毁时,线程C上的实体C也会被销毁,会发生什么?现在让它变得更难:P实体C在实体B之前计算,在实体A之前…

应该发生什么?这些实体可以在未来的2到3帧内被清理吗?它是否会影响或破坏你的游戏逻辑?