|
角色卡与抖动
传奇为什么会很卡?掉线时这种效果最明显
人物起跑“走一动,卡一步”
那是因为传奇这种网络游戏的客户端和服务端是基于消息通讯的.Grobal2.pas,客户端和服务端通用的文件,定义了一些消息标识,数据结构,消息操作函数,当网卡或掉线时人物起跑,走动都在客户端和服务端存在着基于消息标识的交互客户端不能及时向服务器发送消息或得不到服务器的反馈消息就会卡(服务器当然不会卡)
传奇服务器不是在线电影服务器,吞吐量不大,但是线程繁多,复杂。线程再传奇内部已经得到一定处理(m2server.exe和rungate之间的数据分析)。但是,一个玩家造成的线程是持续的2条,一条进一条出。
如果一个大型网站可以牺牲相应率来保证质量的话,他可以提高1倍以上的浏览量,但是传奇不行,稍微有差错,就是用户断线,容不得有半点不持续,而且这个持续时间是几个小时甚至10几个小时,而且这条线程是占用独立的跑到的,一旦确认除非客户断线,或者服务器断线,否则是不会撤销的,甚至客户不是安全下线,服务器仍旧会在一段时间里面持续这条线程。
会抖动是因为为了【移动加速】
移动是在PlayScene.run里面 根据上次移动时间来决定角色是不是能执行move,之前不抖动是因为不管其他人的角色速度如何变化
始终是用100毫秒间隔去判断对方是否可以移动(3k是94毫秒) 这种情况下本地玩家和其他玩家的m_shiftX Y m_nRx值是同步更新的。
就不会出现抖动问题。但是有个很大的弊端就是不同步, 如果两个号的移动速度不一样,本地玩家是跑的很快, 但是在其他人的客户端上绘制位置变更时间会被延长,所以就会出现两个号同样机器显示位置慢了很多,像开外挂一样。
而FIR这种使用了个人角色加速, 他的m_shiftX Y m_nRx 不是同步更新的,所以其他玩家的速度位置可以被更快速的绘制出来。
但是也导致了抖动的出现:其他Actor都是参照本地Actor绘制在屏幕上,当其他Actor的位置变了,本地Actor位置没有同步变的话,就会导致抖动。
目前的解决方案 :本地玩家m_nCurraction = 0 加速其他Actor 使用它们的Actor速度去移动。
否则统一同步绘制。
最佳方法 地图移动改为像素帧移动。但是这个非常麻烦。
|
|