Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Железо будет недоиспользоваться. Задавили один из AI и всё — его физическое железо простаивает...
Зато будет достаточно честный бенчмарк. Я собственно не очень понимаю зачем гарантированно ставить различные AI в равные условия кроме именно соревновательных. Если мы возьмем именно игры, то если мы заморачиваться не будем, то в среднем каждый поток один черт будет примерно в равных условиях, естественно при условиях что число потоков меньше чем количество ядер процессора. Да и даже если какой AI получит преимущество не честно, ну и хрен с ним. Тебе нужно то сделать чтоб игроку было интересно. Или у тебя игра программисткая, соответственно игрок кодит эти AI и далее они сравниваются кто лучше накодил?
A> вопрос, хватит ли людям 4 мин макс на адекватную реакцию на изменения в мире
Вот это вообще не вопрос. Можно ведь сделать завершение хода по мере готовности человека.
Если ему понадобится пять минут, ну значит AI тогда получат эту дополнительную минуту, так как думают в то же время.
Здравствуйте, Эйнсток Файр, Вы писали:
E>> каждый worker ограничен не по времени, в по числу итераций. ЭФ>Я ничего не понял. Что такое итерация? Ты мне предлагаешь делать виртуальный процессор и считать виртуальные инструкции вручную? ЭФ>Просто представь, что алгоритмы AI разные, и работу за один условный ход они проделывают разную.
Нужно опираться не на реальное время, а на внутриигровые такты. Такт — это атомарное действие в рамках игры. Скажем, игрок 1 делает шаг на север — это отнимает один такт. Далее всем игрокам выдаётся одинаковое количество тактов.
ВВ>Нужно опираться не на реальное время, а на внутриигровые такты. Такт — это атомарное действие в рамках игры. Скажем, игрок 1 делает шаг на север — это отнимает один такт. Далее всем игрокам выдаётся одинаковое количество тактов.
Проблема моей игры в том, что там надо мало двигаться и много думать. И кто больше думает — быстрее выигрывает.
Что толку, если они будут двигаться одинаково, но при этом один из них будет это делать на пару порядков умнее?
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Проблема моей игры в том, что там надо мало двигаться и много думать. И кто больше думает — быстрее выигрывает.
Поэтому я предложил тебе сначала измерить, кто сколько времени "думает" и на какие думы он это время тратит, что позволит разбить одну думу на стадии и выявить наличие узких мест.
Возможно, что все укладываются в 4 мин, и ещё 2/3 времени бездействуют.
Здравствуйте, Эйнсток Файр, Вы писали:
ВВ>>Нужно опираться не на реальное время, а на внутриигровые такты. Такт — это атомарное действие в рамках игры. Скажем, игрок 1 делает шаг на север — это отнимает один такт. Далее всем игрокам выдаётся одинаковое количество тактов.
ЭФ>Проблема моей игры в том, что там надо мало двигаться и много думать. И кто больше думает — быстрее выигрывает. ЭФ>Что толку, если они будут двигаться одинаково, но при этом один из них будет это делать на пару порядков умнее?
То есть надо, чтобы процессорных ресурсов каждому такому "игроку" выделялось абсолютно одинаковое количество? Мне кажется, тут такое "в лоб" решить не получится. Зависит от того, как AI "думает". Если это можно представить в виде оп-кодов для виртуальной машины, то тогда и исполнять последовательно — оп-код одного "игрока", затем "другого". Да и то возникает вопрос в равноценности разных оп-кодов. Это уже надо смотреть более предметно.
ВВ> исполнять последовательно — оп-код одного "игрока", затем "другого"
Чисто теоретически это необязательно (переключаться через каждый опкод).
Можно выполнять по N опкодов подряд и затем переключаться.
Будет погрешность, но она будет контролируемая.
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Как в дотнете организовать многопоточное приложение таким образом, чтобы нити, выполняющие расчёты за разных AI-игроков, получали одинаковое количество процессорных ресурсов в час (или в другой промежуток времени)?
Для винды можно использовать WinAPI: GetThreadTimes, SuspendThread, ResumeThread.
То есть запустить каждого AI-игрока в отдельном потоке, а ещё одним управляющим потоком периодически замерять время, потраченное потоками игроков, и те потоки, которые потратили времени больше других, ставить на паузу соответствующей продолжительности.
Здравствуйте, Эйнсток Файр, Вы писали:
ВВ>> исполнять последовательно — оп-код одного "игрока", затем "другого" ЭФ>Чисто теоретически это необязательно (переключаться через каждый опкод). ЭФ>Можно выполнять по N опкодов подряд и затем переключаться. ЭФ>Будет погрешность, но она будет контролируемая.
А вам исполнение нескольких оп-кодов подряд никаких преимуществ не даст, только усложнение реализации. Впрочем, это уже детали, смотрите сами.