Какая хорошая архитектура для симулятора жизни - PullRequest
2 голосов
/ 16 апреля 2011

Я думал на днях о создании небольшого симулятора жизни. Я только обдумал эту идею, и мне было интересно, как лучше реализовать ее, чтобы она работала эффективно.

На самом низком уровне будут удивляться мужские и женские сущности, а когда они встретятся, они произведут потомство.

Я хотел бы использовать многопоточность для управления объектами, но я не уверен в количестве потоков и т. Д.

Было бы лучше иметь пару потоков, управляющих мужчинами и женщинами, или было бы нормально запустить поток для каждой сущности, чтобы каждый экземпляр работал в своем собственном потоке?

Я прочитал несколько постов о максимальном количестве потоков и пределах от 20 до 1000 потоков в приложении.

У кого-нибудь есть предложения по архитектуре?

N

Ответы [ 3 ]

15 голосов
/ 16 апреля 2011

НЕ ИМЕЙТЕ ОДНОЙ РЕЗЬБЫ НА ЛИЦО .Это рецепт катастрофы.Это не то, для чего были созданы темы.Нити очень тяжелые;помните, что каждый поток потребляет один миллион байтов виртуального адресного пространства немедленно .Кроме того, помните, что каждый раз, когда два потока взаимодействуют в общей структуре данных - например, в вашем смоделированном мире - они должны снимать блокировки, чтобы предотвратить повреждение.Ваша программа будет массой из сотен заблокированных тем, а заблокированные темы бесполезны;они не могут работать.Высокая конкуренция - это анафема хорошей производительности, а множество потоков, совместно использующих одну структуру данных, - это не что иное, как постоянная конкуренция.

Количество потоков в вашей программе должно составлять один , если только у вас нет очень хорошихпричина иметь два.В общем, количество потоков в программе должно быть настолько маленьким, насколько вы можете это сделать, при этом получая требуемые характеристики производительности.

Если ваша программа действительно "смущающе параллельна" -то есть очень легко выполнять вычисления параллельно без блокировки общей структуры данных - тогда правильное количество потоков равно количеству ядер процессора в машине.Помните, что потоки замедляют друг друга .Если у вас есть четыре кассира банка, и каждый обслуживает одного клиента, дела идут быстро.Вы описываете ситуацию, когда у вас есть четыре банковских кассира (ядра ЦП), каждый из которых обслуживает сто человек в то же время , раздавая копейки круговым методом.

Моделирование редко бывает смущающим, потому что трудно разбить работу на независимые части.Трассировка лучей, например, смущающе параллельна;содержимое одного пикселя не зависит от содержимого любого другого пикселя, поэтому его можно рассчитать параллельно.Но у вас не будет одной нити на пиксель!У вас будет один поток на процессор, и каждый из четырех процессоров будет работать с четвертью пикселей.Это сложно сделать с помощью симуляций, потому что сущности do взаимодействуют друг с другом.

Высококачественные профессиональные симуляторы, такие как физические движки, которые должны иметь дело с взаимодействующими сущностями, не решают свои проблемы с потоками.,Как правило, у них будет один поток, выполняющий моделирование, и один поток, выполняющий пользовательский интерфейс, чтобы при дорогостоящем вычислении моделирования не зависал пользовательский интерфейс.

Правильная архитектура для вас, вероятно, состоит в том, чтобы один поток шел как симулятор.Проработайте все взаимодействия объектов для одного кадра, а затем подайте сигнал потоку пользовательского интерфейса, который необходимо обновить.Это позволит вам определить максимальную частоту кадров, измерив, сколько микросекунд требуется для проработки всех взаимодействий каждой сущности.

1 голос
/ 16 апреля 2011

Я предполагаю, что ваше приложение управляет временной шкалой в дельта-Ц.

Вы можете использовать параллельную среду C # 4.0 и работать с ЗАДАЧАМИ, а не с потоками.

Каждая дельта-Т запускает параллель для обновления сущностей.

Параллельная структура решает, сколько потоков открыть и управлять потоками.

1 голос
/ 16 апреля 2011

Использование сотен потоков (что бы Sleep () много) не является хорошим решением.Вам быстро не хватит памяти.

TPL может сделать эту идею работоспособной, но на самом деле она не была разработана для этого.

Изучите моделирование дискретных событий и волокна.Для .NET

есть библиотеки псевдо-волокон
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...