DDNet 采用 C/S 架构。**官方客户端和第三方客户端都处在 C(客户端)这一侧;连接同一台服务器时,最终游戏状态由 S(服务端)决定。** 两者主要区别在于维护者、功能、操作方式和实现质量。 先看一次操作怎样生效。比如你按下右移: 1. 客户端采集方向、跳跃、钩子、开火等输入,发送给服务器。 2. 客户端同时进行本地预测,让画面立即响应。 3. 服务器根据收到的输入、地图和游戏规则计算实际结果,再通过快照同步给客户端。 4. 客户端根据服务器状态校正预测。预测出现偏差时,就可能看到拉回、抖动或位置修正。 官方源码里也有完整的客户端预测世界,因此客户端会实际影响操作反馈。[服务端输入处理](https://github.com/ddnet/ddnet/blob/master/src/game/server/player.cpp)、[客户端预测实现](https://github.com/ddnet/ddnet/blob/master/src/game/client/prediction/gameworld.cpp) 官方客户端与第三方客户端,可以这样比较: |方面|官方客户端|第三方客户端| |---|---|---| |维护与发布|由 DDNet 主项目维护和发布|由第三方作者或团队独立维护| |功能范围|随主项目接受的改动发布|可以增加自己的菜单、HUD、聊天、快捷操作等| |性能与手感|使用官方版本的实现和默认设置|可以调整渲染、输入处理、预测和平滑策略,效果取决于具体实现| |兼容性|跟随主项目开发|需要维护与服务端协议、功能的兼容| |游戏权限|受服务器规则约束|同样受服务器规则约束| **第一,客户端可以大幅改变“你看到什么”。** 例如 QmClient 调整聊天窗口、设置卡片、HUD 或音乐显示,通常只影响自己的画面。其他玩家能看到什么,取决于相关信息是否被传输,以及对方客户端是否支持显示。你本地画出的装饰,不会自动出现在所有人的屏幕上。 **第二,客户端能改变反馈和输入,但不能直接决定服务器中的结果。** 帧率、输入处理和预测策略不同,确实可能让两个客户端手感不同。仅在本地把移动速度改大,或者把冻结状态隐藏,并不能直接改变服务器认定的位置和冻结状态。通关、计时和排名也由服务端相关系统处理。 **第三,服务端权威不代表客户端无法作弊。** 自动瞄准、自动钩取、自动生成操作序列,可以向服务器提交符合物理规则的输入。服务器计算出的结果可能完全合法,但操作过程可能违反公平规则。因此,“没有修改服务端物理”不足以证明某项辅助功能合规。DDNet 也有因使用机器人通关而处罚玩家的官方记录。