Actionscript-3 - 如何将显示帧率修复为60?

时间:2013-09-22 10:21:12

标签: actionscript-3 flash sprite frame-rate

2种不同的 FPS:

  • 后台用于精灵更新的FPS
    • 和CPU允许的速度一样快
    • 或多或少恒定60 FPS(廉价精灵更新)
  • 显示FPS(使用Fraps可见)
    • 在sprites四处移动时上升至60
    • 在没有精灵移动时降至0

我想让显示器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;
    }
}

4 个答案:

答案 0 :(得分:1)

我发现不满意方式来完成我的要求:

将一个精灵添加到不可见的的舞台上,然后让它在屏幕上移动。如果它离开屏幕,帧速率将再次下降。

答案 1 :(得分:0)

如果您添加一个ENTERFRAME事件监听器,触发每个帧(最多请求的FPS速率),无论是否进行任何重绘。如果它低于那个,那么它只是意味着它没有设法快速渲染帧。疯狂猜测?我说的是它的代码性能。 : - )

此外,计时器文档指出您不应该在短于20毫秒的时间间隔内使用它,并且将其设置为低于16.6毫秒会使闪存内部工作混乱。

Timer Documentation

我建议重构您的应用以使用ENTERFRAME事件而不是Timer事件,并使用帧之间的实际经过时间来计算动画位置。

答案 2 :(得分:0)

尝试使用Adobe Scout。我会在闪存帧运行时以及更新显示时向您显示。您可以获得有关应用程序工作方式的更多详细信息。为什么在没有任何更改的情况下,您希望Flash更新物理显示?它不会有任何成就。如果你真的想强迫它,修改显示屏上的一些位并再次设置它们。 Scout将准确显示每帧中更新的位数。

答案 3 :(得分:-1)

  1. 不要使用计时器。这并不意味着要做你想要的事情。
  2. 在编译期间将SWF帧速率设置为60,可以是SWF标头元标记,也可以是编译器设置。
  3. 使用ENTER_FRAME事件来运行您的代码(例如updateSprites())。
  4. 您可以跳过一些帧,具体取决于动画的复杂程度。 这是不可避免的。试图“强制”帧率不会起作用,只会让事情变得更糟。如果您需要每秒运行60次,您可以在getTimer()事件中检查ENTER_FRAME,并确保执行了多次。但它仍将以较低的帧速率渲染。