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

2016-08-29 09:55:50 +08:00
 EXDestroyer

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

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

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

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

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

就是同一套逻辑,客户端和服务器一样而且同步,只是服务器不需要渲染画面。
ferock
2016-08-29 11:31:51 +08:00
@EXDestroyer 不同的游戏,处理方式不一样,因为要求也不一样。没有具体业务场景,聊技术方案就是耍流氓

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/302380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX