网络游戏是如何处理动画特效的时间同步的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Game Engines
Unreal Engine
MyCryENGINE
EXDestroyer
V2EX    游戏开发

网络游戏是如何处理动画特效的时间同步的?

  •  
  •   EXDestroyer 2016-08-2909:55:50 +08:00 6985 次点击
    这是一个创建于 3340 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如炉石传说这种手游,某些特效是如何做到已经播放到中途的时候,别的玩家进入看到的也是中途的效果而不是从头开始的效果?(包括自己断线重进或者其他人观战)

    这种效果用 canvas+websocket 我想到的也只能不停地向服务器发送每个动画的坐标数据,但是复杂的动画要如何做到能够在任意一个阶段开始播放?

    28 条回复    2016-08-30 13:35:52 +08:00
    mslmsl111
        1
    mslmsl111  
       2016-08-29 09:58:28 +08:00 via iPhone
    那些特效都装在你电脑里了,他传个比如使用卡片 no.20 就行了
    EXDestroyer
        2
    EXDestroyer  
    OP
       2016-08-29 10:12:53 +08:00
    @mslmsl111 这样的话,每个动画的播放时间是固定的,那怎么做到对方效果已经播放到一半的时候,我这边再进入游戏也是一半
    ChinaTelecom
        3
    ChinaTelecom  
       2016-08-29 10:14:17 +08:00 via Android
    也许比你想的简单 也许就是联机的实现是整个场景同步 自然包括了动画之类的当前状态
    EXDestroyer
        4
    EXDestroyer  
    OP
       2016-08-29 10:18:05 +08:00
    @ChinaTelecom 但是这些动画都是依赖玩家的下一步操作的,程序也不知道后面将要播放什么动画
    yushiro
        5
    yushiro  
       2016-08-29 10:19:35 +08:00 via iPhone
    是你们都想复杂了吧,你怎么知道进入游戏时候播放一半的动画效果就是与对战的两人同步的呢,也许只是随机一个位置给你播放
    EXDestroyer
        6
    EXDestroyer  
    OP
       2016-08-29 10:20:50 +08:00
    @yushiro 那么如果是随机的话,双方结束动画的时间点不一致,那不会导致后续双方游戏交互过程的延迟吗
    acros
        7
    acros  
       2016-08-29 10:27:01 +08:00
    动画是关键帧计算插值的。
    同步帧状态,客户端自己计算下就好。
    yushiro
        8
    yushiro  
       2016-08-29 10:28:52 +08:00 via iPhone
    你刚才举例的是观战者,只需要在思考的时间段同步即可。
    对战的两人也一样,相对于思考阶段,动画时间还是属于短暂的
    acros
        9
    acros  
       2016-08-29 10:28:59 +08:00
    “帧状态”这个词有点歧义,你当动画是个 key-value 对, key 是动画播放时间,有了这个值,本地就可以计算 value 了、
    calease
        11
    calease  
       2016-08-29 10:37:25 +08:00
    观看的客户端只要知道最后一条指令是什么时候发出来的以及结果是什么,就可以自己计算动画了啊。
    ferock
        12
    ferock  
    PRO
       2016-08-29 10:38:14 +08:00
    @EXDestroyer 延迟并不重要,关键是结果要一致。。。人人交互的游戏,其实就像下棋一样,毕竟有太多逻辑可以提供停留和等待。
    arens
        13
    arens  
       2016-08-29 10:56:49 +08:00
    是你把特效和比赛过程理解上分离了吧,他们本身也许就是一体的,而你进入观战,本身就是类似一个视频的方式,如果对方仍在比赛最后 1 秒,你仍可观战,通常观战都是延迟一点时间来播放(参考 LOL 观战,大概延迟十几分钟),应该是为了保证公平性~
    EXDestroyer
        14
    EXDestroyer  
    OP
       2016-08-29 11:01:08 +08:00
    @learnshare 我主要想知道对动画特效的处理,不是指网络延迟
    EXDestroyer
        15
    EXDestroyer  
    OP
       2016-08-29 11:04:03 +08:00
    @ferock 卡牌游戏可能等待时间确实充足,但是也有一些限时游戏的吧,比如赛车?或者那种限时多少秒内多个人同时参与,时间结束出结果的游戏
    xddxdd
        16
    xddxdd  
       2016-08-29 11:08:35 +08:00 via Android
    @EXDestroyer 你具体看到的是什么特效?印象中炉石断线重连后特效是从头播放的
    paradoxs
        17
    paradoxs  
       2016-08-29 11:11:13 +08:00
    把游戏状态反馈给客户端,客户端自动计算动画, 观战的人接收到 参战的人的状态,也自动计算动画了啊。
    x8
        18
    x8  
       2016-08-29 11:17:01 +08:00
    炉石传说能看见从中途播放的特效吗?我没有验证这个情况。

    一般游戏不会做特效或者技能动画之类的状态同步,因为没必要,引入太多状态同步的复杂性,而且游戏体验并没有上升多少,游戏只要保证结果状态一致就行。固定的动画和游戏物体位移不是一个东西,不要混在一起。

    如果要做,比如炉石传说,这种回合制对战状态自由度没那么高,相对好做一点。就在游戏一开始的时候记下时间点,玩家在什么时间点使用了什么卡牌,记下时间点,卡牌的动画效果以及播放时间是固定的,根据动画或者特效播放的起始时间点,就可以推算出当前时间点下,动画播放到哪一帧了,接着放就行。
    learnshare
        19
    learnshare  
       2016-08-29 11:28:19 +08:00
    @EXDestroyer 一样的道理,服务器端维护着整个时间线和状态,客户端比服务器多一个展现。

    就是同一套逻辑,客户端和服务器一样而且同步,只是服务器不需要渲染画面。
    ferock
        20
    ferock  
    PRO
       2016-08-29 11:31:51 +08:00
    @EXDestroyer 不同的游戏,处理方式不一样,因为要求也不一样。没有具体业务场景,聊技术方案就是耍流氓
    EXDestroyer
        21
    EXDestroyer  
    OP
       2016-08-29 11:36:44 +08:00
    @learnshare 如果按你这个解释的话,那么对于 web 层面来讲, css 动画的状态服务器根本没法保存,实现方式应该是其他方案
    shunia
        22
    shunia  
       2016-08-29 12:05:09 +08:00
    拿炉石打比方的话,一般的卡牌打出过程(比如任何无特效的放置牌),协议可以理解成这样:
    时间戳 动作类型-出牌 卡牌 10001 打出
    ......
    时间戳 动作类型-出牌 卡牌 10001 结束
    这样就能从协议层面上解决动画播放同步的问题。
    对于复杂的卡(导演),中间可能增加几个状态。

    比如鼠标滑过自己的卡牌,会有一个冒头的效果,也可以用同样的道理去定这个协议。

    当三方观战者加入时,并不是只收到最新的协议包,而是根据实际需要(可能是写死可能是服务器动态下发),获取最近的一批数据包。
    这样对于客户端来说(任意一方,甚至是触发这个特效的一方),都可以通过这个时间戳加动作类型的一连串的包,计算当前的动画效果和播放状态,来实现任意细节的同步。

    这就像是一个日志的记录、回放工具。
    arzusyume
        23
    arzusyume  
       2016-08-29 12:42:56 +08:00
    只要维护一个状态的开始时间, 理论上客户端是可以算出当前动画的状态的
    learnshare
        24
    learnshare  
       2016-08-29 13:23:20 +08:00
    @EXDestroyer 也不会用 CSS 做实时性高的东西,对吧
    ljbha007
        25
    ljbha007  
       2016-08-29 14:20:49 +08:00
    炉石传说你看到技能进行到一半是因为 前一半在加载的时候就播放了
    yanchao7511461
        26
    yanchao7511461  
       2016-08-29 19:26:59 +08:00
    关键帧同步
    tttwww18
        27
    tttwww18  
       2016-08-30 12:36:55 +08:00
    动画都是实时渲染支持即时回放的,不需要同步动画的状态,游戏过程中只同步场景状态和操作序列即可,
    EXDestroyer
        28
    EXDestroyer  
    OP
       2016-08-30 13:35:52 +08:00
    @tttwww18 那么这种动画是采用什么制作的呢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2937 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 00:29 PVG 08:29 LAX 17:29 JFK 20:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86