如何修复 Flash 中的触摸延迟?
How can I fix touch lag in Flash?
我在使用 AS3 的 TouchEvent
处理多点触控时遇到了奇怪的行为。触摸在某些情况下会明显滞后,但 Flash 的帧速率不会受到影响。就好像触摸被缓冲了,事件直到触摸几秒钟后才被调度。
我在这里上传了一个演示:https://youtu.be/omkCDqljfio
我只在 Flash Player 的 ActiveX 版本中重现了这种触摸延迟,但我在 Windows 10 和 Windows 7 中都重现了它。所以我在这里有什么是托管我的 AS3 测试套件的 C# 应用程序,但如果在 Internet Explorer 中查看 swf 也可以观察到它。
由于我的应用程序已经涉及在 WPF window 中托管 SWF,我一直在尝试创建一个解决方案,在该解决方案中,触摸在 C# 中接收,然后与 AS3 通信。它会完美地工作,但当触摸 WindowsFormsHost
时,我的 WPF window 似乎没有接收到触摸帧。所以我还有一个问题要解决。
FlashDevelop 项目:https://drive.google.com/file/d/0BxC2eCzurT9rd0gzSGc4TUdQLTQ/view
Visual Studio解决方案:https://drive.google.com/file/d/0BxC2eCzurT9rUThmRHBKWHZmbzA/view
AS3 触摸事件:
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
stage.addEventListener(TouchEvent.TOUCH_BEGIN, stage_touchBegin);
stage.addEventListener(TouchEvent.TOUCH_MOVE, stage_touchMove);
stage.addEventListener(TouchEvent.TOUCH_END, stage_touchEnd);
创建导致延迟的显示对象,大概是因为触摸事件捕获阶段:
for (var i:int = 0; i < 500; i++)
{
Dotter.createBGDot(_bgLayer, _shapesOn ? Shape : Sprite);
}
...
static public function createBGDot(bgLayer:Sprite, dotClass:Class):void
{
var dot:* = new dotClass();
var color:Color = new Color();
color.brightness = Math.random();
dot.graphics.beginFill(color.color);
dot.graphics.drawCircle(0, 0, Math.random() * 400 + 40);
dot.x = Math.random() * bgLayer.stage.stageWidth;
dot.y = Math.random() * bgLayer.stage.stageHeight;
bgLayer.addChild(dot);
}
我知道这是一种不寻常的情况,但我很感激任何有关如何解决这些问题的建议。
既然我已经使用了 Adobe Scout,我认为这毕竟是一个渲染问题。帧速率仍然显示 30fps,因为处理时间勉强达到 30fps 标记。降低帧率可以解决问题。
不过,当帧率刚刚下降时,触摸事件会有这么长的延迟,这仍然很奇怪。
我在使用 AS3 的 TouchEvent
处理多点触控时遇到了奇怪的行为。触摸在某些情况下会明显滞后,但 Flash 的帧速率不会受到影响。就好像触摸被缓冲了,事件直到触摸几秒钟后才被调度。
我在这里上传了一个演示:https://youtu.be/omkCDqljfio
我只在 Flash Player 的 ActiveX 版本中重现了这种触摸延迟,但我在 Windows 10 和 Windows 7 中都重现了它。所以我在这里有什么是托管我的 AS3 测试套件的 C# 应用程序,但如果在 Internet Explorer 中查看 swf 也可以观察到它。
由于我的应用程序已经涉及在 WPF window 中托管 SWF,我一直在尝试创建一个解决方案,在该解决方案中,触摸在 C# 中接收,然后与 AS3 通信。它会完美地工作,但当触摸 WindowsFormsHost
时,我的 WPF window 似乎没有接收到触摸帧。所以我还有一个问题要解决。
FlashDevelop 项目:https://drive.google.com/file/d/0BxC2eCzurT9rd0gzSGc4TUdQLTQ/view Visual Studio解决方案:https://drive.google.com/file/d/0BxC2eCzurT9rUThmRHBKWHZmbzA/view
AS3 触摸事件:
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
stage.addEventListener(TouchEvent.TOUCH_BEGIN, stage_touchBegin);
stage.addEventListener(TouchEvent.TOUCH_MOVE, stage_touchMove);
stage.addEventListener(TouchEvent.TOUCH_END, stage_touchEnd);
创建导致延迟的显示对象,大概是因为触摸事件捕获阶段:
for (var i:int = 0; i < 500; i++)
{
Dotter.createBGDot(_bgLayer, _shapesOn ? Shape : Sprite);
}
...
static public function createBGDot(bgLayer:Sprite, dotClass:Class):void
{
var dot:* = new dotClass();
var color:Color = new Color();
color.brightness = Math.random();
dot.graphics.beginFill(color.color);
dot.graphics.drawCircle(0, 0, Math.random() * 400 + 40);
dot.x = Math.random() * bgLayer.stage.stageWidth;
dot.y = Math.random() * bgLayer.stage.stageHeight;
bgLayer.addChild(dot);
}
我知道这是一种不寻常的情况,但我很感激任何有关如何解决这些问题的建议。
既然我已经使用了 Adobe Scout,我认为这毕竟是一个渲染问题。帧速率仍然显示 30fps,因为处理时间勉强达到 30fps 标记。降低帧率可以解决问题。
不过,当帧率刚刚下降时,触摸事件会有这么长的延迟,这仍然很奇怪。