1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jisol-ngame

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

JNGame

介绍

NGame — это Java-фреймворк для разработки сетевых игровых серверов, основанный на Spring Boot и Netty. Он идеально поддерживает IOC (Inversion of Control) и AOP (Aspect-Oriented Programming).

JNGame предлагает RPC-вызовы, использует WebSocket и UDP, имеет зрелый API с аннотациями и позволяет быстро запускать различные серверы.

NGame также включает в себя различные игровые движки для многопользовательских игр и синхронизации, включая Cocos, Unity и другие.

Обновление проекта продолжается...

Если у вас возникли проблемы, пожалуйста, свяжитесь со мной по QQ:2858626794.

Архитектура программного обеспечения

Master — код сервера JNGame, который содержит основной код NGame и код для каждого демонстрационного сервера.

--- Cocos ---

  1. Cocos — пример игрового движка Cocos с синхронизацией состояния (физическая передача прав). Пример почти завершён.
  2. Cocos-Frame — пример игрового движка Cocos с фреймовой синхронизацией (физическое предсказание отката невозможно). Пример почти завершён, но физическое предсказание отката не реализовано.
  3. Cocos-State — пример игрового движка Cocos с синхронизацией состояний. Пример почти завершён.

--- Unity ---

  1. Unity — пример игрового движка Unity с синхронизацией состояния (передача физических прав). Пример выполнен на 60%.
  2. Unity-Frame — пример игрового движка Unity с фреймовой синхронизацией. Пример завершён на 100%.

--- UE4 [в настоящее время нет времени на реализацию] ---

Режимы синхронизации

Синхронизация состояний: синхронизация осуществляется через передачу состояний от каждого клиента. Этот режим подходит для длительной синхронизации и поддерживает физическую передачу прав.

Преимущества:

  • Подходит для длительной синхронизации.

Недостатки:

  • Большой объём данных.

Фреймовая синхронизация: синхронизация происходит через передачу операций от каждого клиента и отслеживание фреймов. Этот режим требует поддержки физического определения от игрового движка.

Преимущества:

  • Небольшой объём данных.

Недостатки:

  • Не подходит для длительной синхронизации.
  • Требуется поддержка физического определения от игрового движка.

Синхронное состояние: сервер моделирует мир и отправляет состояния клиентам (в настоящее время реализуется через мост NGame).

Преимущества:

  • Подходит для длительной синхронизации.
  • Безопасен.

Недостатки:

  • Большой объём данных.
  • Низкая эффективность разработки (сложно).

Документация NGame

Запуск NGame

Чтобы запустить NGame, выполните следующие шаги:

  1. Клонируйте код с помощью команды git clone https://gitee.com/jisol/ngame.
  2. Откройте проект в редакторе IDEA.
  3. Запустите проект.

Структура каталогов NGame

Каталог NGame содержит следующие папки:

  • client — пакет для клиентского приложения.
  • demo — примеры демонстрационных приложений.
  • listener — запуск NGame (игнорируется).
  • ncall — расширение функций NGame (игнорируется).
  • netty — пакет протоколов NGame Netty.
  • proto — базовый Protobuf.
  • room — пакет комнат.
  • rpc — реализация RPC.
  • sync — пакет синхронизации.
  • util — инструменты NGame (игнорируются).

RPC

Для использования RPC в NGame выполните следующие действия:

  1. Объявите класс как класс RPC с аннотацией @NGameRPCClass.
  2. Объявите метод как метод RPC с аннотацией @NGameRPCMethod и укажите режим RPC (DEFAULT для обычного режима или UID для режима ID).
  3. Укажите параметры метода с использованием аннотации @NRPCParam.
  4. Вызовите RPC с помощью метода NGameRPC.invoke, который анализирует данные NGameMessage и выполняет RPC-вызов.

Пример использования RPC:

@Component //注入到Spring 容器中
@NGameRPCClass //声明这个类是RPC 类
public class SNGameAction extends NCallServiceImpl {
    /**
     * RPC 传输测试 ProtoBuf GSnakeHelloMessage 对象传输
     * 推荐: 底层传输格式 ProtoBuf
     * client - 声明的方法 可以 接收 NClient 参数 - 调用者
     */
    @NGameRPCMethod //声明这个方法是RPC 方法
    public void nGameProtoBuf(CocosNClient client, GSnakeMessage.GSnakeHelloMessage message){
    }
    
    /**
     * RPC 传输测试 参数传输
     * 不推荐 : 底层实现数据格式是 JSON
     */
    @NGameRPCMethod
    public void nGameParams(@NRPCParam("name") String name,@NRPCParam("userId") Integer userId,@NRPCParam("user") HashMap user){
    }
    
    /**
     * RPC 传输测试 无参传输
     */
    @NGameRPCMethod
    public void nGameHello(){}
    
