日頃、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;
}