游戏开发论坛

 找回密码
 立即注册
搜索
楼主: golato

[讨论] 技能释放同步讨论

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2012-6-20 13:06:00 | 显示全部楼层

Re:技能释放同步讨论

汗……9楼打错字了吧,韩国游戏如果容易做外挂那应该是把很多判定放在了客户端……

同步的话拆成两个问题:施法者的同步,技能飞行物的同步

施法者的同步:
如果施法在逻辑上是瞬间的,则无需同步,例如不管施法动作有没有硬直,只要在服务器端施法是个瞬间行为,则施法只需要同步一个开始施法的事件,而施法的过程只是客户端的纯表现,或者反过来说基本不指望服务器端能够在施法过程上防作弊。(这种一般通过CD来限制技能使用频率,所以只要不是格斗游戏之类就不怕这方面的作弊)
如果施法在逻辑上是有过程的,也就是说服务器端认为施法是有过程的,那么就需要同步。两种方案,一种是客户端自己发起,服务器端验证,验证不通过就通知客户端中断,验证通过就在服务器端开始做逻辑;另一种是客户端向服务器端请求发起施法,服务器端通过后施法者的客户端和旁观者的客户端一起开始施法,不通过的话相当于什么都没发生。施法的完成可以做成客户端完成后向服务器端请求,不过那样是以异步的代价换取服务器端减少定时器的好处,不是很必要,最好是服务器端主动通知客户端施法完成。

飞行物的同步:
主要看飞行的时间和空间特性。空间特性就是指逻辑上要不要判定飞行路线上的碰撞,时间特性是指飞行是瞬间的还是有过程的。最简单的是两者皆无,也就是不判定飞行路线的碰撞,并且施法完成后瞬间生效,这种的同步只需要发送一个一次性的事件给客户端就行了。其次是只有时间特性或者只有空间特性的情况:只有空间特性的相对较简单一点,因为仍然是瞬间的逻辑,所以只需要让客户端告诉服务器我要向什么方向或哪个位置使用技能(单体技能的不用再讨论了),然后服务器端检查那一时刻目标区域或路线上有哪些目标即可,然后服务器端把这次事件发给客户端就行了;如果只有时间特性,那么就产生了异步逻辑,施法完成后飞行开始,但这时不会立刻触发技能效果,而只是通知客户端创建一个飞行物,这时要告诉客户端这个飞行物的起点对象、目标对象和飞行时间即可,服务器端的定时器到了再做技能效果的逻辑,由于这里只有时间特性,是锁定了目标对象的,所以完全可以在施法完成时就根据当时的相对距离计算出飞行过程的时间,这个时间不会由于之后的位置变化而有改变。最后最复杂的同时具有时间和空间特性的情况,这里再细分为两种:固定速度,固定时间。固定时间的相对较简单,它跟之前只有时间特性的情况非常类似,只是在飞行时间到了的时候再根据作用范围查找一下目标,也可以理解为结合了前面只有空间特性的那种情况。固定速度的情况,是指飞行物发射之后速度是固定的,这时不管是否锁定目标,都需要在飞行过程中检测碰撞,这意味着需要把飞行物当作一个实体去进行位置同步(这是通用的运动同步问题,对于角色移动还是技能其策略是通用的),并且需要做碰撞检测。碰撞检测的一种做法是客户端请求-服务器端验证,好处是服务器端的逻辑简单,服务器端检测时物体的碰撞范围应该比客户端所用的更大一些,以降低网络延迟的影响,缺陷是一旦网络延迟较大或不稳定,那么可能导致技能命中率比理论上应该的命中率下降很多,因为客户端认为打中的服务器端不一定能打中,而服务器端本来能打中的客户端却不一定会认为打中(也就不会请求验证)。碰撞检测的另一种是完全在服务器端做,缺陷当然就是加重服务器的逻辑复杂度和性能负担,可以把物理模拟作为一个服务拆成单独的进程来缓解这些问题,但是这样又会影响响应的速度(因为处理逻辑的延迟会增大一点),这种在网络不好的情况下会导致客户端的表现和服务器端的不一致,不过至少网络卡的时候你可以做概率射击……总体来说越复杂的方案用的越少,特别是在目前的网络条件下,网络延迟的稳定性恐怕得不到多少保证,所以那些对延迟敏感的方案做起来吃力不讨好。说实话我越来越觉得这些东西虽然做好了会很出彩,但是这些东西如果简化好了,在其他方面做得好点,可能游戏也会好玩,而且可能其他方面的投入产出比会更好点……
如果考虑那种把主要逻辑都放在客户端然后服务器端不怎么防作弊的方案,我觉得不如考虑做其他类型的游戏,风险不见得会变大……

