提示コードのvoid Stage::LoadStage()関数が原因で処理が物凄く重たくなりまともに動作しなくなるのですがなぜでしょうか?**毎フレーム実行する関数ではないです該当コードは //マップオブジェクトを設定 の二重for文をコメントアウトすると問題なく動作するのですがこれはどう修正したらいいのでしょうか?
確認、試したこと
中身が空のfor文やその他のループ文はないかどうか?
画像の読み込みを毎フレームやっているかどうか確認
Github: https://github.com/Shigurechan/ActionGame/tree/07b47f5b32f4dfd6f93e70ca4a9609d891e48d9f
使用しているライブラリ: dxlib
cpp
1 2//コンストラクタ 3Game_Scene::Game_Scene(Scene_Type t,Entry *e) : Scene_base(t,e) 4{ 5 Owner = e; //Entry クラス 6 7 8 // ##### スプライトをロード ##### 9 10// int Player_Handle = Owner->LoadSprite("Assets/Player/Player_0.png"); //プレイヤー 11 12 int Player_Handle[8]; 13 LoadDivGraph("Sprite_Data/Player.png", 8, 8, 1, CELL, CELL, Player_Handle); //プレイヤー 14 15 int Enemy_Handle = Owner->LoadSprite("Assets/Enemy.png"); //エネミー 16 17 int Player_Bullet_Handle = Owner->LoadSprite("Assets/Player_Bullet.png"); //プレイヤーのバレット 18 int Enemy_Bullet_Handle = Owner->LoadSprite("Assets/Enemy_Bullet.png"); //エネミーのバレット 19 20 int Block_Handle = Owner->LoadSprite("Assets/Block.png"); //ブロック 21 int Brick_Handle = Owner->LoadSprite("Assets/Brick.png"); //レンガ 22 int Shop_Handle = Owner->LoadSprite("Assets/Shop.png"); //ショップ 23 24 //ヒットエフェクト 25 int Enemy_HitEffect_Handle[3]; //エネミー 26 int Stage_HitEffect_Handle[3]; //ステージ 27 int Player_HitEffect_Handle[3]; //プレイヤー 28 LoadDivGraph("Assets/Enemy_Explosion.png", 3, 3, 1, CELL, CELL, Enemy_HitEffect_Handle); //エネミー 29 LoadDivGraph("Assets/Stage_Explosion.png", 3, 3, 1, CELL, CELL, Stage_HitEffect_Handle); //ステージ 30 LoadDivGraph("Assets/Player_Explosion.png", 3, 3, 1, CELL, CELL,Player_HitEffect_Handle); //プレイヤー 31 32 33 player = std::make_shared<Player>(Owner,Player_Handle, Player_Bullet_Handle,Enemy_HitEffect_Handle, Stage_HitEffect_Handle); //プレイヤー 34 stage = std::make_shared<Stage>(Owner,Block_Handle, Brick_Handle, Shop_Handle); //ステージ 35 shop = std::make_shared<Shop>(Owner); //ショップメニュー 36 enemy_mng = std::make_shared<Enemy_Mng>(Enemy_Handle,Enemy_Bullet_Handle,Stage_HitEffect_Handle, Player_HitEffect_Handle); //エネミー管理 37 38} 39 40//更新 41void Game_Scene::Update() 42{ 43 44 stage->setStage(enemy_mng,player); //ステージを読み込み 45 enemy_mng->setEnemy(stage); //エネミーを出現 46 47 stage->Scroll(player, enemy_mng); //画面スクロール 48 49 50 enemy_mng->Update(); //エネミー更新 51 stage->Update(); //ステージ更新 52 player->Update(); //プレイヤー更新 53 54 55 56 57 58 // ##### 当たり判定 ##### 59 60 //エネミーとステージ 61 stage->ColEnemy(enemy_mng); // 62 stage->ColEnemy_Bullet(enemy_mng); // 63 64 //プレイヤーとステージ 65 stage->ColPlayer(player); // 66 stage->ColPlayer_Bullet(player); // 67 68 //プレイヤーとエネミー 69 player->ColEnemy_Bullet(enemy_mng); // 70 71 //エネミーとプレイヤー 72 enemy_mng->ColPlayer_Bullet(player); // 73 // ##### ##### 74 75 76 77} 78 79//描画 80void Game_Scene::Draw() 81{ 82 stage->Draw(); //ステージ描画 83 player->Draw(); //プレイヤー描画 84 enemy_mng->Draw(); //エネミー描画 85} 86 87//デストラクタ 88Game_Scene::~Game_Scene() 89{ 90 91} 92
cpp
1void Stage::LoadStage() 2{ 3 4 mStage.clear(); //ステージをクリア 5 6 // *** ステージロード *** 7 glm::ivec2 StageSize = glm::ivec2(0, 0); //画面サイズ 8 FILE* fp = NULL; //ファイルポインタ 9 10 fopen_s(&fp, "Stage_Data/Debug_Stage.bin", "rb"); //読み込みモードでファイルを開く 11 12 if (fp != NULL) 13 { 14 //ステージサイズを読み込む(先頭8バイト) 15 fread(&StageSize.x, sizeof(int), 1, fp); 16 fread(&StageSize.y, sizeof(int), 1, fp); 17 18 for (int y = 0; y < StageSize.y; y++) 19 { 20 std::vector<byte> tmp; 21 for (int x = 0; x < (int)StageSize.x; x++) 22 { 23 byte b = 0; 24 fread(&b, sizeof(byte), 1, fp); 25 tmp.push_back(b); 26 27 } 28 29 30 Stage_Grid->push_back(tmp); 31 32 } 33 fclose(fp); 34 35 } 36 else { 37 printf("ファイルを読み込めません。\n"); 38 } 39 40 //マップオブジェクトを設定 41 for (int y = 0; y < StageSize.y; y++) 42 { 43 for (int x = 0; x < StageSize.x; x++) 44 { 45 switch (Stage_Grid->at(y).at(x)) 46 { 47 //ブロック 48 case 1: 49 { 50 mStage.push_back(MapChip(StageObjectType::Block, glm::ivec2(x * CELL, y * CELL), BlockSize, Block_sprite)); 51 } 52 break; 53 54 //レンガ 55 case 2: 56 { 57 mStage.push_back(MapChip(StageObjectType::Brick, glm::ivec2(x * CELL, y * CELL), BrickSize, Brick_sprite)); 58 } 59 break; 60 61 //ショップ 62 case 3: 63 { 64 mStage.push_back(MapChip(StageObjectType::Shop, glm::ivec2(x * CELL, y * CELL), ShopSize, Shop_sprite)); 65 } 66 break; 67 68 default: 69 { 70 mStage.push_back(MapChip(StageObjectType::Shop, glm::ivec2(x * CELL, y * CELL), glm::ivec2(0, 0), -1)); 71 } 72 } 73 } 74 } 75 76 77 fclose(fp); 78 79} 80
デバッグモードは最適化が行われないので、リリースモードに比べて10倍ぐらい遅くなるのはそういうものなのでは?
そうなのでしょうか?画像も数枚しか読み込んでないしそんなに不可がかかっているとは思えないのですが?
遅いというのは実行が遅いという事ですか?
ビルドが遅いのではないのですか?
いや実行が遅いです。処理が遅いのですがフレームレート
以前から遅かったのか、急に遅くなったのかどちら?
文章とタイトルを変更しました。
とりあえずLoadStageのどこが原因かまで絞り込んでみては。
StageSizeのxとyって実際どのくらいのサイズです?
これ, 処理が重い というのは,
「Stage::LoadStage()の処理に時間がかかる」という意味ですか?
それとも
「Stage::LoadStage()を1回実行すると,それ以降,プログラムの(Stage::LoadStage()ではない)他の部分の実行速度が遅くなる」といったような意味ですか?
StageSizeは100,100です。
> fread(&b, sizeof(byte), 1, fp);
> tmp.push_back(b);
1バイトごとfread()してvector::push_back()。このようなコードでパフォーマンスは大丈夫なのでしょうか。
1バイトfread+push_backもさることながら既にご回答いただいているように後段のループのMapChipのコンストラクト+push_backがすごいので、それぞれのループの前後ででも経過時間を計測してみれば、少なくともどこで時間的なコストがかかっているか容易に分かるのでは。
原因を絞り込みました。イテレーターによる1万回ループが原因なのですが100x100のステージを全部ループするのは無理なのでしょうか?
回答6件
あなたの回答
tips
プレビュー