Допустим, у меня есть модель предметной области, которую я пытаюсь сделать совместимой с многопоточностью.
Домен-прототип - это игровой домен, состоящий из объектов Space, SpaceObject и Location.
У SpaceObject есть метод Move, а Asteroid и Ship расширяют этот объект определенными свойствами для этого объекта (у Ship есть имя, а у Asteroid есть цвет)
Допустим, я хочу, чтобы метод Move для каждого объекта выполнялся в отдельном потоке. Это было бы глупо, потому что с 10000 объектами у меня было бы 10000 потоков. Как лучше всего разделить рабочую нагрузку между ядрами / потоками?
Я пытаюсь изучить основы параллелизма и создаю небольшую игру для прототипирования многих концепций.
То, что я уже сделал, это построение домена и модель потоков с таймером, который запускает события на основе интервалов. Если событие происходит, я хочу обновить всю мою модель новыми местоположениями любого SpaceObject.
Но я не знаю, как и когда запускать новые потоки с рабочими нагрузками, когда происходит событие.
Некоторые люди на работе говорили мне, что вы не можете обновить ваш многопоточный основной домен, потому что вы должны синхронизировать все. Но в этом случае я не могу запустить свою игру на двухъядерном сервере, потому что он будет использовать только 1 процессор для самых сложных задач.
Кто-нибудь знает, что здесь делать?
Спецификация реакции на Deltreme:
Вы абсолютно правы, и ваш метод будет работать в большинстве случаев. НО,
Потоки должны обновить местоположение космического объекта в классе Space.
Допустим, у меня есть 2 космических объекта рядом друг с другом, они движутся в направлении друг друга. 1 Объект находится в потоке A, другой находится в потоке B.
Как только я обновляю объекты, потоки должны записать в пространство вместе, чтобы записать новые значения в плитку (отдельную часть пространства). Этот индивидуальный вызов не может быть выполнен одновременно в разных потоках, потому что объект Space может разорваться ...
То, что могло бы произойти, - это столкновение, и я мог бы написать Событие, которое происходит, если их 2 корабля при 1 плитке. Это не проблема.
Я думаю, что в случае 10000 кораблей ЦП будет в основном переключаться между потоками, а не запускать их все вместе.
Так что в интересах исполнения я хочу, чтобы "все" было одновременно