RPGのマップの表示の速度について

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

RPGのマップの表示の速度について

#1

投稿記事 by doss » 12年前

Dxライブラリによる画像表示でRPGのマップのようなものの倍率を高め表示したいと思いいたったのですが、いかんせんこの書き方では処理がとても重いので、何とか軽量化できないでしょうか

コード:

#include <DxLib.h>
void GetColorPixel(int,int,int,int);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	DxLib::ChangeWindowMode(true);
	DxLib::DxLib_Init();
	int x = 0;	int y = 0;
	GetColorPixel(DxLib::LoadGraph("products_rpgvx_lecture_sample01.jpg"),x,y,4);
	DxLib::WaitKey();
	DxLib::DxLib_End();
}
void GetColorPixel(int graph, int x, int y, int n){
	DxLib::ClearDrawScreen();
	int sizex, sizey;
	DxLib::GetGraphSize(graph,&sizex,&sizey);
	DxLib::DrawGraph(0,0,graph,true);
	int **color = new int*[sizex];
	for(int i=0; i<sizex; i++)
		color[i] = new int[sizey];
	for(int i=0; i<sizex; i++)
		for(int j=0; j<sizey; j++)
			color[i][j] = DxLib::GetPixel( i , j );
	DxLib::ClearDrawScreen();
	for(int i=0; i<sizex; i++)
		for(int j=0; j<sizey; j++)
        DxLib::DrawBox(i*n+x,j*n+y,i*n+n+x,j*n+n+y,color[int(i)][int(j)],true);
	for(int i=0; i<sizex; i++)
		delete[] color[i];
	delete[] color;
}

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

Re: RPGのマップの表示の速度について

#2

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

GetPixel関数について、
DXライブラリ置き場 リファレンスページ さんが書きました:この関数はとても処理に時間がかかるので多用は禁物です。
(http://homepage2.nifty.com/natupaji/DxL ... .html#R2N6)
と書かれています。
ソフトウェアイメージなど、別の方法を検討するべきだと思います。

また、取得した色をDrawBoxで描画するだけなら、素直にDrawExtendGraph関数を使えばいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

doss

Re: RPGのマップの表示の速度について

#3

投稿記事 by doss » 12年前

みけCATさん、本当にありがとうございました!これまでの悩みが嘘のように格段に速度が上がりました!

コード:

#include <DxLib.h>

void GetColorPixel(int,int,int,int);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	DxLib::ChangeWindowMode(true);
	DxLib::DxLib_Init();

	int x = 0;	int y = 0;

	GetColorPixel(DxLib::LoadSoftImage("products_rpgvx_lecture_sample01.jpg"),x,y,4);

	DxLib::WaitKey();
	DxLib::DxLib_End();
}

void GetColorPixel(int graph, int x, int y, int n){
	DxLib::ClearDrawScreen();
	int sizex, sizey;

	DxLib::GetSoftImageSize(graph,&sizex,&sizey);
	int **color = new int*[sizex];
	for(int i=0; i<sizex; i++)
		color[i] = new int[sizey];

	for(int i=0; i<sizex; i++)
		for(int j=0; j<sizey; j++){
			int *tmpcolor = new int[4];
			DxLib::GetPixelSoftImage(graph , i , j , &tmpcolor[0] , &tmpcolor[1] , &tmpcolor[2] , &tmpcolor[3]);
			color[i][j] = DxLib::GetColor( tmpcolor[0] , tmpcolor[1] , tmpcolor[2] );
			delete[] tmpcolor;
		}

	DxLib::ClearDrawScreen();
	for(int i=0; i<sizex; i++)
		for(int j=0; j<sizey; j++)
			DxLib::DrawBox(i*n+x,j*n+y,i*n+n+x,j*n+n+y,color[int(i)][int(j)],true);

	for(int i=0; i<sizex; i++)
		delete[] color[i];
	delete[] color;
}

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

Re: RPGのマップの表示の速度について

#4

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

DrawExtendGraph関数をではダメなのですか? 
GetPixelSoftImageも遅いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: RPGのマップの表示の速度について

#5

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

ループ中で毎回tmpcolorを確保するのは無駄だと思います。
要素数が4で固定なら、普通に固定長の配列でいいのではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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