メモリを食う

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
せびっちゃ

メモリを食う

#1

投稿記事 by せびっちゃ » 8年前

以下のプログラムを実行するとなぜか大量のメモリを消費するのですが理由がわかりません。教えてください。

コード:

#include "DxLib.h"

#define migi 0  
#define hidari 1//往復時のフラグ



int PlayerX , PlayerY , Player2X , Player2Y;
double JumpPower;

int i=20,count=0;


#define Gs 0
#define Gm 1//GAME のステート判定
#define Go 2
#define Gc 3

int gamestate=Gs; //gameのステート(初期はタイトル)

int start;
int PlayerGraph,PlayerGraph2;
int Key[256];

BOOL g_akey_prev;

	
	
//関数宣言
void gamestart(),gamemain(),gameover(),gameclear();

BOOL IsAKeyTrigger(int key);
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    
	SetMainWindowText( "JUMP GAME" ) ;
	
	SetGraphMode( 800 , 600 , 16 ) ; //画面の大きさ
	
	ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
	
//自分の初期データをセット
	 Player2X = 800-32 ;
	 Player2Y = 568 ;
	 JumpPower= 0 ;
	
	// キャラクターの初期データをセット
	 PlayerX = 0 ;
	 PlayerY = 568 ;
	
	
	
	while(ProcessMessage()==0 && GetHitKeyStateAll_2(Key)==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
          //↑メッセージ処理         ↑入力状態を保存           ↑ESCが押されていない
	
		
		ClearDrawScreen();
	
	switch (gamestate) //gamestateによるゲームモードの切り替え
	{
	
	case Gs:
		gamestart();
		break;

	case Gm:
		gamemain();
		 
		break;

	case Go:    
		
		gameover();
		break;

	case Gc:
		gameclear();
		break;

		
	
	}

	ScreenFlip();
	
	}
	
	{WaitKey();WaitTimer(3000);
	DxLib_End();}
    
	return 0;
}
 /*関数定義ここから*/
////////////////////// hitkey////////////////////////////////////////////////////////////////////////////

BOOL IsAKeyTrigger(int key) {
	if(key&PAD_INPUT_10){
		if( g_akey_prev==FALSE){
			 g_akey_prev=TRUE;
			 return TRUE;
		}
	}
	else {
		 g_akey_prev=FALSE;
	}return FALSE;
}


BOOL IsAKeyTrigger2(int key) {
	if(key&PAD_INPUT_UP){
		if( g_akey_prev==FALSE){
			 g_akey_prev=TRUE;
			 return TRUE;
		}
	}
	else {
		 g_akey_prev=FALSE;
	}return FALSE;
}

