2种不同的 FPS:
我想让显示器FPS保持在60 FPS。如果Adobe无法改变我需要知道的东西或......
如何使显示屏FPS保持在60?
清除误解: Fraps挂钩WinApi函数SwapBuffers
。因此,每当游戏窗口通过交换缓冲区显示新的渲染场景时,Fraps就有机会复制缓冲区内容并在其上放置一些FPS计数器。 Flash经过优化可节省GPU时间。当没有任何改变时,没有任何东西被吸引到另一个缓冲区并且不执行缓冲区交换。其实这是件好事。但我仍然想知道我是否可以禁用此优化。我不是要尝试禁用vsync,而是将CPU FPS与CPU FPS相等。
public class Main extends MovieClip
{
public function Main()
{
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event: Event): void
{
//updateSprites();
}
}
示例:
import flash.display.MovieClip;
import flash.events.Event;
[SWF(frameRate="60",backgroundColor="0xffffff",width="960",height="540")]
public class SimpleSprite extends MovieClip
{
public function SimpleSprite()
{
for (var i: int = 0; i < 32; i++)
{
var angle: Number = 2 * Math.PI * Math.random();
var color: uint = 0x1000000 * Math.random();
var length: Number = 1024;
graphics.lineStyle(2, color);
graphics.moveTo(-Math.sin(angle) * length, -Math.cos(angle) * length);
graphics.lineTo(Math.sin(angle) * length, Math.cos(angle) * length);
}
x = stage.stageWidth / 2;
y = stage.stageHeight / 2;
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event: Event): void
{
rotation += 0.002;
}
}
答案 0 :(得分:1)
我发现不满意方式来完成我的要求:
将一个精灵添加到不可见的的舞台上,然后让它在屏幕上移动。如果它离开屏幕,帧速率将再次下降。
答案 1 :(得分:0)
如果您添加一个ENTERFRAME事件监听器,将触发每个帧(最多请求的FPS速率),无论是否进行任何重绘。如果它低于那个,那么它只是意味着它没有设法快速渲染帧。疯狂猜测?我说的是它的代码性能。 : - )
此外,计时器文档指出您不应该在短于20毫秒的时间间隔内使用它,并且将其设置为低于16.6毫秒会使闪存内部工作混乱。
我建议重构您的应用以使用ENTERFRAME事件而不是Timer事件,并使用帧之间的实际经过时间来计算动画位置。
答案 2 :(得分:0)
尝试使用Adobe Scout。我会在闪存帧运行时以及更新显示时向您显示。您可以获得有关应用程序工作方式的更多详细信息。为什么在没有任何更改的情况下,您希望Flash更新物理显示?它不会有任何成就。如果你真的想强迫它,修改显示屏上的一些位并再次设置它们。 Scout将准确显示每帧中更新的位数。
答案 3 :(得分:-1)
ENTER_FRAME
事件来运行您的代码(例如updateSprites()
)。您可以跳过一些帧,具体取决于动画的复杂程度。 这是不可避免的。试图“强制”帧率不会起作用,只会让事情变得更糟。如果您需要每秒运行60次,您可以在getTimer()
事件中检查ENTER_FRAME
,并确保执行了多次。但它仍将以较低的帧速率渲染。