2

私は現在、SFML で最初のゲーム (および最初の全体) をプログラミングしようとしていますが、1 秒に 1 回程度途切れるという問題に遭遇しました。このようなスタッターの間、フレームタイムは通常よりも 3 倍から 4 倍高くなります。これは、非常に高い FPS (300+) を実行しない限り、非常に顕著です。

パフォーマンスは問題ではないため、問題はありません (少なくとも atm)。

それを行うと、私の動きの方法は本当におかしくなり、本来の動作よりもはるかに遅くなります。

私の移動方法:

void Player::Update(float frametime){
    mMovementSpeedTimefactor = frametime * 60 / 1000.0f;

    setMovementVector(sf::Vector2f( mMovementVector.x * mMovementSpeedTimefactor, mMovementVector.y *mMovementSpeedTimefactor));
    validateMovement();
    //std::cout << mTestClock->restart().asMilliseconds() << std::endl;

    moveObject();
    this->updateAnimation();
}

frametime はミリ秒単位のフレーム時間です。移動速度はフレームごとではなくピクセル/秒の値として設定されるため、60 を掛けます。

移動速度は 5 であるため、FPS (したがってフレームタイム) に関係なく、キャラクターは毎秒 5 ピクセル移動する必要があります。

しかし、これらの「stutterframes」はジャンプを引き起こし、stutterframes では、palyer は本来よりもはるかにゆっくりと動きます。

私のメインループは本当にシンプルです

while(mMainWindow->isOpen()){

        HandleEvents();
        Update();
        Render();
    }

inbuild フレームリミッターを使用している間 (自分で書いてみましたが、CPU コアが 100% の負荷で実行されないように sf:sleep を使用して FPS を調整している限り、まったく同じ結果が得られます) を 300 FPS にします。

ええ、標準速度を 5 ではなく 1 に設定することもできますが、setframeratelimit はあまり正確ではないため、移動速度に多少のばらつきが生じてしまい、それがあまり好きではありません。

誰にもアイデアがありますが、私は何ができるでしょうか? 多分私はすべての木の森を見ているわけではありません (英語でそれを言うかどうかは実際にはわかりません:P) が、これは私の最初のゲームであるため、振り返る経験がありません.

4

2 に答える 2

2

同様の質問:フレームレート制限なしの動き C++ SFML .

本当に必要なのは固定時間ステップです。SFML Game development book source codeを見てください。Application.cppの興味深いスニペットを次に示します。

    const sf::Time Game::TimePerFrame = sf::seconds(1.f/60.f);

    [...]

    sf::Clock clock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    while (mWindow.isOpen())
    {
        sf::Time elapsedTime = clock.restart();
        timeSinceLastUpdate += elapsedTime;
        while (timeSinceLastUpdate > TimePerFrame)
        {
            timeSinceLastUpdate -= TimePerFrame;

            processEvents();
            update(TimePerFrame);

        }

        updateStatistics(elapsedTime);
        render();
    }

編集:これが本当にあなたが望むものではない場合は、SFML フォーラムで Laurent Gomila 自身がリンクしている" Fix your timestep! " を参照してください。

于 2013-09-17T10:38:19.657 に答える