《游戏服务端编程实践》1.2.1 单机、局域网与在线游戏对比

解析单机、局域网与在线游戏的对比,包括其在游戏生态中的定位、主要功能与技术要求。

一、概述:从“单机”到“在线”的技术演进之路

在游戏发展的半个世纪中,游戏架构 的核心变化可用一句话概括:

“从单机的孤立逻辑,到局域网的共享状态,再到在线的分布式世界。”

这种演进不仅是硬件与网络带宽的变化结果,更是 游戏设计哲学服务端工程架构思想 的持续演化。

游戏从单机到在线的变化,本质上反映了以下三大转变:

  1. 计算方式的变化 —— 从本地计算到远程计算;
  2. 状态存储方式的变化 —— 从本地文件到服务端数据库;
  3. 逻辑权威的转移 —— 从客户端权威到服务器权威。

这三者决定了游戏架构的复杂度与成本曲线。


二、阶段一:单机游戏(Standalone Game)

2.1 定义与特征

单机游戏是指在单一设备(PC、主机、移动设备)上独立运行的游戏,所有的逻辑与状态均在本地处理与存储,不依赖外部网络。

核心特征:

特征说明
计算位置全部在本地执行
存储介质本地文件(如 save.dat / .json / 二进制)
网络依赖无网络需求
权威位置客户端(唯一执行者)
同步需求
安全风险极低(无需防作弊)
典型语言C/C++、Unity(C#)、Godot(GDScript)、Rust(独立开发)

2.2 架构组成

一个典型的单机游戏可以被视为“自包含的客户端”,内部架构如下:

flowchart TD
A["玩家输入 Input"] --> B["游戏逻辑 Game Logic"]
B --> C["渲染引擎 Rendering Engine"]
B --> D["物理引擎 Physics Engine"]
B --> E["存档系统 Save System"]
C --> F["显示输出 Output"]
E --> G["本地存档文件 Save.dat"]

解释:

  • Input 层:负责读取玩家输入(键鼠、手柄、触摸)。
  • Logic 层:执行所有游戏规则(战斗、移动、AI)。
  • Rendering 层:根据逻辑层输出的状态渲染画面。
  • Save 层:将关键状态写入本地文件。

这一结构简单、性能高、维护成本低,非常适合独立开发者与离线体验类游戏。


2.3 单机游戏的优势与局限

优势:

  1. 架构简单:无网络逻辑,易于维护;
  2. 成本低:无需服务器;
  3. 体验稳定:不受网络波动影响;
  4. 开发周期短:适合快速验证游戏机制。

局限:

  1. 无法共享状态:没有多人同步;
  2. 无法运营化:缺乏数据追踪、更新机制;
  3. 无法防作弊:数据本地存储,易修改;
  4. 商业化路径窄:一次性买断或广告内嵌。

2.4 存档系统设计(Go 示例)

单机游戏仍需要可靠的 存档系统,可用 Go 模拟序列化流程:

type SaveData struct {
    PlayerName string
    Level      int
    HP         int
    Inventory  []string
}

func SaveGame(file string, data SaveData) error {
    jsonData, _ := json.MarshalIndent(data, "", "  ")
    return os.WriteFile(file, jsonData, 0644)
}

func LoadGame(file string) (SaveData, error) {
    var data SaveData
    bytes, err := os.ReadFile(file)
    if err != nil {
        return data, err
    }
    err = json.Unmarshal(bytes, &data)
    return data, err
}

2.5 案例分析:暗黑破坏神 I

核心架构特点:

  • 本地执行逻辑;
  • 存档文件保存角色状态;
  • 无服务器概念;
  • 后期通过 LAN 实现“伪多人”。

该架构极大简化了早期开发成本,但也限制了游戏的持续运营与安全性。

三、阶段二:局域网游戏(LAN Game)

3.1 定义与特征

局域网游戏是指在 同一网络环境 下(通常在同一个局域网内),通过网络实现多设备间的状态同步。

代表作:

  • 《星际争霸》
  • 《红警》
  • 《CS 1.6》(局域网对战)
  • 《Minecraft(局域网模式)》

架构核心:
通过 Socket(UDP/TCP) 进行状态同步,主机端负责广播状态,客户端接收更新。

3.2 架构模型

graph LR
P1["玩家A 客户端"]
P2["玩家B 客户端"]
P3["玩家C 客户端"]
H["主机/Host"]

P1 <--> H
P2 <--> H
P3 <--> H

主机(Host) 担任逻辑权威,其他客户端同步数据。

通信机制:

  • 早期多用 UDP 广播;
  • 后期采用 TCP 保证可靠传输;
  • 同步方式:帧同步或状态同步。

3.3 通信模型与延迟补偿

LAN 模式中,延迟较小(< 10ms),但仍需基本的同步机制。

模式特征优点缺点
帧同步(Lockstep)所有玩家执行相同逻辑,广播输入精确、一致需锁帧、易卡顿
状态同步服务器(主机)广播状态容错性强需更多带宽

3.4 局域网架构中的逻辑权威

LAN 模式的关键设计思想是:

权威由“主机”承担

客户端仅上传操作指令,主机广播结果。
典型结构如下:

sequenceDiagram
participant ClientA
participant Host
participant ClientB

ClientA->>Host: Move(UnitID=1, X=10, Y=20)
Host->>Host: UpdateGameState()
Host-->>ClientA: State(UnitID=1, Pos=(10,20))
Host-->>ClientB: State(UnitID=1, Pos=(10,20))

3.5 典型问题与优化

  1. 掉线恢复:主机断开即全局中断;
  2. 作弊防护:主机作弊无解;
  3. 同步抖动:帧落后或状态不一致;
  4. 主机性能瓶颈:所有计算集中。

为此,部分游戏引入 主机迁移(Host Migration)预测补偿(Client Prediction) 技术。

3.6 案例分析:星际争霸(LAN 模式)

  • 使用 Lockstep 帧同步;
  • 每个客户端执行完全相同逻辑;
  • 仅交换输入;
  • 检查 MD5 校验一致性。

这种架构几乎不需要服务器,但逻辑 determinism(确定性) 要求极高。

四、阶段三:在线游戏(Online Game)

4.1 定义与特征

在线游戏是指通过 广域网络(Internet) 实现多玩家实时或异步交互的游戏。此类游戏必须包含 独立的服务端架构,以保证状态一致性、安全性与可持续运营。

类型示例通信方式特点
MMO魔兽世界、原神TCP + HTTP + WebSocket持久连接 + 世界状态
MOBALOL、王者荣耀UDP + 自研协议帧同步高实时性
SLG三国志战略版、率土之滨HTTP + 长轮询 / WebSocket状态同步多任务

4.2 在线游戏的逻辑权威模型

服务器成为唯一的状态权威(Authoritative Server)。

客户端仅上报操作,服务器判定合法性与结果。

sequenceDiagram
participant Client
participant Server
Client->>Server: Attack(TargetID=12)
Server->>Server: Validate + ComputeDamage()
Server-->>Client: Result(Damage=35)

这种模式防止作弊、保证一致性,但也带来网络延迟与负载问题。

4.3 分层架构设计

现代在线游戏采用分层设计,以便扩展与维护:

graph TD
C["Client"] --> G["网关 Gateway"]
G --> L["逻辑服 Logic Server"]
L --> D["数据库 DB"]
L --> R["Redis Cache"]

各层职责:

层级职责
Client呈现与输入
Gateway长连接维护、消息路由
Logic游戏业务逻辑、状态计算
DB持久化存储(MySQL / MongoDB)
Cache状态缓存与排行榜等实时服务

4.4 Go 语言服务端示例:TCP Echo

func handleConnection(conn net.Conn) {
    defer conn.Close()
    reader := bufio.NewReader(conn)
    for {
        msg, err := reader.ReadString('\n')
        if err != nil {
            return
        }
        fmt.Printf("Recv: %s", msg)
        conn.Write([]byte("Echo: " + msg))
    }
}

func main() {
    ln, _ := net.Listen("tcp", ":9000")
    for {
        conn, _ := ln.Accept()
        go handleConnection(conn)
    }
}

这只是最小化示例,真实服务器会基于 Reactor 模式或事件循环进行优化。

4.5 在线游戏的典型架构特征

模块说明
网关层(Gateway)管理连接、认证、限流
世界服(World)管理全局状态、地图
战斗服(Battle)帧同步或状态同步逻辑
聊天服独立 pub/sub 模块
数据服异步持久化与日志服务
匹配服任务分配与队列管理

4.6 网络协议与同步机制演进

阶段主协议特点
早期 LANUDP 广播简单、无保证
过渡期TCP稳定但延迟高
现代在线WebSocket / QUIC / 自研协议长连接、低延迟、安全传输
未来趋势gRPC Stream / WebTransport跨平台流式通信

4.7 案例分析:魔兽世界(MMO)

  • 架构层次:网关 → 世界 → 区服 → 战斗;
  • 状态分布式:玩家、地图、任务分模块存储;
  • 协议设计:自定义二进制;
  • 数据库结构:MySQL + Redis;
  • 关键特征:持久世界与可扩展分区。

4.8 案例分析:原神(分布式同步)

  • 客户端为表现层;
  • 服务端进行全部逻辑验证;
  • 基于 gRPC + ProtoBuf;
  • 动态场景与实体同步;
  • 高度异步分布式系统。

五、演进对比总结

5.1 技术维度对比表

维度单机局域网在线
架构复杂度
网络需求局域网公网
状态存储本地主机服务端数据库
逻辑权威客户端主机服务端
同步机制帧/状态同步状态同步
防作弊
成本
运营性
典型游戏仙剑、红警星际、CS原神、WOW

5.2 架构演进示意图

graph LR
A["单机游戏"] --> B["局域网游戏"]
B --> C["在线游戏"]
C --> D["云原生游戏 / 虚拟世界"]

每一阶段的演化都伴随着 计算、存储与网络三要素的重新分配

六、结语:从独立逻辑到全球共享状态

单机游戏时代,玩家面对的是 算法的挑战
局域网时代,玩家面对的是 朋友的挑战
而在线游戏时代,玩家面对的是 整个世界的挑战

从架构角度看,这一演变意味着:

  • 单机 → 局域网:增加同步;
  • 局域网 → 在线:增加持久化与分布;
  • 在线 → 云原生:增加弹性与服务自治。

未来的方向,正在指向 “服务端即世界” ——
无论是 SLG 的状态同步、MMO 的大世界、还是 MOBA 的实时帧同步,
服务端架构始终是支撑“虚拟世界稳定存在”的核心。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页