Фон
Я создал игру поверх SignalR в среде .NET и сейчас переношу ее на ядро dotnet. В рамках этого у меня есть несколько «Игровых комнат», в каждой из которых может разместиться до 6 игроков. Я использую функциональность SignalR Group
для поддержки концепции GameRoom
— никаких проблем.
Вопрос
Мой вопрос, как мне сделать так, чтобы каждый GameRoom
автоматически рассылал сообщения каждые 5 секунд всем членам группы?
У меня есть один GameHub.cs
, у которого есть List<GameRoom>
. Затем каждый GameRoom
сохраняет все данные (счета, игроки, пользователи SignalR, имя группы SignalR и т. д.) для соответствующей игры. Внутри игровой комнаты у меня есть игровой цикл, который я хочу использовать для передачи данных игрокам. Игровые комнаты статичны на время игры.
Я не могу установить, правильно ли мое моделирование зависимостей в новом мире ядра dotnet.
Например: GameHub
--> GameRoom
, который, в свою очередь, содержит простой цикл Timer
. Внутри этого таймера я не знаю, как вызвать GameHub для передачи сообщений.
В .NET я мог использовать GlobalHost
, чтобы получить GameHub
и транслировать групповое сообщение. Что-то вроде этого было в порядке, как можно сделать что-то подобное для реализации ядра dot-net? Как использовать игровые циклы для запуска групповых сообщений SignalR?
class GameRoom
{
List<player> _players;
Scoreboard _scores;
string _gameRoomName;
...
void GameLoop_Timer_Elapsed(object sender, ElapsedEventArgs e)
{
var context = GlobalHost.ConnectionManager.GetHubContext<Game>();
context.Clients.Group(_gameRoomName).SendMessage(_gameState);
}
}
Внутри ядра Asp.net я предлагаю вам использовать фоновую службу для достижения ваших требований. Внутри фоновой службы вы можете написать логику для вызова концентратора для отправки группового сообщения каждые 5 секунд.
Чтобы узнать, как вызвать ihubcontext, вы можете обратиться к этой статье и этому образцу.
Чтобы узнать, как использовать фоновую службу, вы можете обратиться к этой статье.
Спасибо, что наставили меня на правильный путь. Мне удалось внедрить фоновую службу, которая выходит далеко за рамки моей игровой логики, чтобы опрашивать GameRooms и транслировать состояние игры. Хотя у меня есть решение проблемы — по-прежнему кажется очень глупым поддерживать фоновую службу все время работающей, даже когда в игры не играют — я постараюсь оптимизировать это дальше. А пока спасибо за ваш ответ, я отмечу его как принятый.
Итак, глядя на приведенную выше информацию, кажется, что стратегия состоит в том, чтобы иметь единую фоновую службу, которая запускается в фоновом режиме и создается при запуске. Затем эта фоновая служба будет постоянно опрашивать или проверять запущенные игры, а затем транслировать активное состояние всех живых игр. Это только мне кажется, что это ужасно неэффективно?