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。

问题实际上是在按下或释放键的那一刻,几乎无法察觉的丢帧。反复按键会导致丢帧越来越严重。按住一个键不会杀死帧速率,除了按下该键时的单个瞬间丢帧。之后比赛照常进行。放开键会导致另一个小故障,然后帧率恢复正常。

编辑 2 - 我添加了一个帧率检查器,这样我就可以准确地看到帧率发生了什么。有趣的是,即使我非常快速地按键,我也不能让它低于 30fps。Flash Player 是否有某种限制?

4

2 回答 2

1

事实证明,代码一直都是正确的。在调试播放器或独立播放器中播放 60FPS 内容会导致任何事件(鼠标和键盘)影响帧率。在浏览器中查看相同的内容,或导出到 AIR,可以完全解决问题。内容现在以 60fps 的速度完美运行,没有任何减速。

希望这对某人有帮助,我把头发扯掉了!

于 2012-07-16T12:26:28.603 回答
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;
      }
   }
}
于 2012-07-15T13:54:35.760 回答