0

2 种不同的FPS:

  • 用于精灵更新的背景 FPS
    • 以 CPU 允许的速度运行
    • 或多或少恒定 60 FPS(廉价的精灵更新)
  • 显示 FPS(使用 Fraps 可见)
    • 当精灵四处移动时上升到 60
    • 当没有精灵移动时下降到 0

我想让显示 FPS 保持在 60 FPS。如果 Adob​​e 无法更改我需要知道或...

如何使显示 FPS 保持在 60 ?

消除误解: Fraps 钩住了 WinApi 函数SwapBuffers。因此,每次游戏窗口通过交换缓冲区显示新的渲染场景时,Fraps 都有机会复制缓冲区内容并在其上放置一些 FPS 计数器。Flash 经过优化以节省 GPU 时间。当没有任何变化时,没有任何内容被绘制到另一个缓冲区并且不执行缓冲区交换。其实这是一件好事。但我仍然想知道是否可以禁用此优化。我不是要禁用 vsync,而是要使 GPU 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

4 回答 4

1

我找到了一种不令人满意的方式来完成我的要求:

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

于 2013-10-18T13:04:57.013 回答
0

尝试使用 Adob​​e Scout。我它会告诉你什么时候闪帧正在运行,什么时候显示更新。您可以获得有关应用程序如何工作的更多详细信息。为什么您希望 Flash 在没有任何更改的情况下更新物理显示?它不会完成任何事情。如果您真的想强制执行此操作,请修改显示屏上的一些位并重新设置它们。Scout 将准确显示每帧中更新了哪些位。

于 2013-10-09T16:43:05.060 回答
0

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

此外,Timer 文档指出您不应该将其用于短于 20 毫秒的间隔,并且将其设置为低于 16.6 毫秒会干扰闪存内部工作。

计时器文档

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

于 2013-09-22T23:23:01.257 回答
-1
  1. 不要使用计时器。它并不意味着做你想做的事情。
  2. 在编译期间将 SWF 帧速率设置为 60,无论是在 SWF 标头元标记上还是在您的编译器设置上。
  3. 使用ENTER_FRAME事件来运行您的代码(例如updateSprites())。

您可能会跳过一些帧,具体取决于动画的复杂程度。那是不可避免的。试图“强制”帧率是行不通的,只会让事情变得更糟。如果您需要每秒运行 60 次的东西,您可以检查getTimer()您的ENTER_FRAME活动内部并确保某事正在执行该次数。但它仍会以较低的帧速率呈现。

于 2013-09-23T20:03:49.177 回答