ページ 11

重い?

Posted: 2010年10月02日(土) 17:39
by みけCAT
開発環境としてBCC55と「C言語を始めよう! Ver1.1.2.2」を使ってみました。
DXライブラリを使っています。
ゲームプログラミングの館の13b章、14章などを組み合わせて適当なプログラムを書いてみました。
カーソルキーを押すと画像が動くプログラムです。
自前のfps表示もくっつけてあります。
これを実行すると、fpsが大体30~40くらいと表示されます。
fpsは60くらいだと思っていたのですが、みんなこんなものなのでしょうか?
それとも、自分の環境が重いだけでしょうか?
もしよろしければテストをお願いします。

プログラムコード
#include "DxLib.h"

char Key[256];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode( TRUE ) ;               // ウィンドウモードに変更
    if( DxLib_Init() == -1 ) return -1 ;     // DXライブラリ初期化処理

    int image;                       //ハンドルを受け取るためのint型変数を宣言
    image  = LoadGraph( "char.png" ) ;       //back.bmpのハンドルを代入
    int x=0,y=0;
    
    int White;
    White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得

    //fps取得用
    char fpstext[1024]="0.00fps";
    unsigned long fpskizyuntick,fpsmaetime,fpsnowtime;
    int fpscount;    
    fpscount=0;
    fpskizyuntick=GetTickCount();
    fpsmaetime=fpsnowtime=0;

    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
        //↑メッセージ処理         ↑画面をクリア          ↑キーボード入力状態取得       ↑ESCが押されていない

        //ココに処理を書いていく
        if(Key[KEY_INPUT_LEFT])x-=3;
        if(Key[KEY_INPUT_RIGHT])x+=3;
        if(Key[KEY_INPUT_UP])y-=3;
        if(Key[KEY_INPUT_DOWN])y+=3;
        DrawGraph( x , y , image  , FALSE ) ;    //char.pngを表示

        //fpsの計測
        fpsnowtime=GetTickCount()-fpskizyuntick;
        if(fpsnowtime>=1000) {
            wsprintf(fpstext,"%d.%02dfps",
                fpscount+((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))/100,
                ((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))%100);
            fpskizyuntick=GetTickCount();
            fpsmaetime=0;
            fpscount=0;
        } else {
            fpscount++;
            fpsmaetime=fpsnowtime;
        }
        DrawString( 10,10,fpstext,White);
        ScreenFlip();//裏画面を表画面に反映
    }

    DxLib_End() ;                            //DXライブラリの終了処理
    return 0 ;
}
追記
モニタのリフレッシュレートは60ヘルツです。 画像

Re:重い?

Posted: 2010年10月02日(土) 18:40
by うしお
私の環境でテストしてみました
fpsは大体56~59の間で安定しております

Operating System: Windows 7 Home Premium 32-bit (6.1, Build 7600) (7600.win7_gdr.100618-1621)
System Model: P5Q
BIOS: BIOS Date: 02/25/10 16:02:28 Ver: 08.00.14
Processor: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz (2 CPUs), ~3.0GHz
Memory: 2048MB RAM
DirectX Version: DirectX 11
DxDiag Version: 6.01.7600.16385 32bit Unicode

グラフィックカード NVIDIA GeForce GTX 460

VisualStudio2010Express
です

Re:重い?

Posted: 2010年10月02日(土) 20:46
by シエル
45FPSぐらいしか出ませんでした。

ほかの方の作品では余裕で60FPSぐらい出てるので、
FPSの計算がおかしいか、ほかの部分のコードがおかしいのかどっちかでしょう。

時間があれば検証しますが、そんな時間ないのでコードの検証はしてません。

Re:重い?

Posted: 2010年10月02日(土) 21:12
by みけCAT
fpsの計算をゲームプログラミングの館s6章のものにしてみました。
41~43fpsくらいです。
#include "DxLib.h"

int count=0;
char Key[256];