    /**
     * RPC 传输测试 UID
     */
    @NUIDMode(3)
    @NGameRPCMethod(mode = NRPCMode.UID)
    public void nGameUUIDMode(){}
}

Сервер запуска

Для запуска сервера можно использовать следующие методы:

WebSocket: используйте SpringBoot для запуска сервера.

@ServerEndpoint(
    value = "/game/{roomId}/{uuid}",
    encoders = {DefaultProtoBufEncoder.class}, //Protobuf 编码
    decoders = {DefaultProtoBufDecoder.class} //Protobuf 解码
)
@Controller
public class GameWebSocket {
    @OnOpen
    public void onOpen(Session session){}
    @OnMessage
    public void onMessage(Session session,NGameMessage message){}
    @OnClose
    public void onClose(Session session){}
    @OnError
    public void onError(Session session, Throwable t){}
}

UDP-сервер: используйте NGame + Netty для запуска UDP-сервера.

@AJNetty( //NGame Netty 服务注解
    port = 1000, //端口
    network = UDPJNettyNetwork.class, //协议 这里是 UDP 服务 继承 JNettyNetwork 实现启动
    decoders = {
        DefaultProtoBufDecoder.class //Protobuf 编码 继承 JNByteToMessageDecoder NGame 编码器
    },
    encoders = {
        DefaultProtoBufEncoder.class //Protobuf 解码 继承 JNMessageToByteEncoder NGame 解码器
    }
)
@Component // 加入到Spring 容器 (支持注入)
public class GameUDPServer {
    
    /**
     * 初始化开始 - 用于修改Network信息
     */
    @JNInit
    public void initNetwork(UDPJNettyNetwork network){}
    
    /**
    * 初始化成功
    */
    @JNInitSuccess
    public void initNetworkSuccess(UDPJNettyNetwork network){}
    
    /**
     * 打开用户连接
     */
``` Вот перевод текста на русский язык:

@JNOpen
    public void onOpen(UDPSession session, UDPSessionGroup clients) {
    }

    /**
     * Получение сообщения от пользователя
     */
    @JNMessage
    public void onMessage(UDPSession session, UDPSessionGroup clients, NGameMessage message, String text) {
    }

    /**
     * Закрытие соединения с пользователем
     */
    @JNClose
    public void onClose(UDPSession session, UDPSessionGroup clients) {
    }
}

#### NGame синхронный режим
##### NSyncFPSMode синхронный фреймовый режим
- Сбор данных и отправка их по расписанию.

@Component
@NGameRPCClass
public class SNCocosFrameAction extends NCallServiceImpl {

    // Синхронные nSyncModes
    NSyncFPSMode<Object> nSyncFPSMode = null;
    // Список клиентов
    public Map<String, CocosFrameNClient> clients = null;

    /**
     * Добавление ввода в фрейм синхронизации
     * @param inputs ввод
     */
    @NGameRPCMethod
    public void nGameFrameInput(@NRPCParam("inputs") List<Object> inputs) {
        if (Objects.isNull(nSyncFPSMode)) return;
        nSyncFPSMode.addFPSInfos(inputs); // Добавление ввода к текущему фрейму
    }

    /**
     * Запуск фреймовой синхронизации
     */
    public void nGameSyncStart() {

        if (Objects.nonNull(nSyncFPSMode)) return;

        // Создание объекта фреймовой синхронизации
        nSyncFPSMode = new NSyncFPSMode<>();
        nSyncFPSMode.setIntervalTime(1000/15); // Установка интервала синхронизации

        /Синхронная функция сервиса добавлена - NCallServiceImpl
        addRegister(nSyncFPSMode);

        // Запуск синхронизации
        nSyncFPSMode.start();

        System.out.println("SNCocosFrameAction - nGameSyncStart : запуск синхронного режима");

    }

    /**
     * Обратный вызов синхронного режима
     */
    @NSyncFPSMethod
    public void nGameSyncCallBack(String uuid, NFPSInfo<Object> nFPSInfo) {

        if (Objects.isNull(clients)) return;

        // Отправка фреймовых данных всем клиентам
        clients.values().forEach(client -> {
            client.getCnCocosFrameAction().nGameSyncInputCallBack(nFPSInfo);
        });

    }
}

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

NGame — это серверный фреймворк для сетевых игр на Java. Он поддерживает RPC-вызовы, использует WebSocket и UDP, имеет зрелый API с аннотациями и позволяет сразу запускать различные типы серверов. NGame также предлагает разнообразные демонстрационные версии (DEMO) для сетевой синхронизации игровых движков (cocos, unity) и различные примеры синх... Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/jisol-ngame.git
git@api.gitlife.ru:oschina-mirror/jisol-ngame.git
oschina-mirror
jisol-ngame
jisol-ngame
master