Соображения по поводу игры-симулятора

StackOverflow https://stackoverflow.com/questions/160318

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Что-то больше похожее на серию Settlers.

Предположим, мне в данный момент не нужна никакая графика, что Думаю, я справлюсь.

Итак, мои сомнения заключаются в следующем:

  1. Должна ли каждая сущность быть классом и иметь поток?
  2. Должны ли сущности быть сгруппированы в списки внутри классов, и у каждого из них должен быть поток?

Если взять реализацию 1, ее будет очень сложно запустить на машинах с низкими характеристиками, и она не будет хорошо масштабироваться для больших чисел.

Если взять реализацию 2, она будет лучше с точки зрения ресурсов, но тогда...

Как мне сгруппировать объекты?

  1. У вас есть класс для домов в целом и список интерфейсов для управления этим?
  2. У вас есть класс для определенных групп домов и список объектов для управления этим?

а что насчет тредов?

  1. Должен ли я использовать упрощенный основной цикл игры?
  2. Должен ли я иметь тему для каждой группы классов?
  3. Как в эту картину вписываются рабочие/перевозчики?
Это было полезно?

Решение

Обычный подход вообще не использует многопоточность, а скорее реализует сущности как конечные автоматы.Тогда ваш основной цикл будет выглядеть так:

 while( 1 )
{
    foreach( entity in entlist )
    {
        entity->update();
    }

    render();
}

Другие советы

MMORPG Eve Online использует безстековый Python и модель актера для эмуляции поточной системы без обращения к ресурсам.

Перейдите по этой ссылке для получения дополнительной информации:http://harkal.sylphis3d.com/2005/08/10/multithreaded-game-scripting-with-stackless-python/

Я совершенно уверен, что вам нужен только один поток, выполняющий игровую логику.Наличие нескольких потоков ничего не ускорит, а только запутает код.Наличие основного игрового цикла — это прекрасно, хотя все становится несколько сложнее, если в игре есть многопользовательский режим.

Меня немного смущает часть вашего вопроса, касающаяся занятий.Если я правильно понимаю ваш вопрос, я бы предложил создать класс для каждого типа дома (свиноферма, ветряная мельница и т. д.), производный от общего абстрактного базового класса. House.Затем вы сохраните все дома игрового мира в списке домов.

Подумайте об использовании Erlang.С Erlang вы можете создавать гораздо больше процессов (= облегченных потоков), чем обычный системный поток.Далее он распределяется, то есть, если ваша система недостаточно хороша, добавьте еще один узел.

Другой альтернативой может быть Python без стека (или текущая альтернатива Python), поскольку он также поддерживает своего рода облегченный поток, что очень здорово для игровых движков.Eve Online использует его на своих серверах.Но он не распространяется, но этого можно легко добиться вручную.

Хотя ответ @Mike F в основном правильный, вы должны иметь в виду, что итерация по объектам в foreach цикл делает порядок оценки значительно детерминированным, что имеет нежелательные побочные эффекты.С другой стороны, введение потоков открывает потенциал для Гейзенбагс и проблемы параллелизма, поэтому лучший способ, который я видел и использовал, основан на объединении двух циклов:первый собирает действия агентов/воркеров на основе предыдущего состояния, второй цикл компонует результаты действий и обновляет состояние симуляции.Чтобы избежать возможной систематической ошибки, в каждом цикле порядок оценки рандомизируется.Кстати, это масштабируется до массового параллельного вычисления при условии синхронизации в конце каждого цикла.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top