ページ 11

Sleepしてない?

Posted: 2010年9月24日(金) 18:27
by dic
また、原因がよくわからないエラーが出たので相談させてください

現在メインループでSleep関数でFPS制御とCPUを使わないようにしているのですが
Sleep関数がうまく動作してないのかCPUの使用状況が非常に多く
また処理自体も非常に遅くて原因がわかりません
Sleepが失敗しているなら高速で動作するはずなのですが、高速で動作せず
Sleepが成功しているならCPUの使用状況もほとんどしようされないのですが
どちらでもなく原因がわからない状況です

メインループはいたってシンプルで
DEF_DXDRAW->Clear();
            gUI.Draw();
            DEF_CGAME->Draw();
            DEF_CGAME->Move();
            DEF_MESSAGE->Draw();
            DEF_MESSAGE->Move();
            DEF_GAMEMODULE->Draw();
            DEF_DXDRAW->Flip( hwndApp );
            Sleep( 16 );
と最後にSleep関数を呼んでFPS制御とCPU効率を図っているのです
もちろん厳密には60FPSになりませんが
上に書いたようにSleepが成功してもなく失敗してもなく
どこが問題かけんとうがつかない状態です
各処理も今までほとんど時間がかからず、一瞬で終わるのですが
なぜかここ最近期待しているスピードで処理されないです

何か推測できるエラーなどないでしょうか?

Re:Sleepしてない?

Posted: 2010年9月24日(金) 18:33
by シエル
よく分かりませんが、Sleep関数に問題があるような気はしません。

各処理に問題がある気がします。
どっちみちこれだけでは分かりませんが。

実際にSleep関数以外の各処理の合計実行時間は何ミリ秒ぐらいかかってるんですか?

Re:Sleepしてない?

Posted: 2010年9月24日(金) 19:02
by dic
>シエルさん
今から各処理の時間を計測するコードを埋め込みます

Re:Sleepしてない?

Posted: 2010年9月24日(金) 19:16
by dic
DWORD    dw[10];
    DWORD    s, e;
    memset( dw, 0, sizeof(dw) );

            s = GetTickCount();
            DEF_DXDRAW->Clear();
            e = GetTickCount();
            dw[0] += e - s;

            s = GetTickCount();
            gUI.Draw();
            e = GetTickCount();
            dw[1] += e - s;

            s = GetTickCount();
            DEF_CGAME->Draw();
            e = GetTickCount();
            dw[2] += e - s;

            s = GetTickCount();
            DEF_CGAME->Move();
            e = GetTickCount();
            dw[3] += e - s;

            s = GetTickCount();
            DEF_MESSAGE->Draw();
            e = GetTickCount();
            dw[4] += e - s;

            s = GetTickCount();
            DEF_MESSAGE->Move();
            e = GetTickCount();
            dw[5] += e - s;

            s = GetTickCount();
            DEF_GAMEMODULE->Draw();
            e = GetTickCount();
            dw[6] += e - s;

            s = GetTickCount();
            DEF_DXDRAW->Flip( hwndApp );
            e = GetTickCount();
            dw[7] += e - s;

            s = GetTickCount();
            Sleep( 16 );
            e = GetTickCount();
            dw[8] += e - s;
        }
    }
    //    メインループ終了

    FILE    *file = fopen( "time.txt", "w" );
    int    i;
    for( i=0; i<10; i++ )
    {
        char    mes[80];
        sprintf( mes, "%2d:%d\n", i, dw );
        fputs( mes, file );
    }
    fclose( file );


[time.txt]
0:0
1:0
2:0
3:0
4:2019
5:0
6:891
7:0
8:11153
9:0


と計測コードを埋め込んだところ 6番目 DEF_GAMEMODULE->Draw() が異常に時間がかかっていたことが
分かりました

HDCにアクセスするのが多いところなので、ここを改善するといつものような速度で動作するようになりました
ありがとうございました 解決にします

//=======[編集]======================
改善後のテキストを載せてました
改善前は下のようになります

[time.txt]
0:0
1:0
2:0
3:0
4:0
5:0
6:37612
7:0
8:1358
9:0
画像