游戏开发论坛

 找回密码
 立即注册
搜索
查看: 12674|回复: 34

关于物体的移动

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2003-11-5 18:15:00 | 显示全部楼层 |阅读模式
先给出CGD论坛上的贴子:
http://bbs.chinagamedev.net/showthread.php?s=13ed48a678b50324e40cb6969313d6bd&threadid=4880
主要内容是:
========================sjinny==================================
有几个问题:
在程序中,物体的移动是怎么实现的?如果是每隔一点时间就改变一下物体的坐标然后渲染,那么用在网络游戏里该怎么办呢?网络游戏里如果每隔一点时间就是刷新物体坐标并广播,那么运算资源和网络资源的占用不就太夸张了?
还有,所谓“移动”到底是个什么样的概念?
电影能有运动的效果是因为“视觉暂留”,但是具体的我记不清了,我只能想到:
在足够短的时间里,让物体有不太大的变化,并且连续这样变化,观看者就会觉得在运动,那么这个“足够短的时间”不就是坐标应该刷新的时间周期吗?而那个“不太大的变化”又会影响这个刷新周期,因为速度不同的物体移动时,可能会有物体因为太快了,而使相邻两桢中这个物体的位移太大,于是看着就好像是瞬间移动一样,而且是一跳一跳的~~
========================maple===================================
网游并不是每帧刷新都广播,而是有一个时间间隔,可能一秒或半秒通信一次,每次通信也只传送可见对象的坐标,不是大问题
=========================sjinny=================================
即使是每0.5s刷新一次,那么也得:
遍历所有对象,更新因运动而改变的坐标,
更新过所有对象的坐标后,广播更改了的坐标
几大百号玩家再加N多的NPC和物品,那么每次的运算不就太大了??
还有,这个刷新周期又怎么确定呢?

我想的是:
客户端只发送玩家人物状态改变的信息,比如告诉服务器,人物现在开始向某个方向跑动之类,让服务器知道当前最新的运动状态,服务器收到后,会先根据原先的一个运动状态和一个位置坐标,更新坐标,让这个坐标作为下次更新的计算基础,再更新运动状态,然后广播,这样坐标的更新只需要在其他可以看到这个人的客户端上进行了。但是我觉得不放心,这样似乎有安全隐患~~~~
而且,运动过程中,还得有碰撞检测呀。
当然也有办法,让控制这个人物的客户端每隔一点时间就检测一下碰撞情况,如果发生了碰撞导致人物运动状态改变(比如停了下来),那么就告诉服务器状态改变了,其他客户端也差不多吧~~
但是,因为我这个游戏是要开放源代码的,如果用户修改了客户端的代码,在发生碰撞时并不告知服务器,那么会不会出现安全性问题?我还是不放心~~
==============================================================

请大家发表意见~~~~

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20505
发表于 2003-11-6 10:22:00 | 显示全部楼层

Re:关于物体的移动

那种只发送人物状态改变的方法并不好,我以前也编写过类似的项目,在网络不稳定的情况下,同步问题简直就是噩梦,除非再加入一些验证机制。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2003-11-6 11:09:00 | 显示全部楼层

Re:关于物体的移动

呵呵,俺以前不是有文章讲过一种叫dead reckoning的算法嘛。。
核心思想是这样子的:
首先定义个物体移动的数据包的结构,包含:
物体运动方向,物体运动加速度,物体运动速度

然后定义一个最小误差值,当客户端的操作超过上一次发送的物体移动数据包中记录的数据的最小误差的时候,就把目前的包发送过去。

那么即使你的客户端发生比较小的锯齿型运动轨迹的时候,在别的客户端看来,还是在进行直线运动。

该算法是美国军方用来做飞机的导航预测的。

http://www.gameres.com/Articles/Abstract/DeadReckoning.htm

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2003-11-6 23:27:00 | 显示全部楼层

Re:关于物体的移动

sea_bug,为什么这种方法会有同步的问题呢?

tarkey,我看了你的文章,但是dead reckoning能完成显示上的同步,怎么让服务器进行碰撞检测呢?

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2003-11-7 09:20:00 | 显示全部楼层

Re:关于物体的移动

。。。服务器只是做消息的转发,不做碰状检测的。
碰状检测让每个客户端自己去做。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2003-11-7 12:24:00 | 显示全部楼层

Re:关于物体的移动

晕,因为我做的是网络游戏,所以在服务器端使用八叉树来分割整个世界,所以当一个人物移动到另一个空间节点时,得让服务器操作八叉树;当要广播一个消息时,可以靠八叉树来在一定的范围内进行广播~
而且,让客户端做碰撞检测的话,如果客户端修改了代码,那么不就可以很方便地作弊了吗?比如穿墙,比如人物在天上飞~~
而且,如果有射击的话,那些子弹的碰撞检测应该由服务器完成吧?

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2003-11-7 13:46:00 | 显示全部楼层

Re:关于物体的移动

呵呵,如果是做MMORPG的话,是没办法避免这种行为的作弊的。
现在市面上的游戏几乎都有自己行走的外挂,就是因为没法做服务器端阻挡,如果是2D的话,服务器还可以做做阻挡判断,如果是3D的话,计算量太恐怖。

服务器可以在某种程度上判断是否合理,但是要做到精确的判断,确实很困难。比如说,判断每次的步长是否合理,你的当前速度是否合理,你的运动速度是否合理等等。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2003-11-7 16:58:00 | 显示全部楼层

Re:关于物体的移动

晕,你打击我哦~~~~~~
那怎么办呢?其他的游戏,客户端是不开源的,要作弊还不太容易,我的是开源的,要作弊就容易多了~~

不过,能不能这样:
一个玩家控制的人物,会被其他玩家“看到”,也就是说,这个人物会在其他客户端上显示出来,当然这个人物的各种状态信息也会存在于其他客户端上,那么是否可以这样,产生一种合理性判断的“民主”规则,就是说,如果一个人物的人物状态被大多数人所不信任,那么服务器也不信任他。比如:某个客户端上,在显示其他玩家的人物时,会在每次渲染开始时更新其他玩家人物的坐标等状态信息,并且做一些合理性检测(包括碰撞检测),如果发现某个玩家人物应该被阻挡了(或发生碰撞了),那么就发送一个信号给服务器,当服务器受到足够多的(针对同一个人物对象的)信号后,就会进行一些检测,按照“有则改之,无则加勉”的原则,维护这个玩家人物的状态;当然,也可以设立一个记录机制,如果发现某个用户的客户端总是发送些不正确的信号对服务器进行干扰,那么就会对这个用户进行适当的惩罚,或屏蔽他以后的信号。总之,服务器端大多数的合理性检测,都是在收到足够多的(其他客户端的)“不信任投票”后进行的。而服务器端的八叉树的维护问题也是一样~~

各位看这样可行吗?

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2003-11-7 18:08:00 | 显示全部楼层

Re:关于物体的移动

呵呵,这个问题还不如建立一个服务器绝对信任的隐性客户端。
或者就在服务器本地连接服务器运行。

如果7个人,有4个人使用外挂,那没使用的3个人岂不倒霉,不妥不妥。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2003-11-7 18:25:00 | 显示全部楼层

Re:关于物体的移动

服务器绝对信任的隐性客户端?你是说,在开源的客户端之外,再发布一个不开源的程序,由它来在客户端上进行数据合理性的检测??

>如果7个人,有4个人使用外挂,那没使用的3个人岂不倒霉
我想不存在这个问题。因为“不信任投票”发到服务器后,到底这个用户是否值得信任,还要由服务器来检测,由服务器说了算,客户端只是提起检测要求而已~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-14 20:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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