質問させていただきます。
最近DrawStringToHandleでテキストを画面に表示すると処理落ちするようになってしまいました。
色々原因を調べてみたのですが、画面に多くの種類のテキストを描画すると処理落ちが激しくなるようなのです。
同じテキストを描画する分には処理落ちはしないので、キャッシュ的なものが働いてるのかなーとは思うのですが、対策が思いつきません。知恵をお貸しいただけたらと思います。
ちょっと説明が難しいので、サンプルを作ってみました。
#include "DxLib.h"
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char str_data1[1024], str_data2[1024];
int FontHandle;
char work[3];
char text[256];
int i, x = 0, y = 0, count;
// DXライブラリの初期化
SetGraphMode(640 * 2, 480 * 2, 32);
ChangeWindowMode(true);
if( DxLib_Init() == -1 ) return 0 ;
SetDrawScreen(DX_SCREEN_BACK);
FontHandle = CreateFontToHandle( NULL , 40 , 3 , DX_FONTTYPE_ANTIALIASING_EDGE) ;
str_data1[0] = '\0';
for(i = 0;i < 100;i++){
strcat(str_data1, "あ");
}
strcpy(str_data2, "あいうえおかきくけこ");
strcat(str_data2, "さしすせそたちつてと");
strcat(str_data2, "なにぬねのはひふへほ");
strcat(str_data2, "まみむめもらりるれろ");
strcat(str_data2, "やゆよわんぁぃぅぇぉ");
strcat(str_data2, "アイウエオカキクケコ");
strcat(str_data2, "サシスセソタチツテト");
strcat(str_data2, "ナニヌネノハヒフヘホ");
strcat(str_data2, "マミムメモラリルレロ");
strcat(str_data2, "ヤユヨワンァィゥェォ");
while(1){
ClearDrawScreen();
//「あ」を100回描画
x = 0;
y = 0;
count = GetNowCount();
for(i = 0;i < 100;i++){
work[0] = str_data1[i * 2];
work[1] = str_data1[i * 2 + 1];
work[2] = '\0';
DrawStringToHandle(x, y, (char *)work, GetColor(255, 255, 255), FontHandle);
x += 40;
if(x > 1280){
x = 0;
y += 40;
}
if(y > 900){
y = 0;
}
}
sprintf(text, "「あ」100回描画で : %d ms", GetNowCount() - count);
DrawStringToHandle(350, 200, text, GetColor(255, 255, 255), FontHandle);
//いろいろ100回描画
x = 0;
y = 400;
count = GetNowCount();
for(i = 0;i < 100;i++){
work[0] = str_data2[i * 2];
work[1] = str_data2[i * 2 + 1];
work[2] = '\0';
DrawStringToHandle(x, y, (char *)work, GetColor(255, 255, 255), FontHandle);
x += 40;
if(x > 1280){
x = 0;
y += 40;
}
if(y > 900){
y = 0;
}
}
sprintf(text, "いろいろ100回描画で : %d ms", GetNowCount() - count);
DrawStringToHandle(350, 600, text, GetColor(255, 255, 255), FontHandle);
ScreenFlip();
ProcessMessage();
if(CheckHitKeyAll() != 0)break;
}
// 作成したフォントデータを削除する
DeleteFontToHandle( FontHandle ) ;
// DXライブラリの終了
DxLib_End() ;
// ソフトの終了
return 0 ;
}
「あ」だけを100回描画するのと、いろいろな文字を100回描画するのを比較してます。
うちの環境ですと、「あ」の方は1ms以内で、いろいろな文字を描画する方は17〜18msほどかかっています。
お忙しいとは思いますが、何卒よろしくお願いします。