移動速度が遅い?

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

移動速度が遅い?

#1

投稿記事 by きずなん » 14年前

現在2DRPG作成中です。
ようやくマップを読み込ませて、その上にキャラを表示させて、キーに応じて移動できるようにプログラムを組めましたが、どうも移動がもっさりしてるように感じます。
どうにかしてもっとスッと移動できないのでしょうか?
スーパーファミコンのRPGでもこんなにモッサリしたのは見たことが無いです。
描画プログラムの組み方に問題ありでしょうか。


僕のPCのスペックに問題が可能性もあるので書いておきます。
XP ver2002 ServicePack3
Mobile AMD Duron(tm) Proccessor 896MB , 512MB RAM

コード:

#include "DxLib.h"


#define MAP_SIZE	32			// マップチップ一つのドットサイズ

#define MAP_WIDTH	20			// マップの幅
#define MAP_HEIGHT	15			// マップの縦長さ

// マップのデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
	{ 19, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38} ,
	{ 36, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0 } ,
	{ 36, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 12, 0, 21, 21, 21, 0 } ,
	{ 36, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 30, 0, 21, 21, 21, 0 } ,
	{ 36, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 12, 0, 21, 21, 21, 0 } ,
	{ 36, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0 } ,
	{ 36, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0 } ,
	{ 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 21, 0, 0, 12, 0, 0, 0, 0, 0 } ,
	{ 36, 0, 0, 0, 0, 0, 0, 13, 14, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0 } ,
	{ 36, 1, 0, 0, 0, 0, 0, 33, 34, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0 } ,
	{ 36, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 30, 0, 0, 0, 0, 0 } ,
	{ 36, 1, 0, 1, 9, 9, 0, 0, 1, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 1 } ,
	{ 36, 1, 1, 1, 9, 9, 9, 9, 1, 0, 1, 2, 0, 0, 12, 0, 0, 0, 0, 1 } ,
	{ 36, 1, 0, 1, 9, 9, 9, 9, 1, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 1 } ,
	{ 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19} 
} ; 