///////////////////////  gameのスタートの関数定義  ///////////////////////////////////////////////////////
void gamestart()
{	
	ClearDrawScreen();//画面消す
	
	gamestate=Gs; //ゲームモード スタート
	 
	int title=LoadGraph("images/title.png");
	 DrawGraph(  0 , 130 , title, TRUE ) ;
	
	
	
	// 描画する文字列のサイズを設定
    int Cr=GetColor(255,255,255);
	SetFontSize(30) ;
	DrawString( 50 , 500 , "ゲームスタートするにはSPACEキーを押してください" , Cr ) ;
	SetFontSize( 28) ;
	DrawString(  2 , 550 , "キャラクターを操作するには↑↓→←キーを押してください" , Cr ) ;
	//int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);
		int bgm;
	bgm= LoadSoundMem( "souds/bgm.mp3" ) ;
	
	int key =GetJoypadInputState(DX_INPUT_KEY_PAD1);
		if(IsAKeyTrigger(key)==TRUE) gamestate=Gm, PlaySoundMem( bgm , DX_PLAYTYPE_LOOP ),start=GetNowCount(); ;
		
		 // 上を押していたら上に進む
		
}
///////////////////////  gameのメインの関数定義  ///////////////////////////////////////////////////////
void gamemain()//gameのメイン
{
	
	ClearDrawScreen();//画面消す
	

	PlayerGraph2 = LoadGraph( "images/teki.png" ) ;
	PlayerGraph = LoadGraph( "images/hito.png" ) ;
	
	

		// プレイヤーを描画する
		DrawGraph( Player2X , Player2Y , PlayerGraph2 , TRUE ) ;
		// プレイヤーを描画する
		DrawGraph( PlayerX , PlayerY , PlayerGraph , TRUE ) ;


 // キー入力取得
	
		if( CheckHitKey( KEY_INPUT_UP ) ) Player2Y -= 15 ;		// 上を押していたら上に進む
		if( CheckHitKey( KEY_INPUT_RIGHT )) Player2X += 5 ;	// 右を押していたら右に進む
		if( CheckHitKey( KEY_INPUT_LEFT )) Player2X -= 5 ;	// 左を押していたら左に進む
		
		
		int key =GetJoypadInputState(DX_INPUT_KEY_PAD1);
		
		int jump= LoadSoundMem( "souds/jump.mp3" ) ;
		if(IsAKeyTrigger2(key)==TRUE) gamestate=Gm,PlaySoundMem( jump, DX_PLAYTYPE_BACK ) ;

		// 落下処理
		Player2Y -= JumpPower ;

		JumpPower-=1;
		// 落下加速度を加える
		
		
		
		//あたり
 if (( ( PlayerX > Player2X && PlayerX < Player2X + 32) ||
		( Player2X > PlayerX && Player2X < PlayerX + 32) ) &&
		(Player2Y==PlayerY))
 {
	  gamestate=Go;
	  int se;
	se= LoadSoundMem( "souds/dai.mp3" ) ;
	PlaySoundMem( se , DX_PLAYTYPE_BACK ) ;


 }
		
 
		// もし地面についていたら止まる
		if( Player2Y > 568 )
		{
			Player2Y = 568 ;
			JumpPower = 0 ;
		}
		// もし左についていたら止まる
		if(Player2X<0)
		{
			Player2X=0; }
		//もし右についたら止まる
		if(Player2X>800-32)
		{
			Player2X=800-32; }

		int flag; //一度のみ宣言

  
		PlayerX+=i;
		
		if(PlayerX>800-32)
			flag=migi;
		
		if(PlayerX<0)
			flag=hidari;
		
		if(flag==migi&&PlayerX>800-32)
			i *=-1;
		
		if(flag==hidari&&PlayerX<0)
			i *=-1;
		
		if (PlayerX==0 )
			
		if(GetNowCount()-start>30000){
			gamestate=Gc;
	int cl= LoadSoundMem( "souds/clear.mp3" ) ;
	PlaySoundMem( cl , DX_PLAYTYPE_BACK ) ;
		
		
		
		
		}
return ;
   
	}


///////////////////////  gameクリアの関数定義 ///////////////////////////////////////////////////////
void gameclear(){

	ClearDrawScreen();
	int gc=LoadGraph("images/clear.png");
	DrawGraph(0,0,gc,TRUE);



}


	
	
	
	///////////////////////  gameoverの関数定義  ///////////////////////////////////////////////////////
void gameover() //game over時の表示
{
	
	ClearDrawScreen();
	int gvp=LoadGraph("images/gameover.png");
	DrawGraph(0,0,gvp,TRUE);
	
	
	
}

         /*関数定義ここまで*/



アバター
へろりくしょん
記事: 92
登録日時: 13年前
住所: 福岡

Re: メモリを食う

#2

投稿記事 by へろりくしょん » 8年前

ハンドルを閉じてないからです。

LoadGraph()関数や、LoadSoundMem()関数は、呼ばれるたびに第一引数のファイルをメモリ上へ展開します。
不要になったらDeleteGraph()、DeleteSoundMem()等の関数を使って解放します。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: メモリを食う

#3

投稿記事 by みけCAT » 8年前

そもそも毎フレームリソースをロードしてはいけません。
ループに入る前にリソースを1度だけロードし、それを使ってください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: メモリを食う

#4

投稿記事 by Dixq (管理人) » 8年前

1秒間に60回無限に画像や音声をロードし続けています。
LoadGraphやLoadSoundMemは最初に一回しか呼んではいけません。
また、ClearDrawScreenを複数個所に書いてはいけません。
こちらをお読みください。
http://dixq.net/g/h_11.html

閉鎖

“C言語何でも質問掲示板” へ戻る