【问题标题】:Parallel programming in games游戏中的并行编程
【发布时间】:2011-11-09 10:19:00
【问题描述】:

在我的游戏中,我有实体(大约 2000 到 5000 个)每帧(或每 2 或 3 帧)执行非常繁重的计算。

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

我尝试了 .NET 中的静态 Parallel 类,但每个 Parallel.For / Parallel.ForEach 的启动成本简直太高了。

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

所以我的问题是: 并行处理多个实体还有哪些其他选择? 我应该自己创建线程吗?如果是,有什么陷阱? 线程池是一个不错的选择吗?

【问题讨论】:

    标签: c# .net parallel-processing


    【解决方案1】:

    默认情况下,Parallel.For/Parallel.Foreach 使用 ThreadPool 线程。 Infact TPL api(如 Parallel 类、Task 实例等)使用 ThreadPool 线程。

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

    重要的一点是您可以通过 MaxDegreeOfParallelism 标志控制使用 TPL 执行任务的线程数。通过将此值设置为数字“X”,您可以将正在处理的并发项目数限制为“X”。个人觉得这是TPL库的一个非常强大的特性。

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

    在您的情况下,您可以尝试使用 Parallel.For/ForEach 并将 MaxDegreeOfParalleleism 值设置为某个最佳值,然后查看其行为方式。

    【讨论】:

    【解决方案2】:

    您需要一些计算机或服务器来测试您的并行编程游戏。否则在单台计算机上,因为它会在线程上工作,所以成本会更高。

    此外,由于游戏是在一秒钟内计算和绘制 60 次的,因此在线程上工作是不合逻辑的,您的游戏已经在线程上运行。

    也许您必须更改或优化您的算法。不要让一切都由 CPU 完成,尽可能使用 GPU。

    【讨论】:

    • 为什么他的游戏在不使用任何线程的情况下运行在线程上?他有一个单一的游戏循环,在一个线程上运行,这也是渲染线程。
    • @user743414 更新和渲染操作有不同的方法。您可以并行运行这两个任务,或者可以进行第一次更新,然后渲染将跟随它,等等。游戏开发需要线程,以便它可以使用所有 CPU 能力。不仅游戏循环也更新可能使用线程。
    • 当然你可以在不同的线程上运行这两个操作。问题是同步这两个线程是否比仅在一个线程上同步需要更多时间?从一个线程切换到另一个线程是一项昂贵的操作。我写了,我也写了线程有什么问题,他必须检查他的游戏逻辑是否会中断。
    • @user743414 我写下了最知名的方法,因此您可以并行运行它们。性能取决于您的核心数量和线程使用情况。正如您所提到的,切换线程并不昂贵,因为它们在同一个内存块中运行。好吧,您可能需要互斥锁或信号量,但这也取决于您的设计。想想为游戏平板电脑设计的处理器,如果游戏只能在一个内核上运行,为什么它们会有多个内核?
    【解决方案3】:

    没有一个简单的答案。

    如果您的游戏中的每个实体都可以在不知道任何其他实体的情况下进行计算,那么您只需将该计算移至给定数量的线程即可。线程池将是一个好的开始。 您可以在程序启动时进行设置。 但即使你这样做了,你也必须检查切换线程是否比单线程执行得更好。上下文切换是你可以搜索的关键字。

    但是,当线程 A 上的实体 A 进行计算并影响线程 B 上的实体 B 并强制实体 B 被销毁,从而迫使线程 C 上的实体 C 也​​被销毁时,会发生什么? 现在更难了:P 实体 C 是在实体 B 之前计算的,在实体 A 之前...

    应该发生什么?以后这些实体分2、3帧清理可以吗? 它会影响或破坏你的游戏逻辑吗?

    如果是这样,那么事情就变得复杂了。

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 2011-03-05
      • 2012-04-25
      • 1970-01-01
      • 2023-03-14
      • 2011-02-07
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多