ページ 11

DXライブラリ FPS不足

Posted: 2012年4月20日(金) 14:49
by tabasn
DXライブラリを使ってSTGのゲームプログラミングをしているのですが
実行してみると
なぜかFPSが30付近しかないです・・・
ファイルはループの外でメモリに読み込むようにしてるし

今作ってるのはタイトル画面で処理も単純で少ないのでプログラミングの良し悪しとかではないと思うのですが・・・


おかしいと思って入門サイトの簡単なプログラムでFPSを図ってみたらそれでも30しかありませんでした

リフレッシュレートはちゃんと60に設定しています
龍神録というデームをダウンロードしてやってみたのですがそちらはFPSが60ありました

知恵袋やサイトをめぐってもFPSを制御するやり方しか載ってません
これだけ事例が少ないってことはプログラミング手法でなくもっと根本的な問題なんでしょうか?

開発環境はVisualC++で、新・ゲームプログラミングの館というサイトをみて設定やDXライブラリのことを学びました
プログラムに使用している言語はC言語です

どういった問題が考えられるでしょうか?
何でもいいんで知恵を分けてください。お願いします。

Re: DXライブラリ FPS不足

Posted: 2012年4月20日(金) 15:07
by nullptr
FPSが出ないプログラムコードを提示していただければ何かアドバイスが出来るかと思います。

Re: DXライブラリ FPS不足

Posted: 2012年4月20日(金) 16:31
by tabasan
返信ありがとうございます
コードは


[main.cpp]
#include "DxLib.h"
#include "Mode.h"
#include "Init.h"

int count=0;

void wait_fanc(){
  int term;
  static int t=0;
  term = GetNowCount()-t;
  if(16-term>0)
   Sleep(16-term);
  t=GetNowCount();
  return;
}

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,LPSTR,int){

//初期化
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
Init_Game();
SetOutApplicationLogValidFlag(FALSE);

while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

//総合処理
Mode_PlayMgr();

//FPS
fps();
count++;
ScreenFlip();
wait_fanc();
}

DxLib_End();
return 0;
}



[KeyBoard.cpp]
#include "DxLib.h"

static int m_Key[256]; // キーの入力状態格納用変数

// キーの入力状態更新
void Keyboard_Update(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey != 0 ){ // i番のキーコードに対応するキーが押されていたら
m_Key++; // 加算
} else { // 押されていなければ
m_Key = 0; // 0にする
}
}
}

// KeyCodeのキーの入力状態を取得する
int Keyboard_Get( int KeyCode ){
return m_Key[ KeyCode ]; // KeyCodeの入力状態を返す
}



[Init.cpp]
#include "DxLib.h"
#include "Handle.h"
#include "Mode.h"

void Init_Game() {
Set_Handle_Title();
Set_Mode( TITLE_MODE );
}




[mode.cpp]
#include "DxLib.h"
#include "Play.h"
#include "Mode.h" ←の中で#define TITLE_MODE 1 //タイトル #define STAGESELECT_MODE 2 //ステージセレクト #define ADVENTURE_MODE 3 //会話
                  #define ACTION_MODE 4 //ステージ画面 #define EPISODE_MODE 5 //あらすじ     と定義してます
static int mode;

//ゲームモードを「i」のモードに
void Set_Mode(int i) {
mode = i;
}

int Get_Mode() {
return mode;
}

void Mode_PlayMgr() {
if( mode == TITLE_MODE )
Play_TITLE();
else if( mode == STAGESELECT_MODE )
Play_STAGESELECT();
else if( mode == ADVENTURE_MODE )
Play_ADVENTURE();
else if( mode == ACTION_MODE )
Play_ACTION();
else if( mode == EPISODE_MODE )
Play_EPISODE();
}



[Handle.cpp]
#include "DxLib.h"

static int BGM_Handle; //BGM
static int Back_Handle; //背景画像
static int Chara_Handle; //キャラ画像

void Set_Handle_Title(){
BGM_Handle = LoadSoundMem( "サウンド/BGM.mp3" );
Back_Handle = LoadGraph( "画像/OP.jpeg" );
Chara_Handle = LoadGraph( "画像/CHARA.png" );
}

