2012-07-15 51 views
1

我正在使用四个同时按键的游戏。它一切正常,除了当按键被快速按下时,我的帧速率显着减慢(如果我甚至只敲一个键,我可以减半)。键盘监听器正在杀死我的帧速率

我最初只是假设在按键触发器的方法中发生了太多的事情,但如果我完全将方法从代码中取出,减速仍然会发生。

有没有人遇到过这个?按键就是您按下按键的按键,因此它会每隔一帧重复发出一次方法调用,但这对于许多用途来说是非常标准的,而我以前从未遇到过这种情况。

编辑:澄清。 在结构上,有连接到舞台上的KEY_DOWN和KEY_UP听众:

stage.addEventListener(KeyboardEvent.KEY_DOWN, menuKeyDown); 
stage.addEventListener(KeyboardEvent.KEY_UP, menuKeyUp); 

,然后调用在单个switch语句中,包含五行这样的方法:

case ONE: pressing1 = true; break; 

有一个ENTER_FRAME事件,检查是否有任何布尔标志为真,并处理字符移动。无论按下哪个按键,这个计算都会发生(即如果你放开按键,重力仍然有效)。这容易保持60fps。

这个问题实际上是在按下或释放按键的确切时刻,有一个几乎察觉不到的框架下降。反复按键会导致framedrop变得越来越糟。按下按键不会消除帧率,除了按下按键时的单个分割秒帧丢弃之外。之后,比赛继续进行。放弃关键会导致另一个小小的障碍,然后帧速率恢复正常。

编辑2 - 我添加了一个帧速率检查器,以便我可以准确地看到帧速率发生了什么。有趣的是,即使按下按键的速度非常快,我也无法使它低于30fps。在Flash Player中播放有什么限制吗?

+0

除非您向我们展示您的一些代码,否则无法真正了解发生了什么事情:添加侦听器的位置以及触发时的操作。 – weltraumpirat 2012-07-15 11:23:41

+0

我会澄清我的问题,坚持 – 2012-07-15 14:21:43

+0

因此,这将是每个关键击中两个函数调用...我不认为这覆盖了所有,或者它呢?怎么样“每个帧触发一个方法调用”? – weltraumpirat 2012-07-15 14:24:53

回答

1

原来的代码是正确的一直。在调试播放器或独立播放器中播放60FPS内容会导致任何事件(鼠标和键盘)与帧率挂钩。在浏览器中查看相同的内容,或者导出到AIR可以完全停止该问题。内容现在可以在60fps下完美运行而不会有任何放缓。

希望这可以帮助别人,我正在撕裂我的头发!

0

您是否拥有多个不同的侦听器,或者一个侦听器能够正确路由按键?我会怀疑前者。解决方案是切换到后者。

我通常做的是有一个对象负责监听按键并将键盘事件转换为其他更有意义的事件。

例如:

protected function handleKeyboardEvent(e:KeyboardEvent):void { 
    if (e.ctrlKey) { 
     switch (e.keyCode) { 
     case Keyboard.A: 
      eventBus.dispatchEvent(new Event(ViewEventKind.SELECT_ALL)); 
      return; 
     case Keyboard.Y: 
      eventBus.dispatchEvent(new Event(ModelEventKind.REDO)); 
      return; 
     case Keyboard.Z: 
      eventBus.dispatchEvent(new Event(ModelEventKind.UNDO)); 
      return; 
     } 
    } 
} 
+0

这是一个单独的键盘监听器,它调用的方法只有一些基本的字符移动代码。即使我将代码拿出并让键监听器调用一个空方法,问题也是一样的。 – 2012-07-15 14:18:53