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

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

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

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

6494 次点击
所在节点    游戏开发
28 条回复
EXDestroyer
2016-08-29 11:36:44 +08:00
@learnshare 如果按你这个解释的话,那么对于 web 层面来讲, css 动画的状态服务器根本没法保存,实现方式应该是其他方案
shunia
2016-08-29 12:05:09 +08:00
拿炉石打比方的话,一般的卡牌打出过程(比如任何无特效的放置牌),协议可以理解成这样:
时间戳 动作类型-出牌 卡牌 10001 打出
......
时间戳 动作类型-出牌 卡牌 10001 结束
这样就能从协议层面上解决动画播放同步的问题。
对于复杂的卡(导演),中间可能增加几个状态。

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

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

这就像是一个日志的记录、回放工具。
arzusyume
2016-08-29 12:42:56 +08:00
只要维护一个状态的开始时间, 理论上客户端是可以算出当前动画的状态的
learnshare
2016-08-29 13:23:20 +08:00
@EXDestroyer 也不会用 CSS 做实时性高的东西,对吧
ljbha007
2016-08-29 14:20:49 +08:00
炉石传说你看到技能进行到一半是因为 前一半在加载的时候就播放了
yanchao7511461
2016-08-29 19:26:59 +08:00
关键帧同步
tttwww18
2016-08-30 12:36:55 +08:00
动画都是实时渲染支持即时回放的,不需要同步动画的状态,游戏过程中只同步场景状态和操作序列即可,
EXDestroyer
2016-08-30 13:35:52 +08:00
@tttwww18 那么这种动画是采用什么制作的呢

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

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

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

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

© 2021 V2EX