跳到主内容
01 · PROJECT · REAL-TIME GAME

AsterNova

服务器权威 · 固定步长同步 · 可运行联机实验

AsterNova Studio 出品 · 自建专用 2D 多人竞技场

SERVERGO 1.22
TICK60 Hz
REGIONcn-hangzhou
PLAYERS2000+
RTT< 30ms
STATUS● LIVE
// OVERVIEW02

项目概述

AsterNova 是一款自建专用服务器 (dedicated game server) 的 2D 多人实时竞技游戏。所有战斗逻辑与状态判定均在 Go 后端运行,前端只负责渲染与输入采集。从协议设计、状态同步算法到 DevOps 部署,整套技术栈独立完成。

针对多人实时同步场景,选用 Go 协程与 WebSocket 二进制协议,把输入、服务端状态和客户端呈现拆成清晰链路。Server-Authoritative 模式让客户端无权篡改命中判定。

AsterNova 的轨道中继站与月面战场概念场景

03 · LOCKSTEP / WORLD STATE

ONE TICK.

ONE REALITY.

当所有客户端在同一节拍内推进,战场不再只是画面,而是一套可验证、可回放、可扩展的世界状态。

// CORE FEATURES03

核心特性

01

60Hz Lockstep Tick

固定步长服务端 tick,位置 / 血量 / 技能以 state-diff 增量下发;客户端只负责提交输入与呈现结果。

02

Server-Authoritative

客户端零信任。伤害、冷却、命中判定一律服务端裁定 —— 这是 2D 联机最干净的反作弊形态。

03

ECS + 协程调度

entity-component-system 架于 Go channel + select 之上,单机承载 1 个房间、24 在线、零锁。

04

State-Diff 二进制帧

protobuf 变长编码 + CRC16 校验,帧结构明确,便于调试、重连和异常丢弃。

05

全球边缘链路

阿里云 + 腾讯云双区,跨区 WebRTC + TURN 备援;同区 8-15 ms、跨区 80-120 ms。

06

热更新房间

房间不停服热更新:游戏版本 / 地图 / 技能表在线滚动加载,玩家零感知。

// ARCHITECTURE04

实时同步架构

从玩家输入到状态广播的多段管线;每一段都对应明确的状态边界和可观察问题。

CLIENTWIRESERVERCLIENT01Input Sampleinput02Binary Encode< 1 ms03WS Frame Mux8-15 ms04Tick Loopfixed-step05ECS World3 ms06State Diff2 ms07Broadcast8-15 ms08Reconcile1 msSTATE RELAYINPUT → SNAPSHOT
  1. 01
    CLIENT
    Input Sample
    input
    键盘 / 手柄采样后合并为离散 input packet。
  2. 02
    WIRE
    Binary Encode
    < 1 ms
    varint 编码 + CRC16,长度 6-18 字节。
  3. 03
    WIRE
    WS Frame Mux
    8-15 ms
    WebSocket 二进制帧 · 单连接多 channel。
  4. 04
    SERVER
    Tick Loop
    fixed-step
    固定步长调度器推进世界状态,并把输入、规则和快照串起来。
  5. 05
    SERVER
    ECS World
    3 ms
    entity-component-system 推进;命中 / 技能 / 物理解算。
  6. 06
    SERVER
    State Diff
    2 ms
    对比上一帧 snapshot,输出极小 delta 集合。
  7. 07
    WIRE
    Broadcast
    8-15 ms
    扇出到房间所有连接;压缩 + 打包。
  8. 08
    CLIENT
    Reconcile
    1 ms
    客户端本地预测 vs 服务端 snapshot 对账 + 插值。
TOTAL RTT
~22
ms / tick

同区中位数端到端延迟;方差几乎全部来自 wire 段。

HOT PATH
0
locks

channel 多路 I/O,per-tick 循环零互斥锁。

DETERMINISM
seed · tick
deterministic

同种子 + 同输入 → 完全一致的世界状态;回放与作弊取证精确而非近似。

// WIRE PROTOCOL05

二进制帧协议

WebSocket 二进制帧载 24-96 字节 payload。下表展示完整 9 段字段布局。

FRAME LAYOUTtotal 16 B1Bmagic@01Bversion@11Btype@21Bflags@34Bseq@44Btick@8varpayload@12varlen@132Bcrc16@14
FIELDBYTESNOTE
magic1 B帧魔数 0xA7 · 用于同步与乱序检测
version1 B协议版本 · 双端 mismatch 立即断连
type1 B帧类型:0x01 input / 0x02 snapshot / 0x03 heartbeat / 0x10 ack
flags1 B位标志:compressed · delta · encrypted
seq4 B32-bit 包序号 · 客户端单调递增
tick4 B服务端 tick 号 · 0=input 帧,>0=snapshot
payloadvarvarint 编码 · 长度由 next varint 给出
lenvarpayload 长度的 varint 前缀
crc162 BCRC-16/CCITT-FALSE · 整个帧除自身外
FRAME SAMPLES · hex dump
INPUT · 18Bws://
a7 01 01 00 3f 12 00 00
00 00 12 0a 03 1c ff 02 c1 9e

magic=0xA7 · v1 · type=input · seq=0x123f · tick=0 · payload: 上 / 右 / 攻击 · CRC=0x9ec1

SNAPSHOT · 64Bws://
a7 01 02 01 40 12 00 00
2a 02 3b a0 0c 18 06 91 ...
fc 02 9c 7d

type=snapshot · flags=compressed · seq=0x1240 · tick=42 · zstd delta · CRC 校验通过

HEARTBEAT · 8Bws://
a7 01 03 00 00 00 00 00

纯 keepalive · 无 payload · 30 s 周期 · 双向 · 用于 RTT 测量

ACK · 12Bws://
a7 01 10 00 41 12 00 00
00 00 ff 0d

客户端对服务端 snapshot 的确认 · seq 收到最高序号 · 携带抖动缓冲水位

// ANTI-CHEAT06

服务器权威反作弊

客户端无权裁定任何关键状态。五条硬规则,下表罗列客户端可做 / 服务端裁定之边界。

01Client submits INTENT按键序列 + 时间戳 + 输入向量02Server validates与世界状态 / 规则 / 历史比对03Server computes RESULT伤害、掉落、位置、死亡 —— 全部权威04Client renders onlysnapshot 到达 → 渲染 + 插值 + 本地预测对账
ID
SCOPE
CLIENT · untrusted
SERVER · authoritative
R-01
移动与位置
客户端可上传 input 方向与意图位置
服务端基于速度上限 / 重力 / 碰撞重新计算每 tick 真实位置
R-02
技能冷却
客户端可发起技能释放请求
服务端校验冷却、能量、法力、沉默状态 —— 任意一条不过即丢弃
R-03
技能伤害
客户端可声明『我命中了谁』
服务端以命中体 + 走位向量 + 技能类型裁决最终伤害
R-04
经济与掉率
客户端可展示当前金币 / 道具
金币变更只在服务端发生,掉率表服务端独占
R-05
网络与延迟
客户端可上传 RTT 测量 + jitter
服务端监测异常延迟 / 抖动模式,触发重连或风控
// STRESS TEST07

运行验证与故障演练

用可重复的输入、房间状态和故障演练观察资源曲线、连接质量与 tick 稳定性;页面不把模拟数据包装成线上实时指标。

INPUT REPLAY
ON
ROOM STATE
TRACE
TICK LOOP
FIXED
FAILOVER
READY
CPU 占用
Y · 趋势
05010078
RTT P99
Y · 趋势
0408029
Tick Jitter
Y · 趋势
0241
CPU 占用
peakTRACE@ runtime

观察资源曲线是否出现持续爬升、突发尖峰或回收抖动。

RTT P99
peakTRACE@ network

关注切换、丢包和重连场景下的连接质量变化。

Tick Jitter
peakTRACE@ tick loop

关注固定步长是否连续,以及客户端是否能平滑追上最新快照。

pprof 火焰图 · top-5 热点

Five top stack frames from the on-host pprof capture during the 60-minute run. Tick dispatch dominates; jemalloc eliminates GC pauses; snapshot diff keeps per-frame delta small.

pprof · top stack
TickLoop.dispatch     ████████████████████████████████████████38.4%World.diffSnapshot    ███████████████████████                 21.7%WSConn.flushBatch     ███████████████                         14.2%Room.broadcast        ██████████                              9.8%Arena.resolveHits     ███████                                 6.5%
// TIMELINE08

项目时间线

  1. 2024 Q1

    立项 + 架构选型

    Go + WebSocket + Godot 4 客户端;CI/CD 流水线搭建

  2. 2024 Q2

    Alpha 内测

    核心 tick 与状态同步完成,围绕输入、判定和呈现验证链路

  3. 2024 Q3

    公测上线

    game.asterforge.top 进入公测,对外开放真实联机体验

  4. 2025 Q1

    服务器迁移

    完成云端部署迁移与跨区灾备整理,收敛连接和同步边界

  5. 2025 Q3

    可观测性接入

    接入 pprof 与 Prometheus,为运行状态和异常定位留下记录

  6. 2026 Q1

    双区 Failover

    cn-hangzhou 主区 / ap-shanghai 热备,无感切换

  7. 2026 Q3+

    扩展内容

    占点 / 组队模式 + 排位赛 + Steam / WeGame 接入规划

// TECH STACK09

技术栈

  • Go 1.22
  • WebSocket
  • Godot 4 (WASM)
  • Unity WebGL
  • PostgreSQL
  • Redis
  • Docker
  • Nginx
  • Aliyun ECS
  • Tencent CVM
  • Prometheus
  • pprof
  • jemalloc
// NUMBERS10

数据快照

60Hz
TICK 频率
1
服务端权威模型
1
实时同步链路
1
可回放输入
0trust
客户端判定权限
1
持续演进的实验

Play the Arena

游戏现已在 game.asterforge.top 公测。邀请码 77 体验游客对战。或联系作者定制专属技术方案。

? 2026 AsterNova Studiogithub.com/TimeCrakerasterforge.top