トップページ > 記事閲覧
CreateDivGraphFromSoftImagは高速?
名前:abundant_ingredients 日時: 2015/01/06 12:09

日頃、DxLibには本当にお世話になってます。早速ですが、質問失礼致します。 ひょっとしたら、当方の使用している環境(オンボードグラフィックのノートPC)限定の現象かもしれないのですが、CreateDivGraphFromSoftImageで作成した画像を大量に描画する時間は、CreateGraphFromSoftImageやCreateGraphFromRectSoftImageで画像を作成した場合に比べ、遙かに短いことが計測されました。CreateDivGraphFromSoftImageで作成した画像はパレットを共有するので高速な描画が可能なのかな?などと推測するのですが、これを応用すればゲーム全体に渡って高速な描画が実現できそうです。そこで質問ですが、CreateDivGraphFromSoftImageは、CreateGraphFromSoftImageやCreateGraphFromRectSoftImageにはない、高速な描画を可能にする何か特別なカラクリがあるのでしょうか?一応、計測に使った画像とソースコード(C++の文法です)を載せておきます。 ■画像(ヤフーボックス) https://box.yahoo.co.jp/guest/viewer?sid=box-l-mjpgn5iefln36d3apk7dsexw3a-1001&uniqid=328a8eb2-5fcc-4cd6-aec5-b8146a75050c&viewtype=detail ■ソースコード #include "DxLib.h" static const int WINW = 640, WINH = 480; // ウィンドウのサイズ static const int NUM = 6; // 画像の分割数 static const int GSZ = 32; // 分割した画像のサイズ(縦横共通) // CreateGraphFromRectSoftImageを用いて画像を読込む関数 void LoadRect(int gh[]) { int si = LoadSoftImage("block.png"); for(int i = 0; i < NUM; ++i) gh[i] = CreateGraphFromRectSoftImage(si, GSZ * i, 0, GSZ, GSZ); DeleteSoftImage(si); } // CreateDivGraphFromSoftImageを用いて画像を読込む関数 void LoadDiv(int gh[]) { int si = LoadSoftImage("block.png"); CreateDivGraphFromSoftImage(si, NUM, NUM, 1, GSZ, GSZ, gh); DeleteSoftImage(si); } // 画面いっぱいに画像を並べて描画する関数 描画にかかった時間を返す int Draw(int gh[]) { int bfr = GetNowCount(); for(int y = 0, h = WINH / GSZ; y < h; ++y) for(int x = 0, w = WINW / GSZ; x < w; ++x) DrawGraph(GSZ * x, GSZ * y, gh[x % NUM], FALSE); return GetNowCount() - bfr; } // WinMain int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); if(DxLib_Init() == -1) return -1; SetDrawScreen(DX_SCREEN_BACK); int ghRect[NUM]; // CreateGraphFromRectSoftImageで作成した画像ハンドルを入れる int ghDiv[NUM]; // CreateDivGraphFromSoftImageで作成した画像ハンドルを入れる LoadRect(ghRect); LoadDiv(ghDiv); while(ProcessMessage() != -1) { clsDx(); printfDx("CreateGraphFromRectSoftImageで作成した画像:%dミリ秒\n", Draw(ghRect)); // 当方の環境では5~8ミリ秒 printfDx("CreateDivGraphFromSoftImageで作成した画像:%dミリ秒\n", Draw(ghDiv)); // 当方の環境では0~1ミリ秒 ScreenFlip(); } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: CreateDivGraphFromSoftImagは高速? ( No.1 )
名前:abundant_ingredients 日時:2015/01/06 12:23

改行をミスってしまいました。すいません。改行をミスってしまった部分を改めて投稿します。 > ひょっとしたら、当方の使用している環境(オンボードグラフィックのノートPC)限定の現象かもしれないのですが、 > CreateDivGraphFromSoftImageで作成した画像を大量に描画する時間は、CreateGraphFromSoftImageやCreateGraphFromRectSoftImage > で画像を作成した場合に比べ、遙かに短いことが計測されました。CreateDivGraphFromSoftImageで作成した画像はパレットを > 共有するので高速な描画が可能なのかな?などと推測するのですが、これを応用すればゲーム全体に渡って高速な描画が実現できそうです。 > そこで質問ですが、CreateDivGraphFromSoftImageは、CreateGraphFromSoftImageやCreateGraphFromRectSoftImageにはない、 > 高速な描画を可能にする何か特別なカラクリがあるのでしょうか?一応、計測に使った画像とソースコード(C++の文法です)を載せておきます。
メンテ
Re: CreateDivGraphFromSoftImagは高速? ( No.2 )
名前:管理人 日時:2015/01/07 00:04

LoadDivGraph や CreateDivGraphFromSoftImage などの分割読み込みしたグラフィックハンドル群を 連続して描画する場合に、高速な描画を行うことができます ただ、高速描画には条件もあります 過去ログから消えてしまった古い書き込みに解説文がありましたので、よろしければ読んでみて下さい m(_ _)m ================================================================== 2795 2010/10/31(Sun) 18:04 管理人 ご返信 > Agateさん DXライブラリは2D画像の描画に Direct3D のポリゴン描画機能を使用しています このポリゴン描画機能は一度に数千のポリゴンを描画することができ、同じ数のポリゴンを 描画する場合は個別に描画するよりも一度に描画した方が高速になります なのでDXライブラリもなるべく一度に沢山のポリゴンを描画するようにしているのですが、 一度に複数のポリゴンを描画する機能でポリゴン毎に個別で指定できるのは「ポリゴンの座標と色( α値含む )」だけなので ・描画する画像が変わる場合 ・描画ブレンドモードや描画モードが変わる場合 ・その他 SetDrawArea 等描画の設定が変化する場合 は、そこで一旦「一度に描画する処理」は区切られます なので、同じ画像を描画ブレンドモードなどを変更せずに連続して描画すると高速に描画することができます また、LoadDivGraph で分割された画像はグラフィックハンドルこそ違いますがこれも内部では「同じ画像」として 処理されていますので、仮に描画に使用するグラフィックハンドルが異なっても同じ LoadDivGraph で作成された グラフィックハンドルの場合は同様に高速に描画することが出来ます ( あと、DerivationGraph で派生されたグラフィックハンドルと派生もとのグラフィックハンドルも「同じ画像」として 処理されています ) SetDrawBlendMode を呼ばないようにしたら処理落ちが緩和された原因の一つはこれだと思います ==================================================================
メンテ
Re: CreateDivGraphFromSoftImagは高速? ( No.3 )
名前:abundant_igr(解決) 日時:2015/01/07 09:38

お忙しい中、ご返信ありがとうございました。管理人様のご丁寧な対応に感謝申し上げます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存