Я работаю над игрой RTS на C++, ориентированной на портативное оборудование (Pandora). Для справки, Pandora имеет один процессор ARM с частотой ~ 600 МГц и работает под управлением Linux. Мы пытаемся установить хорошую систему передачи сообщений (как внутреннюю, так и внешнюю), и для меня это новая территория.
Это может помочь привести пример сообщения, которое мы хотели бы передать. Юнит может сделать этот вызов, чтобы загрузить свои модели в память:
sendMessage("model-loader", "load-model", my_model.path, model_id );
Взамен модуль может ожидать какое-то сообщение, содержащее объект модели для конкретного model_id, которое затем может быть передано в графическую систему. Обратите внимание, что эта функция sendMessage никоим образом не является окончательной. Это просто отражает мое текущее понимание систем передачи сообщений, что, вероятно, неверно :)
Из того, что я могу сказать, есть два довольно разных варианта. Один из них — передавать сообщения в память и передавать их по сети только тогда, когда вам нужно поговорить с внешней машиной. Мне нравится эта идея, потому что накладные расходы кажутся низкими, но большая проблема здесь заключается в том, что вам нужно широко использовать блокировку мьютекса в ваших очередях сообщений. Я действительно хотел бы избежать избыточной блокировки, если это возможно. Я читал несколько способов реализовать простые очереди без блокировки (полагаясь на атомарные операции int
), но они предполагают, что для очереди есть только один читатель и один писатель. В нашем конкретном случае это не кажется полезным, так как в очереди объекта будет много писателей и один читатель.
Другой вариант — полностью пройти сетевой уровень. У этого есть некоторые забавные преимущества, такие как асинхронная передача сообщений практически бесплатно. Кроме того, мы получаем возможность передавать сообщения другим машинам, используя те же вызовы, что и при передаче локально. Однако это решение меня не устраивает, вероятно, потому, что я не совсем его понимаю :) Нужен ли нам сокет для каждого объекта, который будет отправлять/получать сообщения? Если да, то это кажется чрезмерным. В данной игре будут тысячи объектов. Я опасаюсь, что для такого маломощного устройства, как Pandora, такое злоупотребление сетью может стать нашим узким местом. Но я еще не проводил никаких тестов, так что это только предположение.
MPI, кажется, популярен для передачи сообщений, но он кажется излишним для того, что мы хотим. Этот код никогда не коснется кластера и не потребует сложных вычислений.
Мы очень ценим любое понимание того, какие варианты у нас есть для достижения этой цели.