typedef struct{
        int x,y,img,muki,walking_flag;
}ch_t;
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
        int image[16];
        char Key[256];
        ch_t ch;
		int i , j , k ;
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
	int map[300];//300個の画像を格納する配列
        LoadDivGraph( "画像/img15_3.png" , 300 , 20 , 15 , 32 , 32 , map ) ;//画像を300個に分割してmap配列に保存

        ch.x    =320;
        ch.y    =224;
        ch.walking_flag=0;
        ch.muki=2;
 
        SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定
        LoadDivGraph( "画像/char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

	for( i = 0 ; i < MAP_HEIGHT ; i ++ )
	{
		for( j = 0 ; j < MAP_WIDTH ; j ++ )
		{
			for( k = 0 ; k < 300 ; k ++ )
			{
				if( MapData[ i ][ j ] == k )
				{
				DrawGraph( j*32 , i*32 , map[k] , TRUE );
				}
			}
		}
	}
 
        if(ch.x%32==0 && ch.y%32==0){         //座標が32で割り切れたら入力可能
            ch.walking_flag=1;         //歩くフラグを立てる。
            if     ( Key[ KEY_INPUT_UP   ]  == 1 )  //上ボタンが押されたら
                    ch.muki=0;         //上向きフラグを立てる
            else if( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
            else if( Key[ KEY_INPUT_DOWN ]  == 1 )  //下ボタンが押されたら
                    ch.muki=2;         //下向きフラグを立てる
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
                    ch.muki=3;         //右向きフラグを立てる
            else                                    //何のボタンも押されてなかったら
                    ch.walking_flag=0; //歩かないフラグを立てる
        }
 
        if(ch.walking_flag==1){        //歩くフラグが立っていたら
            if     (ch.muki==0)        //上向きならch.y座標を減らす
                    ch.y--;
            else if(ch.muki==1)        //左向きならch.x座標を減らす
                    ch.x--;
            else if(ch.muki==2)        //下向きならch.y座標を増やす
                    ch.y++;
            else if(ch.muki==3)        //右向きならch.x座標を増やす
                    ch.x++;
        }
 
        ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];            //画像をセット
 
        DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
 
        ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 移動速度が遅い?

#2

投稿記事 by beatle » 14年前

マップチップ1個のサイズは32x32ですね.
もっさりとは,具体的にどのくらいのスピードなのでしょうか.ざっと見ると,マップチップ1個分(1マス分)移動するのに0.5秒ほどだったらプログラム通りだと思います.1マス分の移動に1秒くらいかかるなら,FPSが低下していると思います.

きずなん

Re: 移動速度が遅い?

#3

投稿記事 by きずなん » 14年前

1マス移動に大体一秒かかります。

FPS低下はメモリが足りてないのでしょうか?
他のプログラムを全部消しても1秒かかります。
デバッグでプレイするだけでCPU使用率が90%を超えるのですが、そのせいでしょうか?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 移動速度が遅い?

#4

投稿記事 by beatle » 14年前

CPU使用率90%超えですか.かなり高負荷ですね.恐らくそのせいです.
PCのスペックが低くて,きっとグラフィックボードも積まれていないのでしょうね.
DXライブラリはDirectXを使っていますから,DirectX対応のグラフィックボードを積んだPCでやるのが良いです.

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 移動速度が遅い?

#5

投稿記事 by beatle » 14年前

もしかしたらプログラムの組み方を変えたら軽くなるかもしれませんね.
3段のforループが凶悪なのだと思います.一番内側のforループは削れる気がします.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 移動速度が遅い?

#6

投稿記事 by softya(ソフト屋) » 14年前

コード:

            for( k = 0 ; k < 300 ; k ++ )
            {
                if( MapData[ i ][ j ] == k )
                {
                DrawGraph( j*32 , i*32 , map[k] , TRUE );
                }
            }
これは

コード:

            int map_chip = MapData[ i ][ j ];
            DrawGraph( j*32 , i*32 , map[map_chip] , TRUE );
で置き換え可能です。
ループ回数は20x15x300から20x15に減らすことができますね。
なにか遅すぎるので、これだけで解決するかは分かりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 移動速度が遅い?

#7

投稿記事 by h2so5 » 14年前

ハードウェアアクセラレーションが有効かどうかは GetUse3DFlag 関数で分かるので、
調べてみるといいかもしれません。

きずなん

Re: 移動速度が遅い?

#8

投稿記事 by きずなん » 14年前

皆様返信ありがとうございます。

>グラフィックボード
ノートパソコンなんで積まれていないと思います。
そのせいでもあったんですね。

>ソフト屋さん
300回ループを消すことによりCPU使用率が70~90になりました。(まだ高いですよね・・・)
今思えばわざわざmapchipに番号振って格納したのになんでそれを使わなかったか・・・
自分の技能の低さに呆れます。

>h2so5さん
int test = GetUse3DFlag() ;
printfDx( " 戻り値は %d です。\n" , test ) ;
とでもして見てみますと戻り値は1だったので3Dアクセラレータを使用しているみたいです。


総じて、色々開発には不向きな環境ということが分かりました。
グラフィックボードが無いというのは、2DRPGを作るうえで致命的でしょうか?
また、グラフィックボードは買ってきて着けることができますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 移動速度が遅い?

#9

投稿記事 by softya(ソフト屋) » 14年前

きずなん さんが書きました:総じて、色々開発には不向きな環境ということが分かりました。
グラフィックボードが無いというのは、2DRPGを作るうえで致命的でしょうか?
また、グラフィックボードは買ってきて着けることができますか?
残念ですがグラフィックボードは無理ですね。出来るとしたらメイン・メモリを増やすことぐらいです。
2DRPGなら作り方次第で耐えれる気はするんですが、それにしてもCPU使用率が高いですね。配布する時はリリースビルドとフルスクリーンにすることで速度はかなり改善することは可能ですがデバッグ時のほうがメモリやCPUパワーを必要とするんですよね。そういう意味で不便です。

開発環境はVisualC++2010でしょうか?
512MB RAMだとVisualC++2008でも厳しいと思うので10年以上前のスペックで動くBorlandC++5.5とかに変えれば環境とかはかなり改善する気がします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きずなん

Re: 移動速度が遅い?

#10

投稿記事 by きずなん » 14年前

環境はVisualC+2008です。
ちょいとBorlandに乗り換える気が起きないのでメモリの増設を考えてみようと思います。
メモリは具体的にどれぐらいのものを買ったらいいんでしょうか。

それと、デバッグでのメモリの消費を抑える設定とかってあるんでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 移動速度が遅い?

#11

投稿記事 by softya(ソフト屋) » 14年前

まず消費しているメモリ量を把握しないと始まりません。
デバッグ中の重い状態でPF使用量を調べてみてください。

「必要メモリ・サイズを見極める - @IT」
http://www.atmarkit.co.jp/fwin2k/win2kt ... usage.html

あとノートパソコンがメモリを交換できない可能性もありますし、パソコンが古いとメモリが入手出来なかったり中古しか無かったり高騰していたりする可能性もあります。メーカー品番とか細かい情報を教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きずなん

Re: 移動速度が遅い?

#12

投稿記事 by きずなん » 14年前

詳しい解答ありがとうございます。
合計が523MBに対しデバッグ中のPF使用量が390MBでした。
メモリ的には余裕があるみたい?です。

メーカーはNECで, 型番はLaviel LL500-2Dです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 移動速度が遅い?

#13

投稿記事 by h2so5 » 14年前

その型だとメモリは512MBが最大みたいなので増設は無理ですね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 移動速度が遅い?

#14

投稿記事 by softya(ソフト屋) » 14年前

きずなん さんが書きました:詳しい解答ありがとうございます。
合計が523MBに対しデバッグ中のPF使用量が390MBでした。
メモリ的には余裕があるみたい?です。
メーカーはNECで, 型番はLaviel LL500-2Dです。
なんとかってレベルですね。
増設もできないみたいですので、日頃はリリースビルドで実行して必要なときだけデバッグビルドにするのも良いかも知れません。
フルスクリーンにしなくても大分軽くなるはずですが、コンパイル・リンクは長くなる可能性があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きずなん

Re: 移動速度が遅い?

#15

投稿記事 by きずなん » 14年前

メモリ増設はあきらめます。
友達にも同じことを言われました。言われたとおりリリースビルドでのみにしたいと思います。

親切にありがとうございました。

きずなん

Re: 移動速度が遅い?

#16

投稿記事 by きずなん » 14年前

すいません、解決でした。

閉鎖

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