【发布时间】: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