日期:2014-05-20  浏览次数:20874 次

帧同步问题(可能需要以前写PC游戏的来程序员来解决)
j2me的 帧数算法的原理我的理解大致是这样:
玩家播一段打击动画, 有50帧的动作
玩家每隔20ms播放1帧, 这个20ms 是 wait(20); 达到的.

所以如果N台j2me机器同时做这个东西的时候 最终他们 播放完毕的时间却并不相等 有的早播完 有的性能差就迟播完.

这样也就造成一个问题. 如果要用 j2me 来写 CS(反恐精英) 那恐怕是不可能的事情.
你想想他的 手雷弹道同步. 玩家移动同步,子弹弹道同步.

想想都不可能.

当然,我也不是异想天开. 比如现在android也沿用j2me的这一系列帧数计算模式. 但是android上如果要做其他基于wifi的小局域网应用呢? 如果真有一个 需要帧同步的场景呢.

我从某些PC单机游戏的同步算法里了解到了一个叫什么什么时间模型的算法. 也就是不以帧数为单位.
1,比如播20帧需要x个单位的现实时间. 
2,而是既定的20单位的现实时间去播10个帧

相比较1而言,2没有未知数. 也就是说10个帧 你必定要在20单位时间内播放完成.这样的话 我们大家所看见各人的屏幕大家的画面就相同了.
----------------------

具体代码就不要了(当然如果有就更好了,语言不限)
最重要的是帮我解释一下这个 [时间模型] 的算法具体怎么实现. (可以以 联机足球游戏/联机射击游戏 为例子展开对这个问题的讨论. 当然,你不需要过多考虑wifi网络传输延迟.我自己有一些办法解决这个)

------解决方案--------------------
帮頂!!!!!!!!
------解决方案--------------------
自己写一个定时器系统,定时器系统的实现原理大体跟LZ说的时间模型相同

原理是把每个定时器都注册到这个系统中,然后由系统统一处理每个定时器触发事件的时间

系统会有一个循环更新函数,在每次循环时,检查是否有定时器达到触发事件的时间,如果有到达触发时间,就执行触发函数(如果目标机器性能低,在检查的时候有可能会出现当前时间已经过了应该触发事件的时间,那么就把这个时间累计起来,如果累计的时间也达到触发一次事件的间隔时间,就再多触发一次事件,多次的话也一样)这样就能实现即便是在性能低的机器上跑程序,也能达到在同一时间段后,执行程序的效果跟性能好的机器相同,只是画面看起来会不流畅,应为卡时之后的几帧会播的很快

其实现在很多游戏用的都是这种算法,像梦幻西游,会发现,如果卡时想移动人物,人物会在卡一下后立刻以很快的速度再移动过去
------解决方案--------------------
还有,那个wait(20); 是阻塞的函数么,如果是的话,不要在游戏程序中使用,这样会导致整个线程都阻塞再那里不能做其他的事情,1是浪费,2是操作画面会不流畅