我正在开发一款使用四个同时按键的游戏。这一切都很好,除了当按键被快速按下时,我的帧速率显着减慢(如果我甚至只敲击其中一个键,我可以将帧速率减半)。
我最初只是假设按键触发的方法中有太多的事情发生,但如果我完全取出该方法的代码,则仍会发生减速。
有没有人遇到过这个?按键是你按住按键的按键,所以它每帧反复触发一个方法调用,但这对很多用途来说非常标准,我以前从未遇到过。
编辑:澄清。 在结构上,有一个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中是否存在某种限制?
答案 0 :(得分:1)
事实证明代码一直都是正确的。在调试播放器或独立播放器中播放60FPS内容会导致任何事件(鼠标和键盘)挂起帧速率。在浏览器中查看相同内容或导出到AIR会完全停止该问题。内容现在以60fps完美运行,没有任何减速。
希望这有助于某人,我正在撕扯我的头发!
答案 1 :(得分: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;
}
}
}