10

SDL を使用して非常に基本的なウィンドウを作成しましたが、ウィンドウで X を押すまで実行し続けたいと考えています。

#include "SDL.h"
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main(int argc, char **argv)
{
    SDL_Init( SDL_INIT_VIDEO );
    SDL_Surface* screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, 0, 
                                            SDL_HWSURFACE | SDL_DOUBLEBUF );
    SDL_WM_SetCaption( "SDL Test", 0 ); 
    SDL_Event event;
    bool quit = false;
    while (quit != false)
    {
        if (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                quit = true;
            }
        }
        SDL_Delay(80);
    }
    SDL_Quit();
    return 0;
}

while句の最後に追加SDL_Delay()してみましたが、うまくいきました。

ただし、プログラムをスムーズに実行し続けるために使用できる最大値は 80 ミリ秒のようで、それでも CPU 使用率は約 15 ~ 20% です。

これはこれを行うための最良の方法であり、この時点ですでにこれほど多くの CPU を消費しているという事実に耐えなければなりませんか?

4

4 に答える 4

16

これが古い投稿であることは知っていますが、私自身、小さなデモ プロジェクトを開始したときに SDL でこの問題に遭遇しました。ユーザー「thebuzzsaw」が指摘したように、最善の解決策はSDL_WaitEvent、イベント ループの CPU 使用率を減らすために使用することです。

将来、それに対する迅速な解決策を探している人のために、あなたの例でそれがどのように見えるかを次に示します。それが役に立てば幸い!

#include "SDL.h"
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main(int argc, char **argv)
{
    SDL_Init( SDL_INIT_VIDEO );
    SDL_Surface* screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, 0, 
                                            SDL_HWSURFACE | SDL_DOUBLEBUF );
    SDL_WM_SetCaption( "SDL Test", 0 ); 
    SDL_Event event;
    bool quit = false;
    while (quit == false)
    {
        if (SDL_WaitEvent(&event) != 0) {
            switch (event.type) {
            case SDL_QUIT:
            quit = true;
            break;
            }
        }
    }
    SDL_Quit();
    return 0;
}
于 2015-05-06T22:13:11.907 に答える
12

I would definitely experiment with fully blocking functions (such as SDL_WaitEvent). I have an OpenGL application in Qt, and I noticed the CPU usage hovers between 0% and 1%. It spikes to maybe 4% during "usage" (moving the camera and/or causing animations).

I am working on my own windowing toolkit. I have noticed I can achieve similar CPU usage when I use blocking event loops. This will complicate any timers you may depend on, but it is not terribly difficult to implement timers with this new approach.

于 2012-10-07T17:09:51.730 に答える
7

ゲームの CPU 使用率を 50% から 10% 未満に減らす方法を見つけました。あなたのプログラムははるかに単純で、単純に使用SDL_Delay()するだけで十分です。

私がしたことは次のとおりですSDL_DisplayFormat()。画像をロードするときに使用して、ブリッティングが高速になるようにします。これにより、CPU 使用率が約 30% まで低下しました。

そのため、ゲームの背景 (大きなワンピースの .png ファイル) をブリットすると、CPU が最も多く消費されることがわかりました。インターネットで解決策を検索しましたが、同じ答えしか見つかりませんでしたSDL_Delay()。最後に、問題が驚くほど単純であることがわかりました。それはSDL_DisplayFormat()、24 ビット イメージを 32 ビットに変換することでした。そこで、ディスプレイの BPP を 24 に設定すると、CPU 使用率は ~20% になりました。16ビットに下げると問題が解決し、CPU使用率は現在10%未満です。

もちろん、これは色の詳細が失われることを意味しますが、私のゲームはあまり詳細なグラフィックではない単純な 2D ゲームなので、これで問題ありませんでした。

于 2012-12-01T12:57:03.720 に答える
3

これを本当に理解するには、スレッドを理解する必要があります。スレッド化されたアプリケーションでは、プログラムは何かを待機するまで実行されます。次に、何かを実行できることを OS に伝えます。本質的に、SDL_Delayコマンドでこれを行っています。遅延がまったくなかった場合、プログラムはほぼ 100% の容量で実行されていると思います。

遅延ステートメントに入れる必要がある時間は、他のコマンドがかなりの時間を費やしている場合にのみ問題になります。一般に、遅延は、poll コマンドのテストにかかる時間とほぼ同じですが、たとえば 10 ミリ秒を超えないようにします。何が起こるかというと、OS は少なくともその時間だけ待機し、他のアプリケーションをバックグラウンドで実行できるようにします。

これを改善するためにできることは、まあ、できることはあまりないようです。ただし、かなりの量の CPU パワーを消費する別のプロセスが実行されている場合、プログラムのシェアが減少することに注意してください。

于 2012-10-07T15:36:16.877 に答える