int Get_BGM_Handle(){
return BGM_Handle;
}

int Get_Back_Handle(){
return Back_Handle;
}

int Get_Chara_Handle(){
return Chara_Handle;
}

void Delete_Handle() {
DeleteSoundMem( BGM_Handle );
DeleteGraph( Back_Handle );
DeleteGraph( Chara_Handle );
}



[Play.cpp]
#include "Keyboard.h"
#include "DxLib.h"
#include "Mode.h"
#include "Handle.h"

//タイトルメニューの座標
typedef struct{
int x, y; // 座標格納用変数
char name[128]; // 項目名格納用変数
} MenuElement_t ;

//タイトルメニュー
MenuElement_t MenuElement[5]={
{ 80, 200, "ゲームスタート" },
{ 100, 250, "ロード" },
{ 100, 300, "ヘルプ" },
{ 100, 350, "コンフィグ" },
{ 100, 400, "ゲーム終了" },
};
static int SelectNum = 0; // 現在のメニュー選択番号

//タイトル画面
void Play_TITLE() {
//計算フェーズ
Keyboard_Update();
if( Keyboard_Get( KEY_INPUT_DOWN ) == 1 ){ // 下キーが押された瞬間だけ処理
SelectNum = ( SelectNum + 1 ) % 5; // 現在の選択項目を一つ下にずらす(ループする)
}
if( Keyboard_Get( KEY_INPUT_UP ) == 1 ){ // 上キーが押された瞬間だけ処
SelectNum = ( SelectNum + 4 ) % 5; // 現在の選択項目を一つ上にずらす(逆ループする)
}
if( Keyboard_Get( KEY_INPUT_DOWN ) == 1 || Keyboard_Get( KEY_INPUT_UP ) == 1 ){ // 下キーか、上キーが押された瞬間
for( int i=0; i<5; i++ ){ // メニュー項目数である5個ループ処理
if( i == SelectNum ){ // 今処理しているのが、選択番号と同じ要素なら
MenuElement.x = 80; // 座標を80にする
} else { // 今処理しているのが、選択番号以外なら
MenuElement.x = 100;// 座標を100にする
}
}
}

// 描画フェーズ
DrawExtendGraph( 0 , 0 , 640 , 480 , Get_Back_Handle() , TRUE );
DrawExtendGraph( 390 , 155 , 640 , 480 , Get_Chara_Handle() , TRUE );
for( int i=0; i<5; i++ ){ // メニュー項目を描画
DrawFormatString( MenuElement.x, MenuElement.y, GetColor(0,0,0), MenuElement.name );
}

int BGM_Handle = Get_BGM_Handle();
if( CheckSoundMem(BGM_Handle) == 0 ) {
PlaySoundMem( BGM_Handle , DX_PLAYTYPE_BACK );//バックグラウンド再生
}
}

//ステージセレクト画面
void Play_STAGESELECT() {
}

//会話(アドベンチャー)画面
void Play_ADVENTURE() {
}

//ステージ画面
void Play_ACTION() {
}

//あらすじ、ストーリー画面
void Play_EPISODE() {
}


基本的にHファイルには同名のCPPファイルの関数プロトタイプ宣言しか書いてありません。
入門サイトにあったスタートメニュー画面を選択するプログラムをベースに背景とBGNをつけただけのプログラムです。
まだスタート画面に関する処理しか書いていません。
大規模プログラミング初めてなので汚いコードになってしまいましたが、
ここの処理がFPSを決定的に下げている!って感じのところがあったら指摘おねがいします

Re: DXライブラリ FPS不足

Posted: 2012年4月20日(金) 16:39
by h2so5
ScreenFlip();が2箇所にありますよ。

Re: DXライブラリ FPS不足

Posted: 2012年4月20日(金) 16:50
by tabasan
あ・・・

すいませんでした。コピーして張り付けるようなことばっかりしてるからこうなるんですよね・・・
こんなんで何時間も悩んでいた自分がはずかしいです(笑)反省しときます。

何はともあれFPSはちゃんと60になりました^^

今後も質問かも知れないんで見かけたら覗いてやってくださいお願いします
ありがとうございました!