記述を見て分かる通りATile_ini関数はループの中で何度も呼び出すようには書いておらず、重くなるとすれば一瞬だけだと思っていたのでこの実行結果が腑に落ちません。
最終的には画像ファイルを加工する処理を削除せずにFPSが60まで出るようにしたいのですが、一体何故この部分を実行するとFPSが上がってしまうのでしょうか?どなたかよろしくお願いします。
Data_Tile.cpp
#include "DxLib.h"
#include "stdio.h"
#define AutoTileMax 18//オートタイルの種類
#define AutopatMax 4//オートタイルのアニメ最大枚数
#define NomalTileMax 3//ノーマルタイルの種類
#define NomalTipsMax 264//1枚のノーマルタイルセットのタイルの最大数
#define TipsSqu 32//タイル1枚分画像の1辺の長さ
struct ATileData{
int pics[4][48];//
int pri;//
int pat;//
char name[32];//画像名
};
struct ATileData ATile[AutoTileMax];
void ATile_ini(){
int file,i,j,k,n=0,m=0,ed=0;
int l;//テスト用
int text[32];
char textc[32];
int ATRule[48][4][2];
int Pic[192];
int maketipsc;//オートタイルチップを作成するスクリーン
char FPass[] = "./Data/Pics/TileA/";
char Exten[] = ".png";
char pass[64];
//-オートタイル格納用配列の読み込み-
file = FileRead_open( "./Data/Txt/ATileRuleData.txt" ) ;
if(file==NULL){printfDx("read error\n");return;}
while(1){
for(i=0;i<32;i++){
text[i] = FileRead_getc(file);
textc[i] = text[i];
if(textc[i]=='/'){while(FileRead_getc(file)!='\n'){i=-1;continue;}}
if(text[i]==',' || text[i]=='\n'){textc[i]='\0';break;}
if(text[i]==EOF){ed=1;break;}
}
if(ed==1){FileRead_close(file);break;}
ATRule[m/8][(m/2)%4][m%2] = atoi(textc);
m++;
}
n=0;m=0;ed=0;
//-オートタイルデータの読み込み-
file = FileRead_open( "./Data/Txt/ATileData.txt" ) ;
if(file==NULL){printfDx("read error\n");return;}
while(1){
for(i=0;i<32;i++){
text[i] = FileRead_getc(file);
textc[i] = text[i];
if(textc[i]=='/'){while(FileRead_getc(file)!='\n'){i=-1;continue;}}
if(text[i]==',' || text[i]=='\n'){textc[i]='\0';break;}
if(text[i]==EOF){ed=1;break;}
}
if(ed==1){FileRead_close(file);break;}
switch(m){
case 0: for(i=0;i<32;i++){
ATile[n].name[i] = textc[i];
}
break;
case 1: ATile[n].pri = atoi(textc);break;
case 2: ATile[n].pat = atoi(textc);break;
}
m++;
if(m==3){m=0;n++;}
}
//画像データの読み込み
for(i=0;i<AutoTileMax;i++){
strcpy(pass,FPass);strcat(pass,ATile[i].name);strcat(pass,Exten);
for(j=0;j<192;j++){
Pic[j] = MakeGraph(16,16);
}
LoadDivGraph( pass , 48*ATile[i].pat , 6*ATile[i].pat , 8 , 16 , 16 , Pic ) ;
for(k=0;k<4;k++){
for(j=0;j<48;j++){
ATile[i].pics[k][j] = MakeGraph(TipsSqu,TipsSqu);
}
}
for(k=0;k<ATile[i].pat;k++){
for(j=0;j<48;j++){
maketipsc = MakeScreen( TipsSqu, TipsSqu, TRUE ) ;
SetDrawScreen( maketipsc ) ;//FPS低下の原因1
DrawGraph( 0, 0,Pic[ATRule[j][0][0]+6*ATRule[j][0][1]*ATile[i].pat],TRUE);
DrawGraph(16, 0,Pic[ATRule[j][1][0]+6*ATRule[j][1][1]*ATile[i].pat],TRUE);
DrawGraph( 0,16,Pic[ATRule[j][2][0]+6*ATRule[j][2][1]*ATile[i].pat],TRUE);
DrawGraph(16,16,Pic[ATRule[j][3][0]+6*ATRule[j][3][1]*ATile[i].pat],TRUE);
SetDrawScreen( DX_SCREEN_FRONT ) ;//FPS低下の原因2
ATile[i].pics[k][j] = maketipsc;
}
}
memset(pass,0,sizeof(pass));
}
}
#include "DxLib.h"
#include <math.h>
#include "main.h"
//fps
#define FLAME 60
//fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数
int fps_count,count0t;
//平均を計算するため60回の1周時間を記録
int f[FLAME];
//平均fps
double ave;
//FLAME fps になるようにfpsを計算・制御
void fps_wait(){
int term,i,gnt;
static int t=0;
if(fps_count==0){//60フレームの1回目なら
if(t==0)//完全に最初ならまたない
term=0;
else//前回記録した時間を元に計算
term=count0t+1000-GetNowCount();
}
else //待つべき時間=現在あるべき時刻-現在の時刻
term = (int)(count0t+fps_count*(1000.0/FLAME))-GetNowCount();
if(term>0)//待つべき時間だけ待つ
Sleep(term);
gnt=GetNowCount();
if(fps_count==0)//60フレームに1度基準を作る
count0t=gnt;
f[fps_count]=gnt-t;//1周した時間を記録
t=gnt;
//平均計算
if(fps_count==FLAME-1){
ave=0;
for(i=0;i<FLAME;i++)
ave+=f[i];
ave/=FLAME;
}
fps_count = (++fps_count)%FLAME ;
}
//x,yの位置にfpsを表示
void draw_fps(int x, int y){
if(ave!=0){
DrawFormatString(x, y,GetColor(255,255,255),"[%.1f]",1000/ave);
}
return;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
ATile_ini();
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
draw_fps(0,0);
fps_wait();
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}