Предположим, у меня есть модель домена, которую я пытаюсь сделать совместимой с многопоточным. Домен прототипа - это игровой домен, состоящий из объектов Space, SpaceObject и Location. В SpaceObject есть метод Move, а Asteroid и Ship расширяют этот объект со специфическими свойствами объекта (у корабля есть имя, а у астероида есть цвет)C# Многопоточный дизайн домена
Предположим, я хочу, чтобы метод Move для каждого объекта выполнялся в отдельная нить. Это было бы глупо, потому что с 10000 объектами у меня было бы 10000 потоков. Каким будет лучший способ разделить рабочую нагрузку между ядрами/потоками?
Я пытаюсь изучить основы параллелизма и создать небольшую игру, чтобы прототипировать множество концепций.
Что я уже сделал, это создание домена и потоковая модель с таймером, который запускает события на основе интервалов. Если произойдет событие, я хочу обновить всю свою модель новыми местоположениями любого SpaceObject. Но я не знаю, как и когда запускать новые потоки с рабочими нагрузками, когда происходит событие.
Некоторые люди на работе сказали мне, что вы не можете обновить свой основной домен многопоточным, потому что вам нужно синхронизировать все. Но в этом случае я не могу запустить свою игру на двухъядерном сервере, потому что он будет использовать только 1 процессор для самых сложных задач.
Кто-нибудь знает, что делать здесь?
Спецификация в реакции Deltreme:
Вы Absolutly правильно, и ваш метод будет работать в большинстве случаев. BUT, Потоки должны обновить местоположение космического объекта в классе Space.
Предположим, у меня есть 2 SpaceObjects рядом с eachother, они движутся к eachother. 1 Объект находится в потоке A, другой - в потоке B. Как только я обновляю объекты, потоки должны записывать в Пространство вместе, чтобы писать новые значения в Плитке (отдельная часть Пространства). Этот индивидуальный вызов не может быть выполнен в разных потоках сразу, потому что объект Space будет лопнуть ...
Что может случиться, это столкновение, и я могу написать событие, которое происходит, если они имеют 2 корабля @ 1 плитки. Это не проблема.
Я думаю, что в случае 10000 кораблей CPU будет в основном переключаться между потоками, а не запускать их все. Итак, в интересах производительности, я хочу иметь возможность «все» одновременно
Спасибо, thats helpfull, это означало бы, что я могу оптимизировать 0% в худшем случае и 100% в лучшем случае scneario's. Вы знаете, какой способ улучшить эти шансы? –