お世話になっています。
DrawStringToHandleで文字を描画するときに、使うフォントによって描画時間が大幅に異なります。
後述するIPA明朝はエッジありアンチエイリアスありでも高速に描画されますが、他のフォントはかなり遅くなります。
フォントによって遅くなる原因について教えて頂けないでしょうか。
また遅いフォントを早く描画するテクニックがあれば教えて頂けないでしょうか。
後述のコードでそれぞれのフォント、フォントタイプ設定での描画時間を計測した結果が以下になります。
NotoSansJPと源様明朝はEDGEやANTIALIASINGの設定をすると遅くなる傾向にありますが、IPA明朝のみ設定に関わらず高速です。
IPA明朝が遅くならない理由が知りたいです。理由がわかれば、遅くならないフォントを探す手掛かりにしたいです。
○検証結果(数値はミリ秒)
NotoSansJP DX_FONTTYPE_NORMAL: 27
NotoSansJP DX_FONTTYPE_EDGE: 34
NotoSansJP DX_FONTTYPE_ANTIALIASING: 53
NotoSansJP DX_FONTTYPE_ANTIALIASING_4X4: 33
NotoSansJP DX_FONTTYPE_ANTIALIASING_8X8: 37
NotoSansJP DX_FONTTYPE_ANTIALIASING_EDGE: 82
NotoSansJP DX_FONTTYPE_ANTIALIASING_EDGE_4X4: 64
NotoSansJP DX_FONTTYPE_ANTIALIASING_EDGE_8X8: 69
IPA明朝 DX_FONTTYPE_NORMAL: 20
IPA明朝 DX_FONTTYPE_EDGE: 19
IPA明朝 DX_FONTTYPE_ANTIALIASING: 19
IPA明朝 DX_FONTTYPE_ANTIALIASING_4X4: 21
IPA明朝 DX_FONTTYPE_ANTIALIASING_8X8: 19
IPA明朝 DX_FONTTYPE_ANTIALIASING_EDGE: 22
IPA明朝 DX_FONTTYPE_ANTIALIASING_EDGE_4X4: 19
IPA明朝 DX_FONTTYPE_ANTIALIASING_EDGE_8X8: 19
源様明朝 DX_FONTTYPE_NORMAL: 24
源様明朝 DX_FONTTYPE_EDGE: 33
源様明朝 DX_FONTTYPE_ANTIALIASING: 36
源様明朝 DX_FONTTYPE_ANTIALIASING_4X4: 37
源様明朝 DX_FONTTYPE_ANTIALIASING_8X8: 39
源様明朝 DX_FONTTYPE_ANTIALIASING_EDGE: 65
源様明朝 DX_FONTTYPE_ANTIALIASING_EDGE_4X4: 61
源様明朝 DX_FONTTYPE_ANTIALIASING_EDGE_8X8: 71
○検証フォント(全部フリーフォントです)
NotoSansJP(otf)
//fonts.google.com/noto/specimen/Noto+Sans+JP?subset=japanese
IPA明朝(ttf)
//moji.or.jp/ipafont/ipa00303/
源様明朝(ttf)
//github.com/ButTaiwan/genyo-font
※URLの先頭文字は削除しています
○検証関数
DrawStringToHandle
サイズ:40
厚み:3
タイプ:
DX_FONTTYPE_NORMAL
DX_FONTTYPE_EDGE
DX_FONTTYPE_ANTIALIASING
DX_FONTTYPE_ANTIALIASING_4X4
DX_FONTTYPE_ANTIALIASING_8X8
DX_FONTTYPE_ANTIALIASING_EDGE
DX_FONTTYPE_ANTIALIASING_EDGE_4X4
DX_FONTTYPE_ANTIALIASING_EDGE_8X8
○検証環境
Windows10
C++版 DXLib_Ver3.22a
VisualStudio2019
リリース版で検証
○検証コード
void TextDraw(int font, char drawTexts [16][200]) {
int loopCount = 0;
while (!ProcessMessage()) {
ClearDrawScreen();
for (int ii = 0; ii < 16; ii++) {
DrawStringToHandle(10, 10 + ii * 45, drawTexts[ii], GetColor(255, 255, 255), font);
}
loopCount++;
if (loopCount >= 10) {
break;
}
ScreenFlip();
clsDx();
}
}
void DXlibQA() {
SetGraphMode(1280, 720, 32);
ChangeWindowMode(true);
SetDrawScreen(DX_SCREEN_BACK);
SetDrawMode(DX_DRAWMODE_BILINEAR);
if (DxLib_Init() == -1) {//DXライブラリ初期化
return ;
}
char drawTexts[][200] = {
"吾輩わがはいは猫である。名前はまだ無い。",
"どこで生れたかとんと見当けんとうがつかぬ。",
"何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。",
"吾輩はここで始めて人間というものを見た。",
"しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。",
"この書生というのは時々我々を捕つかまえて煮にて食うという話である。",
"しかしその当時は何という考もなかったから別段恐しいとも思わなかった。",
"ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。",
"掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始みはじめであろう。",
"この時妙なものだと思った感じが今でも残っている。",
"第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶やかんだ。",
"その後ご猫にもだいぶ逢あったがこんな片輪かたわには一度も出会でくわした事がない。",
"のみならず顔の真中があまりに突起している。",
"そうしてその穴の中から時々ぷうぷうと煙けむりを吹く。",
"どうも咽むせぽくて実に弱った。",
"これが人間の飲む煙草たばこというものである事はようやくこの頃知った。",
};
int startTime;
int endTime;
FILE *fp = fopen("test.txt", "w");
int type[] = {
DX_FONTTYPE_NORMAL,
DX_FONTTYPE_EDGE,
DX_FONTTYPE_ANTIALIASING,
DX_FONTTYPE_ANTIALIASING_4X4,
DX_FONTTYPE_ANTIALIASING_8X8,
DX_FONTTYPE_ANTIALIASING_EDGE,
DX_FONTTYPE_ANTIALIASING_EDGE_4X4,
DX_FONTTYPE_ANTIALIASING_EDGE_8X8,
};
char typestr[][80] = {
"DX_FONTTYPE_NORMAL",
"DX_FONTTYPE_EDGE",
"DX_FONTTYPE_ANTIALIASING",
"DX_FONTTYPE_ANTIALIASING_4X4",
"DX_FONTTYPE_ANTIALIASING_8X8",
"DX_FONTTYPE_ANTIALIASING_EDGE",
"DX_FONTTYPE_ANTIALIASING_EDGE_4X4",
"DX_FONTTYPE_ANTIALIASING_EDGE_8X8",
};
//------------------------------------------------------------------------------------------
// フォント その1
//------------------------------------------------------------------------------------------
for (int ii = 0; ii < 8; ii++) {
LPCSTR font_path1 = "GameData1\\font\\NotoSansJP.otf";
AddFontResourceEx(font_path1, FR_PRIVATE, nullptr);
int font1 = CreateFontToHandle("Noto Sans JP", 40, 3, type[ii], -1, -1);
startTime = GetNowCount();
TextDraw(font1, drawTexts);
endTime = GetNowCount();
fprintf(fp, "NotoSansJP %s: % d\n", typestr[ii], (endTime - startTime) / 10);
}
//------------------------------------------------------------------------------------------
// フォント その2
//------------------------------------------------------------------------------------------
for (int ii = 0; ii < 8; ii++) {
LPCSTR font_path2 = "GameData1\\font\\ipam.ttc";
AddFontResourceEx(font_path2, FR_PRIVATE, nullptr);
int font2 = CreateFontToHandle("IPA明朝", 40, 3, type[ii], -1, -1);
startTime = GetNowCount();
TextDraw(font2, drawTexts);
endTime = GetNowCount();
fprintf(fp, "IPA明朝 %s: % d\n", typestr[ii], (endTime - startTime) / 10);
}
//------------------------------------------------------------------------------------------
// フォント その3
//------------------------------------------------------------------------------------------
for (int ii = 0; ii < 8; ii++) {
LPCSTR font_path3 = "GameData1\\font\\GenYoMin-R.ttc";
AddFontResourceEx(font_path3, FR_PRIVATE, nullptr);
int font3 = CreateFontToHandle("GenYoMin TW R", 40, 3, type[ii], -1, -1);
startTime = GetNowCount();
TextDraw(font3, drawTexts);
endTime = GetNowCount();
fprintf(fp, "源様明朝 %s: % d\n", typestr[ii], (endTime - startTime) / 10);
}
fclose(fp);
DxLib_End();
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
DXlibQA();
return 0;
}