Цитата:
Смогут и будут происходить. И будут висеть в очереди, пока не наступит новый кадр и их не обработают. При этом есть вполне осязаемый шанс выполнять один и тот же код обработчика 2-3 раза за кадр (рано как и ни одного раза)
|
Поясню свою мысль, возможно неясно выразился. Да, событие мыши может возникать чаще чем enterFrame, но только пока длится фаза событий, если эту фазу нагрузить, то события мыши не будут приходить вообще, в отличие от enterFrame (у плеера нет отдельного модуля, который следит за событиями).
Небольшой тест.
Код AS3:
package
{
import flash.display.*;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
public class Main extends Sprite
{
private var _slowButton:Sprite;
private var _fastButton:Sprite;
public function Main():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var g:Graphics = graphics;
g.beginFill(0);
g.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
g.endFill();
_slowButton = new Sprite();
drawButton(_slowButton.graphics, 0xFF0000);
_slowButton.x = 20;
_slowButton.y = 20;
_slowButton.addEventListener(MouseEvent.CLICK, slow);
addChild(_slowButton);
_fastButton = new Sprite();
drawButton(_fastButton.graphics, 0x00FF00);
_fastButton.x = 140;
_fastButton.y = 20;
_fastButton.addEventListener(MouseEvent.CLICK, fast);
addChild(_fastButton);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
addEventListener(Event.EXIT_FRAME, onExitFrame);
}
private function drawButton(g:Graphics, color:uint):void
{
g.beginFill(color);
g.drawRect(0, 0, 100, 20);
g.endFill();
}
private function slow(event:MouseEvent) : void {
trace("Slow Event - Start");
var i : int = 0
while(i < 10000000) {
i++;
}
/* Пока работает цикл
* новые события не принимаются.
* Если в этот момент вывести мышь
* за stage, то ни одного
* события mouseMove не возникнет.
* Если поводить мышкой и оставить
* в области stage, то возникнет
* только одно событие mouseMove
*/
trace("Slow Event - Finish");
}
private function fast(event:MouseEvent) : void {
trace("Fast Event");
}
private function onExitFrame(e:Event):void
{
trace("exit");
}
private function onEnterFrame(e:Event):void
{
trace("enter");
var i : int = 0
while(i < 3000000) {
i++;
}
}
private function onMouseMove(e:MouseEvent):void
{
trace("move");
}
}
}
|