Как использовать игровые циклы для запуска групповых сообщений SignalR?

Фон

Я создал игру поверх 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);
    }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Внутри ядра Asp.net я предлагаю вам использовать фоновую службу для достижения ваших требований. Внутри фоновой службы вы можете написать логику для вызова концентратора для отправки группового сообщения каждые 5 секунд.

Чтобы узнать, как вызвать ihubcontext, вы можете обратиться к этой статье и этому образцу.

Чтобы узнать, как использовать фоновую службу, вы можете обратиться к этой статье.

Итак, глядя на приведенную выше информацию, кажется, что стратегия состоит в том, чтобы иметь единую фоновую службу, которая запускается в фоновом режиме и создается при запуске. Затем эта фоновая служба будет постоянно опрашивать или проверять запущенные игры, а затем транслировать активное состояние всех живых игр. Это только мне кажется, что это ужасно неэффективно?

jmanghera 10.01.2023 10:56

Спасибо, что наставили меня на правильный путь. Мне удалось внедрить фоновую службу, которая выходит далеко за рамки моей игровой логики, чтобы опрашивать GameRooms и транслировать состояние игры. Хотя у меня есть решение проблемы — по-прежнему кажется очень глупым поддерживать фоновую службу все время работающей, даже когда в игры не играют — я постараюсь оптимизировать это дальше. А пока спасибо за ваш ответ, я отмечу его как принятый.

jmanghera 10.01.2023 15:58

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