Как выстроить приложение .NET с большим числом циклично изменяющихся элементов?
Добрый день.
Делаю небольшую игрушку на dotNet, в ней фигурируют однотипные элементы (порталы). Каждый портал живет в цикле активация\дезактивация, у каждого свое время жизни\простоя. При активации\дезактивации происходит некоторое событие. Какую архитектуру использовать для системы?
Цепляться к таймеру сотней порталов и проверять на каждом тике, пора ли переключать какие-либо элементы?
Создать метод, вызывающий смену статуса через n секунд, и вызывать его в новом потоке в конце себя?
Создать отсортированный по времени список ожидаемых изменений, и проверять на каждом тике таймера, пора ли менять первый портал?
Количество порталов ориентировочно не более 1000.
создать класс портала, в классе при его создании запускать task или thread в котором будет Thread.Sleep в соответствии с циклами после активации можно использовать event или производить обработку внутри объекта силами таски. При таком подходе легко потянет в сотнях тысяч не говоря о тысяче.
lam0x86: ничего нового, чего я не знал в статье нет, естественно использование потоков создает оверхед на переключение контекста, естественно потоки жрут память, естественно что если потоки сделаны криво и блокируют друг друга работать будет хреново, но в контексте задачи, без супер графики и спецэффектов при 1000 объектов (что я думаю взято с запасом) это все не имеет значение, если конечно игрок не будет сидеть с компом из 80х. Но за подсказку о TaskPoolScheduler полностью согласен, раеньше с RX не сталкивался.
В RX есть отличный набор классов с общим интерфейсом IScheduler, которые позволяют планировать задачи на исполнение в нужное время и с нужным интервалом. В Вашем случае подойдёт TaskPoolScheduler.
Но вообще, в играх часто используют подход с обычным циклом, в котором происходит обработка очередного игрового кадра. На каждой итерации определяется игровое время, и на его основе обрабатываются события.