上一篇【第54篇】Netty在Elasticsearch中的应用——分布式搜索引擎的网络通信
下一篇【第56篇】Netty内存管理策略——堆内存vs直接内存怎么选
一、游戏服务器架构
+---------------------+ | 接入层(GateServer)| | 负责连接管理+转发 | +---------------------+ ↓ +---------------------+ | 逻辑层(LogicServer)| | 负责游戏逻辑处理 | +---------------------+ ↓ +---------------------+ | 存储层(DB+Redis) | | 负责数据持久化 | +---------------------+二、Protobuf协议
// game.proto message GameMessage { enum Type { LOGIN = 0; MOVE = 1; ATTACK = 2; CHAT = 3; POSITION = 4; } Type type = 1; string playerId = 2; bytes data = 3; int64 timestamp = 4; }三、房间管理
publicclassRoomManager{privatestaticfinalMap<String,Room>rooms=newConcurrentHashMap<>();publicclassRoom{privatefinalStringroomId;privatefinalSet<Channel>players=ConcurrentHashMap.newKeySet();privatefinalintmaxPlayers;publicbooleanjoin(Channelplayer){if(players.size()>=maxPlayers)returnfalse;players.add(player);broadcast(newPlayerJoinedMessage(player));returntrue;}publicvoidbroadcast(Objectmsg){for(Channelplayer:players){if(player.isActive()){player.writeAndFlush(msg);}}}publicvoidleave(Channelplayer){players.remove(player);broadcast(newPlayerLeftMessage(player));}}}四、帧同步
publicclassFrameSyncHandlerextendsChannelInboundHandlerAdapter{privatestaticfinalintFRAME_RATE=20;// 20帧/秒privatestaticfinallongFRAME_INTERVAL=1000/FRAME_RATE;@OverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){GameMessagegameMsg=(GameMessage)msg;switch(gameMsg.getType()){caseMOVE:// 收集操作指令,统一在帧循环中处理operationQueue.add(newOperation(ctx.channel(),gameMsg));break;}}// 帧循环(在独立线程中运行)privatevoidframeLoop(){while(running){longstart=System.currentTimeMillis();// 处理本帧所有操作List<Operation>ops=operationQueue.drainAll();for(Operationop:ops){processOperation(op);}// 广播本帧状态broadcastFrameState();// 控制帧率longelapsed=System.currentTimeMillis()-start;if(elapsed<FRAME_INTERVAL){Thread.sleep(FRAME_INTERVAL-elapsed);}}}}五、性能优化
// 游戏服务器特有优化newServerBootstrap().option(ChannelOption.SO_BACKLOG,4096).childOption(ChannelOption.TCP_NODELAY,true)// 禁用Nagle,降低延迟.childOption(ChannelOption.SO_KEEPALIVE,true).childOption(ChannelOption.SO_RCVBUF,32*1024).childOption(ChannelOption.SO_SNDBUF,32*1024);六、总结
| 组件 | 作用 |
|---|---|
| GateServer | 接入层,连接管理 |
| Protobuf | 高效二进制协议 |
| Room Manager | 房间管理,消息广播 |
| 帧同步 | 定时循环处理操作 |
上一篇【第54篇】Netty在Elasticsearch中的应用——分布式搜索引擎的网络通信
下一篇【第56篇】Netty内存管理策略——堆内存vs直接内存怎么选