【问题标题】:C# Multithreaded Domain DesignC# 多线程域设计
【发布时间】:2010-04-07 08:49:32
【问题描述】:

假设我有一个域模型,我试图使其与多线程兼容。 原型域是由 Space、SpaceObject 和 Location 对象组成的游戏域。 SpaceObject 具有 Move 方法,Asteroid 和 Ship 使用对象的特定属性扩展此对象(Ship 有名称,Asteroid 有颜色)

假设我想让每个对象的 Move 方法在单独的线程中运行。那将是愚蠢的,因为有 10000 个对象,我将有 10000 个线程。在内核/线程之间分离工作负载的最佳方法是什么?

我正在尝试学习并发的基础知识,并构建一个小游戏来制作很多概念的原型。

我已经完成的是构建一个域和一个线程模型,该模型带有一个基于时间间隔启动事件的计时器。如果事件发生,我想用任何 SpaceObject 的新位置更新我的整个模型。 但我不知道事件发生时如何以及何时启动具有工作负载的新线程。

工作中的一些人告诉我,您不能多线程更新您的核心域,因为您必须同步所有内容。但在那种情况下,我无法在双四核服务器上运行我的游戏,因为它只会使用 1 个 CPU 来完成最困难的任务。

有人知道在这里做什么吗?

对 Deltreme 的反应规范:

你是绝对正确的,你的方法在大多数情况下都行得通。但, 线程必须更新 Space 类中空间对象的位置。

假设我有 2 个彼此相邻的 SpaceObject,它们正朝着彼此移动。 1个对象在线程A中,另一个在线程B中。 一旦我更新了对象,线程必须一起写入空间以将新值写入 Tile(空间的单独部分)。那个单独的调用不能同时在不同的线程中完成,因为 Space 对象会爆裂......

可能发生的是碰撞,我可以编写一个事件,如果它们是 2 艘船 @ 1 个瓦片则发生。这不是问题。

我认为在 10000 艘船的情况下,CPU 将主要在线程之间切换,而不是同时运行它们。 所以为了性能,我希望能够同时“一切”

【问题讨论】:

    标签: c# multithreading concurrency asynchronous


    【解决方案1】:

    您可以使用System.Threading.ThreadPool 或即将推出的任务并行库来根据可用内核数自动管理您的线程数。

    解决并发问题的一种可能方法是仅锁定当前 SpaceObject 可以与之交互的其他 SpaceObject。在大多数情况下,这将提供足够的性能,但在最坏的情况下,处理大型交互将由单个线程完成。您需要锁定多少最终取决于您的模拟参数。如果对象不能在计时器的一个滴答声内完全相互穿过,您可以只检查重叠的对象。对于快速移动的对象,您需要检测相交的运动矢量。

    【讨论】:

    • 谢谢,这很有帮助,这意味着我可以在最坏的情况下优化 0%,在最好的情况下优化 100%。你知道有什么方法可以进一步提高这些几率吗?
    【解决方案2】:

    我假设您创建快照:在情况 A,每个 SpaceObject 都位于某个位置,并且在每个 SpaceObject 移动到另一个位置后,您会到达情况 B。

    对于 10000 个对象,情况 A 和 B 之间的转换是 10000 次移动调用。 Move() 听起来是一种相当快的方法,即。使用当前位置和方向来创建一个新位置。

    在这种情况下,您可以创建 10 个线程(或使用 ThreadPool)并为其分配 50 个 SpaceObject,然后它将为其计算新位置。如果一个线程已完成,但仍有需要移动的 SpaceObjects,则为该线程分配另外 50 个。

    【讨论】:

      【解决方案3】:

      正如 Hirvox 所说,ThreadPool 是一个不错的选择。我会避免考虑每个 SpaceObject 的线程,而是将其视为一个大队列 SpaceObjects,它们都需要在一个间隔内更新它们的位置,然后使用线程进行移动计算,当你出队时移动物体;这非常适合线程池。它可能不是一个实际的队列,而是一个排序字典,但你明白了。

      完成移动计算后,使用类似方法处理任何碰撞。处理快动者的一种方法是在非常短的间隔内工作,每个间隔更新快动者,每隔一个间隔左右更新中动者,每十个间隔更新慢动者。

      只是为了好玩,请考虑使用显卡进行计算 - 高端 GPU 已针对大量同时计算进行了优化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多