我的游戏中有大约10000个物体,当鼠标移动时,我只有60(最大)FPS。但是当你开始在圆圈中移动鼠标时,FPS会尝试在45处达到30的平均值。当你停止鼠标时它会立即变为60(因为程序失去了它的心跳)。 SWF是独立运行的 - 没有任何浏览器。
我删除了所有MouseEvent.MOUSE_MOVE
个侦听器,并为主要课程制作了mouseEnabled=false
和mouseChildren=false
。
我将FPS从12点逐一增加到60点 - 我给出生的每一帧画了名字,看着其中15个因为什么都没死而真的很痛苦......
示例代码:
public class Main extends Sprite
{
private var _periods : int = 0;
/** Idling FPS is 23. Move mouse to drop FPS to 21.*/
public function Main() : void
{
//true if need to drop FPS to 18 instead of 21 moving mouse:
const readyToKill2MoreFrames : Boolean = true;
if ( readyToKill2MoreFrames )
{
var ellipse : Sprite = new Sprite;
ellipse.graphics.beginFill( 0x00FF00 );
ellipse.graphics.drawEllipse( 300, 300, 400, 200 );
ellipse.graphics.endFill();
addChild( ellipse );
//uncomment to fall only to 21 instead of 18:
/*ellipse.mouseChildren = false;
ellipse.mouseEnabled = false;*/
}
var fps : TextField = new TextField;
//uncommenting doesn't change FPS:
//fps.mouseEnabled = false;
addChild( fps );
fps.text = "???";
fps.scaleX = fps.scaleY = 3;
var timer : Timer = new Timer( 1000 );
timer.addEventListener( TimerEvent.TIMER, function( ... args ) : void
{
fps.text = _periods.toString();
_periods = 0;
} );
timer.start();
addEventListener( Event.ENTER_FRAME, function( ... args ) : void
{
//seems like PC is too fast to demonstrate mouse movement
// drawbacks when he has nothing else to do, so let's make
// his attention flow:
for ( var i : int = 0; i < 500000; ++i )
{
var j : int = 2 + 2;
}
++_periods;
} );
}
}
答案 0 :(得分:1)
你可能已经转向了更现代的问题,但我最近自己也在努力解决这个问题,所以这里有一个答案,可以解决未来不幸遇到的问题。十年之久的罪过。
事实证明,对旧式按钮的传统支持是罪魁祸首。在优秀的Scout分析工具上引用Adobe的tutorial:
&#34; Flash Player有一些特殊代码来处理旧式按钮对象(您在Flash Professional中创建的那种)。 独立于查找鼠标的ActionScript事件处理程序 事件,它会在显示列表中搜索任何这些按钮 鼠标移动。如果您有大量的,这可能会很昂贵 显示列表上的对象。不幸的是,这个操作发生了 即使你不使用旧式按钮对象,但Adobe正在工作 解决这个问题。&#34;
原来Adobe从来没有真正解决这个问题,所以任何大量的DisplayObjects
都会在鼠标移动时对你的FPS造成严重破坏。唯一的解决方法是以某种方式合并它们,例如通过使用Graphics
批量绘制它们。在我的早期测试中,似乎设置mouseEnabled = false
也没有实际效果。