0

私は2008年に作ったFlashゲームを持っています。最近は超高速で動作します。実際には速すぎます。FlashDevelopでは60fpsに設定していますが、これは描画呼び出しの量を制限しているだけだと思います。最近、私のロジックは1秒間に60回をはるかに超えて実行されていると思います。しばらくActionScriptを実行していませんが、ロジックループを実行するenterFrameHandlerを使用していることに気付きました。制約が設定されていないようです。私が信じているように、それはただ発火します。30または60fpsで上限を設定する方法はありますか?助けやアイデアをいただければ幸いです。ロジックの実行速度が速すぎると、ゲームが台無しになります:(

更新 ActionScriptの知識が戻ってきたので、私は何かを考えました。enterFrameHandlerは、プロジェクトプロパティのFlashまたはFlashDevelopでfpsが設定されているものにバインドされていませんか?誰かがこれを確認できますか?それは私の描画呼び出しと論理呼び出しが1:1であることを意味しますか?

4

1 に答える 1

2

実際、enterFrame ハンドラーは、フレームをレンダリングしているとき (この場合は 60Hz) にのみ呼び出されます。

時間を測定することで、何かが実行される回数を制限できる場合。このようなもの:

// A property to store the last time the code was executed
protected var lastTimeCalled:int;

// Inside your enterFrame handler
protected function onEnterFrameHandler(e:Event): void {
    var ti:int = getTimer(); // Get current time
    var desiredFPS:Number = 60; // Actual framerate you want
    var frameInterval:Number = 1000 / desiredFPS; // Desired ms per frame

    if (isNaN(lastTimeCalled) || ti >= lastTimeCalled + frameInterval) {
        // Execute code here
        ...

        // Increase time (by chunks of fixed size for framerate self-adjustment)
        lastTimeCalled = isNaN(lastTimeCalled) ? ti : lastTimeCalled + frameInterval;
    }
}

ただし、SWF のフレームレートが 60 に設定されている場合、desiredFPS を 60 に設定しようとしても何も起こらないことに注意してください。おそらく、いくつかのフレームがドロップされるだけです。ただし、enterFrame ハンドラーが別の場所で呼び出されているかどうかをテストするには、良い方法かもしれません。

于 2010-11-07T17:38:27.700 に答える