查看原文
其他

Unite 2017 | 从《闹闹天宫》看MOBA游戏里的网络同步技术

Unity官方 Unity官方平台 2019-05-07

在Unite 2017 Shanghai案例分享专场,来自蓝港互动《闹闹天宫》项目组的主程序陈实为大家分享了MOBA游戏里的网络同步技术,总结了使用Unity开发MOBA类型游戏在网络同步上可能遇到的问题,以及如何规避这些问题的宝贵经验。本文就为大家带来此次分享的技术要点。



MOBA类游戏的网络同步有三大特点,也可以理解为MOBA游戏对网络同步的三大要求,即实时性、流畅性以及游戏公平性。满足这些网络同步要求常用的技术方案有两种:状态同步与帧同步。下面就分别针对这两种常用方案及其对应的实际案例,来分析两种方案对于各种网络环境的表现。并着重分享《闹闹天宫》项目选用帧同步方案进行开发的过程中,所遇到的一些难点与挑战。


下面附上本次主题分享的现场视频:


https://v.qq.com/txp/iframe/player.html?vid=q0524vk2brc&width=500&height=375&auto=0


状态同步

状态同步,即同步玩家的状态信息,例如位置、属性以及其它玩法相关数据等。通常在此种方案下,游戏主逻辑会放在服务端进行计算,客户端仅用作显示。而通信需要的网络流量大小,取决于玩法设计中需要同步的实体数量。


状态同步结构图


对于像《星际争霸》这类RTS游戏来说,这种同步方案就不太适用,因为玩家可以操作的小兵数量可能上百个,状态同步会占用大量流量。状态同步需要客户端接收玩家输入后,上传到服务端进行数据处理,然后将状态信息传回客户端进行展示。


帧同步

帧同步仅同步玩家指令,不同步状态,游戏逻辑通常会在客户端分别计算。网络流量大小取决于指令大小以及同步帧率。像《星际争霸》这类游戏即使需要同步的单位增加到两三百,所需的网络流量也不会有明显增加。而帧同步的技术重点及难点在于如何保证所有客户端的计算结果一致。


帧同步结构图


帧同步大致的结构为,客户端将输入发送给服务端,然后服务器以统一的帧率将各个客户端的输入转发给其它客户端,各个客户端收到所有输入后在本地统一进行计算。


优缺点比较



状态同步

帧同步

录像文件大小

流量消耗

开发调试难度

略低

安全性

略低

能否离线战斗

额外开发

原生支持

网络卡顿时表现

见下文

见下文


通常采用帧同步的开发和调试难度相比状态同步会高一些,因为状态同步仅需维护好服务端的一份逻辑,而帧同步较难保证所有客户端的一致性。从安全性来说,状态同步相比帧同步会更加安全,帧同步在客户端进行计算会面临被Hack的问题。对于运行在手机网络环境下至关重要的离线战斗功能,采用帧同步机制无需额外开发,而状态同步则需要单独创建离线战斗的逻辑。


帧同步方案下的录像文件更小,因为帧同步仅需保存指令。如果使用状态同步,这个文件相对会很大,在储存与传输上难度都较高。


状态同步通常需要消耗更大的网络流量,因为可能需要同步的数据量很大。在网络卡顿的情况下,状态同步方案会出现角色闪现的问题,因为状态同步通常会在本地进行一些预计算,可能会与最终服务端的计算结果不一致,重置客户端计算结果时就会发生闪现的问题,可以额外做一些处理来避免闪现。而帧同步方案在网络环境不理想时,会出现一些动作和输入的延时。


案例分析

目前采用状态同步方案的游戏有大家熟知的《Dota 2》、《守望先锋》及《全民超神》。采用帧同步方案的有《Dota》、《风暴英雄》及《王者荣耀》。通用的两种方案都有各自的优缺点与适用情况,建议大家根据实际项目需求选择最合适的方案。而《闹闹天宫》游戏采取了帧同步的方案,下面就结合《闹闹天宫》的开发经验,为大家分享帧同步方案的重难点。


Dota游戏截图


帧同步方案的重难点主要在于三个方面:保证确定性、流畅性以及针对外挂的处理。保证确定性即确保所有客户端的计算结果一致,这也是帧同步方案最大的难点。首先,要注意确保客户端的核心逻辑和同步帧率一致。另外,对于需要使用随机数的地方,保证初始化种子同步,且所有客户端的随机数调用次数一致。还需考虑到变量初始化、基准判断数据以及数据结构遍历顺序等可能会导致客户端不同步的问题。


其次是流畅性,影响游戏流畅性的因素有二,网络延迟与画面卡顿。网络延迟会导致玩家输入与反馈之间的延迟,画面卡顿则说明游戏性能存在问题。对于实时性要求较高的MOBA类游戏,推荐使用UDP,然后手动处理丢包与顺序问题。对于画面卡顿,要将显示与逻辑分离,保证即便在底层逻辑上物体是抖动的,在客户端显示上也能看到物体流畅移动。


最后讨论针对外挂的处理,外挂通常会修改游戏属性,如果使用帧同步,就需要检测本地数据是否有修改,或者将本地数据进行Hash运算后传到服务端进行校验。如果服务端没有该逻辑,也可以将其它客户端的数据发送到服务端比较两个客户端数据是否不一致,从而判断是否某个客户端出现了异常。帧同步除了同步指令外,也可以选择性地同步一些关键数据,来避免出现客户端数据被修改的问题。


结语

关于《闹闹天宫》的网络同步经验就为大家分享到这里,相信其中分享的内容对于非MOBA类的其它游戏也会有帮助。我们还会继续分享一些Made with Unity游戏及VR/AR内容的开发经验在Unity官方中文社区(unitychina.cn),请保持关注!


更多Unite相关内容

案例 |《影子战术》:层级优化经验分享

基于Animation Instancing的大规模人群模拟

eaglEEye性能测试平台详解

Unite Europe 2017 Keynote: 连接、创造及Unity的未来

Unite 2017 | Unity可编程渲染管线剖析


官方活动


活动一:首次Unity 2017.1新功能Timeline & Cinemachine相关的技术直播课即将于7月19日晚开始,现在就来预约席位


活动二:由Unity Ads, AppsFlyer, App Annie和StartApp携手带来的“Midnight Carnival”(午夜嘉年华)派对现已开放报名


点击“阅读原文”进入Unity官方中文社区

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存