void fps(){
    int i;
    static int t=0,ave=0,f[60];
 
    f[count%60]=GetNowCount()-t;
    t=GetNowCount();
    if(count%60==59){
        ave=0;
        for(i=0;i<60;i++)
            ave+=f;
        ave/=60;
    }
    if(ave!=0){
        DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);
        DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);
    }
    return;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode( TRUE ) ;               // ウィンドウモードに変更
    if( DxLib_Init() == -1 ) return -1 ;     // DXライブラリ初期化処理

    int image;                       //ハンドルを受け取るためのint型変数を宣言
    image  = LoadGraph( "char.png" ) ;       //back.bmpのハンドルを代入
    int x=0,y=0;
    
    int White;
    White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得

    //fps取得用
    /*char fpstext[1024]="0.00fps";
    unsigned long fpskizyuntick,fpsmaetime,fpsnowtime;
    int fpscount;    
    fpscount=0;
    fpskizyuntick=GetTickCount();
    fpsmaetime=fpsnowtime=0;*/

    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
        //↑メッセージ処理         ↑画面をクリア          ↑キーボード入力状態取得       ↑ESCが押されていない

        //ココに処理を書いていく
        if(Key[KEY_INPUT_LEFT])x-=3;
        if(Key[KEY_INPUT_RIGHT])x+=3;
        if(Key[KEY_INPUT_UP])y-=3;
        if(Key[KEY_INPUT_DOWN])y+=3;
        DrawGraph( x , y , image  , FALSE ) ;    //char.pngを表示

        //fpsの計測
        /*fpsnowtime=GetTickCount()-fpskizyuntick;
        if(fpsnowtime>=1000) {
            wsprintf(fpstext,"%d.%02dfps",
                fpscount+((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))/100,
                ((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))%100);
            fpskizyuntick=GetTickCount();
            fpsmaetime=0;
            fpscount=0;
        } else {
            fpscount++;
            fpsmaetime=fpsnowtime;
        }
        DrawString( 10,10,fpstext,White);*/
        fps();
        count++;

        ScreenFlip();//裏画面を表画面に反映
    }

    DxLib_End() ;                            //DXライブラリの終了処理
    return 0 ;
}

Re:重い?

Posted: 2010年10月03日(日) 09:37
by へろりくしょん
No:62556 No:62577 のコード共にFPS 43-45 ぐらいですね。

DXライブラリでは初期化時の状態では表画面に描画するようになっているようです。
この時にScreenFli() 関数がどのような挙動を行うかはちょっと分かりませんが、どうにもこのあたりに原因があるようです。

とりあえず、SetDrawScreen(DX_SCREEN_BACK); を呼び出す事で FPS 60 を出すことが出来ました。


ところで、No:62556 のコードですが。
FPSの計算式がちょっと複雑なようですが、1フレーム毎に fpscount++; で、1秒ごとに
if(fpsnowtime>=1000) に突入するわけですから、その時点で fpscount の値がそのまま FPS ではありませか?

FPS というのは1秒間に何回フレームを描画したか、ですよね。

Re:重い?

Posted: 2010年10月03日(日) 12:45
by みけCAT
60fps程度出ることを確認しました。
ソース
#include "DxLib.h"

char Key[256];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode( TRUE ) ;               // ウィンドウモードに変更
    if( DxLib_Init() == -1 ) return -1 ;     // DXライブラリ初期化処理

    SetDrawScreen(DX_SCREEN_BACK);        //裏画面に設定

    int image;                       //ハンドルを受け取るためのint型変数を宣言
    image  = LoadGraph( "char.png" ) ;       //back.bmpのハンドルを代入
    int x=0,y=0;
    
    int White;
    White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得

    //fps取得用
    char fpstext[1024]="0.00fps";
    unsigned long fpskizyuntick,fpsmaetime,fpsnowtime;
    int fpscount;    
    fpscount=0;
    fpskizyuntick=GetTickCount();
    fpsmaetime=fpsnowtime=0;

    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
        //↑メッセージ処理         ↑画面をクリア          ↑キーボード入力状態取得       ↑ESCが押されていない

        //ココに処理を書いていく
        if(Key[KEY_INPUT_LEFT])x-=3;
        if(Key[KEY_INPUT_RIGHT])x+=3;
        if(Key[KEY_INPUT_UP])y-=3;
        if(Key[KEY_INPUT_DOWN])y+=3;
        DrawGraph( x , y , image  , FALSE ) ;    //char.pngを表示

        //fpsの計測
        fpsnowtime=GetTickCount()-fpskizyuntick;
        if(fpsnowtime>=1000) {
            wsprintf(fpstext,"%d.%02dfps",
                fpscount+((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))/100,
                ((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))%100);
            fpskizyuntick=GetTickCount();
            fpsmaetime=0;
            fpscount=0;
        } else {
            fpscount++;
            fpsmaetime=fpsnowtime;
        }
        DrawString( 10,10,fpstext,White);
        ScreenFlip();//裏画面を表画面に反映
    }

    DxLib_End() ;                            //DXライブラリの終了処理
    return 0 ;
}
>ところで、No:62556 のコードですが。
>FPSの計算式がちょっと複雑なようですが、1フレーム毎に fpscount++; で、1秒ごとに
>if(fpsnowtime>=1000) に突入するわけですから、その時点で fpscount の値がそのまま FPS ではありませか?

>FPS というのは1秒間に何回フレームを描画したか、ですよね。
東方のような感じで小数点以下も出したかったので、このようなコードにしてみました。