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