6

主题

25

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2012-6-27 11:23:00 | 显示全部楼层

Re:技能释放同步讨论

策划如果不顾程序或者美术的合理性设计的话,只能算是有想法的人,不能算是做游戏的专业策划。
程序和美术的设计都是依托策划的设计,其设计性合理与否都跟策划需求有直接关联。
当然也不是非要打肿脸充胖子,一味折中策划需求,节省程序和美术的工作量,需要明确自己底限是什么,什么是需求当中最为核心的,其他的就要靠多沟通交流了。

91

主题

3122

帖子

3263

积分

论坛元老

Rank: 8Rank: 8

积分
3263
发表于 2012-6-27 14:07:00 | 显示全部楼层

Re:技能释放同步讨论

sj如同其名一样,一看就知道是个连混碗饭都不成功的小混混,纯业余的文字描述,又臭又长。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2012-6-29 10:50:00 | 显示全部楼层

Re:技能释放同步讨论

哈哈,rgame你要想让自己显得专业一点,你就说点专业的东西呗?你想让我不用业余的文字来描述?我写代码你能看懂?或者我写伪代码你能看懂?又或者我画UML你能看懂?你那些假大空的话说来说去就那么点内容,装*都装得不够成功啊……

14

主题

2184

帖子

2819

积分

金牌会员

Rank: 6Rank: 6

积分
2819
发表于 2012-6-29 16:17:00 | 显示全部楼层

Re: Re:技能释放同步讨论

sjinny: Re:技能释放同步讨论

哈哈,rgame你要想让自己显得专业一点,你就说点专业的东西呗?你想让我不用业余的文字来描述?我写代码你能...



精神棒子能看懂的中国字有限,你要体谅它

14

主题

2184

帖子

2819

积分

金牌会员

Rank: 6Rank: 6

积分
2819
发表于 2012-6-29 16:24:00 | 显示全部楼层

Re:技能释放同步讨论

golato: 技能释放同步讨论
施放者触发技能施放、播放效果并发送消息到服务端,服务端验证并处理技能消耗后广播给区域用户(自己扣蓝之类的,其他用户播放效果)。施放者触发技能之后在对应的时间点进行碰撞检测并把结果发送到服务端,服务端验证此次结果并处理后广播给其他用户



为什么不能在施法者触发技能释放时预计算碰撞检测,把两次消息合成一次呢?

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2012-6-29 18:53:00 | 显示全部楼层

Re:技能释放同步讨论

如果在施法开始的时候计算碰撞,那意味着逻辑上飞行过程是瞬间的,这个就看要把技能做成什么样了

14

主题

2184

帖子

2819

积分

金牌会员

Rank: 6Rank: 6

积分
2819
发表于 2012-6-29 19:20:00 | 显示全部楼层

Re: Re:技能释放同步讨论

sjinny: Re:技能释放同步讨论

如果在施法开始的时候计算碰撞,那意味着逻辑上飞行过程是瞬间的,这个就看要把技能做成什么样了



可以根据距离预判吧,RPG对碰撞和距离的要求又没那么精确。

如果是ACT或者FPS那另说

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2012-6-29 19:26:00 | 显示全部楼层

Re:技能释放同步讨论

比如说一个冲击波向前打一条线,如果冲击波是有飞行过程的,那么应该是冲击波推到目标面前的时候才能算打中对方,那么如果施法时目标在这条线上,但是推到面前之前他就走开了,这样就应该打不到才对,而这个如果用施法时就检测能打到谁的做法就实现不了了。

91

主题

3122

帖子

3263

积分

论坛元老

Rank: 8Rank: 8

积分
3263
发表于 2012-6-29 20:00:00 | 显示全部楼层

Re:技能释放同步讨论

业余的人口里吐出的果然是水,无法专业~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-29 05:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表