Closed iohao closed 1 year ago
经过思考,决定取消 action 返回值 byte[] 类型的支持。 因为这会导致在生成文档时,不知道其具体的类型,从而增加沟通负担;
路由: 1 - 4 --- 【】 --- 【DemoAction:120】【testByte】
方法参数: IntValue
方法返回值: [B
如果开发者有需要,可以自行扩展,扩展协议参考 https://www.yuque.com/iohao/game/uq2zrltrc7to27bt
以 proto 编解码器为例,只需要在 encode 方法添加如下逻辑
public final class MyProtoDataCodec implements DataCodec {
@Override
public byte[] encode(Object data) {
if (data instanceof byte[] bytes) {
return bytes;
}
return ProtoKit.toBytes(data);
}
... 省略部分代码
}
将自定义的,添加到框架中
// 设置自定义的编解码。如果不做设置,默认使用 jprotobuf
IoGameGlobalSetting.setDataCodec(new MyProtoDataCodec());
action byte[] 使用展示
@Slf4j
@ActionController(1)
public class DemoAction {
static byte[] helloReqData;
static {
// 这里模拟缓存数据,不用每次序列化
HelloReq helloReq = new HelloReq();
helloReq.theIndex = 100;
helloReq.name = "to byte[]";
helloReqData = DataCodecKit.encode(helloReq);
}
@ActionMethod(4)
public byte[] testByte(int id) {
return helloReqData;
}
}
之前是为了少一次序列化操作,节约一些 cpu,特别是在请求访问一些固定配置数据表时;但这样的编码格式增加了以后的维护成本,也增加了沟通成本,综合下来决定取消支持。另外一个原因是,找到了一种更加彻底的方式,就是游戏对外服缓存特性;
关于游戏对外服缓存特性可阅读 #76
这种方式不但能节约 CPU,还能减少传输、请求次数、无形中帮助游戏逻辑服做了一些防护性措施等,并且不破坏代码可读性。
在 action 中返回 byte[] 可以避免业务数据的序列化,达到性能的提升;
伪代码 - 使用示例
使用场景: 请求较为频繁的,数据不常变动的;如一些配置数据信息:装备的配置、道具的配置... 等。我们可以在 excel 或 DB 读取到这些配置数据后,将数据提前转换为 byte[] ;
请求端在请求配置数据时,可以在 action 中直接将该 byte[] 返回,可以避免序列化操作从而达到性能的提升;