使用AS3的TouchEvent处理多点触控时,我遇到了奇怪的行为。在某些情况下,触摸会明显滞后,但是Flash的帧频不会受到影响。好像触摸被缓冲了,事件直到触摸后几秒钟才被调度。

我在此处上传了一个演示:https://youtu.be/omkCDqljfio

我仅设法在Flash Player的ActiveX版本中重现了这种触摸滞后,但在Windows 10和Windows 7中均已重现了它。因此,我在这里拥有一个托管AS3测试套件的C#应用​​程序,但是如果在Internet Explorer中查看swf,也可以观察到。

由于我的应用程序已经涉及到在WPF窗口中托管SWF,因此我一直在尝试创建一种解决方案,其中在C#中接收触摸,然后将其传达给AS3。它将正常工作,但是当触摸在WindowsFormsHost上时,我的WPF窗口似乎没有接收触摸框。因此,还有一个我必须解决的问题。

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。降低帧频可解决此问题。

但是,当帧速刚好不足时,触摸事件就会有这么长的延迟,这仍然很奇怪。

08-05 23:39
查看更多