iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;
http://game.iohao.com
GNU Affero General Public License v3.0
875 stars 190 forks source link

优化、提速 - 预生成 jprotobuf 协议类的代理,通过 action 构建时的监听器实现 #274

Closed iohao closed 4 months ago

iohao commented 4 months ago

在启动时,预先生成好 jprotobuf 协议类对应的代理类(用于 .proto 相关的 编码、解码),而不必等到用时在创建该代理类。从而达到整体优化提速的效果。

在此之前,在没做其他设置的情况下,首次访问 action 时,如果参数使用的 jprotobuf 协议类,那么在解码该参数时,会通过 ProtobufProxy.create 来创建对应的代理类(类似 .proto 相关的 编码、解码)。之后再访问时,才会从缓存中取到对应的代理类。

该特性使用 #272 实现,并内置到框架中,且默认生效。

iohao commented 4 months ago

已经预先生成的代理类有

iohao commented 4 months ago

该优化默认开启,开发者可以不需要使用与配置跟 jprotobuf-precompile-plugin 插件相关的了。

KING754 commented 4 months ago

已经预先生成的代理类有

关于,这个新增的ProtobufActionParserListener,我在我的逻辑服与对外服启动时,在collect方法,与onActionCommand方法打断点。发现都都未进断点。

不知是否是这个地方引起的:

BarSkeletonBuilder-->类的成员变量一开始赋值了。
   /** action 构建时的钩子方法 */
    ActionParserListeners actionParserListeners = new ActionParserListeners();

但是build的时候 :
        this.actionParserListeners = null;
iohao commented 4 months ago

游戏逻辑服启动时会进入 ProtobufActionParserListener onActionCommand 方法。

KING754 commented 4 months ago

ProtobufActionParserListener

我这边测试下来,并没有进。

iohao commented 4 months ago

可以提供一个可复现的 demo 和复现步骤吗。

KING754 commented 4 months ago

没有。就是普通示例逻辑服,然后打断点,发现没有没有进来。

另外我发现ProtoKit:

   public byte[] toBytes(Object data) {

        if (Objects.isNull(data)) {
            return CommonConst.emptyBytes;
        }

        Class clazz = data.getClass();
        Codec<Object> codec = ProtobufProxy.create(clazz);

        try {
            return codec.encode(data);
        } catch (Throwable e) {
            log.error(e.getMessage(), e);
        }

        return CommonConst.emptyBytes;
    }

这里是不是始终会: ProtobufProxy.create(clazz);

iohao commented 4 months ago

这里是不是始终会: ProtobufProxy.create(clazz);

这有啥问题。

KING754 commented 4 months ago

在此之前,在没做其他设置的情况下,首次访问 action 时,如果参数使用的 jprotobuf 协议类,那么在解码该参数时,会通过 ProtobufProxy.create 来创建对应的代理类(类似 .proto 相关的 编码、解码)。之后再访问时,才会从缓存中取到对应的代理类。

我想这段话:从缓存中取到对应的代理类。但是这里不是,还是每次都会去create吗?

iohao commented 4 months ago

在此之前,在没做其他设置的情况下,首次访问 action 时,如果参数使用的 jprotobuf 协议类,那么在解码该参数时,会通过 ProtobufProxy.create 来创建对应的代理类(类似 .proto 相关的 编码、解码)。之后再访问时,才会从缓存中取到对应的代理类。

我想这段话:从缓存中取到对应的代理类。但是这里不是,还是每次都会去create吗?

里面做了缓存,可以看下源码。

iohao commented 4 months ago

https://github.com/iohao/ioGame/releases/tag/21.7