Актерская модель и обнаружение столкновений
Я просто думаю о возможности Erlang для игрового сервера. (о, я не эксперт по Erlang, просто рассматриваю этап). Это означает использование модели актера для симуляции игры. Конечно, самая большая привлекательность - это параллелизм, распределенный по нескольким узлам.
Мой текущий огромный вопрос заключается в том, как мне выполнять многоакторные взаимодействия, такие как обнаружение столкновений. (это всего лишь пример)
Хотя обнаружение столкновений по сути требуется в любой игре, но по своей природе модель актора не выглядит эффективной и даже не имеет смысла, поскольку требует глобально синхронизированного запроса состояния и обновления для всех действующих лиц. И если я использую какую-либо синхронизацию, она отменяет все преимущества модели актера Эрланга.
Конечно, если я правильно использую разделение пространства, таргетинг на актеров может быть меньше, но это всего лишь оптимизация, а не принципиальный ответ. Или это правильный ответ на этот вопрос? Уменьшение диапазона синхронизации за счет уменьшения количества взаимодействующих субъектов?
2 ответа
Разделите карту на более мелкие части, и пусть каждая часть будет иметь свой собственный процесс (вы можете даже разделить ее так, чтобы каждая плитка была отдельным процессом). Игрок, пытающийся двигаться, отправит сообщение на плитку / субкарту, сообщающее, что оно идет туда, и клетка отвечает, если все в порядке или нет. Это позволяет избежать коллизий, поскольку плитка / подкарта обрабатывает только одно сообщение за раз. Несколько вложенных карт / плиток могут обрабатывать сообщения одновременно, поэтому это все еще параллельная программа.
У меня есть космическая игра, делающая сервер в Эрланге. Хитрость в том, что каждая локация / узел / и т. Д. Тоже является актером. Он непрерывно управляет физикой и регулярно отправляет информацию каждому действующему субъекту игры.
Все становится намного чище, когда вы начинаете более абстрактно думать о том, что такое актер / сущность. Например, столкновения могут быть полноценными актерами. Это делает клиентскую часть намного проще - привязать графические и звуковые эффекты к столкновению. На стороне сервера это также предотвращает множественные эффекты столкновения между двумя объектами более одного раза в течение определенного времени.