質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

ファイルを読み込む関数でfclose()しているのにも関わらず処理が物凄く重たくなる場合の修正方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

6回答

-4評価

0クリップ

2261閲覧

投稿2021/03/11 06:16

編集2021/03/13 04:29

提示コードのvoid Stage::LoadStage()関数が原因で処理が物凄く重たくなりまともに動作しなくなるのですがなぜでしょうか?**毎フレーム実行する関数ではないです該当コードは //マップオブジェクトを設定  の二重for文をコメントアウトすると問題なく動作するのですがこれはどう修正したらいいのでしょうか?

確認、試したこと
中身が空のfor文やその他のループ文はないかどうか?
画像の読み込みを毎フレームやっているかどうか確認

Github: https://github.com/Shigurechan/ActionGame/tree/07b47f5b32f4dfd6f93e70ca4a9609d891e48d9f
使用しているライブラリ: dxlib
イメージ説明

cpp

//コンストラクタ Game_Scene::Game_Scene(Scene_Type t,Entry *e) : Scene_base(t,e) { Owner = e; //Entry クラス // ##### スプライトをロード ##### // int Player_Handle = Owner->LoadSprite("Assets/Player/Player_0.png"); //プレイヤー int Player_Handle[8]; LoadDivGraph("Sprite_Data/Player.png", 8, 8, 1, CELL, CELL, Player_Handle); //プレイヤー int Enemy_Handle = Owner->LoadSprite("Assets/Enemy.png"); //エネミー int Player_Bullet_Handle = Owner->LoadSprite("Assets/Player_Bullet.png"); //プレイヤーのバレット int Enemy_Bullet_Handle = Owner->LoadSprite("Assets/Enemy_Bullet.png"); //エネミーのバレット int Block_Handle = Owner->LoadSprite("Assets/Block.png"); //ブロック int Brick_Handle = Owner->LoadSprite("Assets/Brick.png"); //レンガ int Shop_Handle = Owner->LoadSprite("Assets/Shop.png"); //ショップ //ヒットエフェクト int Enemy_HitEffect_Handle[3]; //エネミー int Stage_HitEffect_Handle[3]; //ステージ int Player_HitEffect_Handle[3]; //プレイヤー LoadDivGraph("Assets/Enemy_Explosion.png", 3, 3, 1, CELL, CELL, Enemy_HitEffect_Handle); //エネミー LoadDivGraph("Assets/Stage_Explosion.png", 3, 3, 1, CELL, CELL, Stage_HitEffect_Handle); //ステージ LoadDivGraph("Assets/Player_Explosion.png", 3, 3, 1, CELL, CELL,Player_HitEffect_Handle); //プレイヤー player = std::make_shared<Player>(Owner,Player_Handle, Player_Bullet_Handle,Enemy_HitEffect_Handle, Stage_HitEffect_Handle); //プレイヤー stage = std::make_shared<Stage>(Owner,Block_Handle, Brick_Handle, Shop_Handle); //ステージ shop = std::make_shared<Shop>(Owner); //ショップメニュー enemy_mng = std::make_shared<Enemy_Mng>(Enemy_Handle,Enemy_Bullet_Handle,Stage_HitEffect_Handle, Player_HitEffect_Handle); //エネミー管理 } //更新 void Game_Scene::Update() { stage->setStage(enemy_mng,player); //ステージを読み込み enemy_mng->setEnemy(stage); //エネミーを出現 stage->Scroll(player, enemy_mng); //画面スクロール enemy_mng->Update(); //エネミー更新 stage->Update(); //ステージ更新 player->Update(); //プレイヤー更新 // ##### 当たり判定 ##### //エネミーとステージ stage->ColEnemy(enemy_mng); //  stage->ColEnemy_Bullet(enemy_mng); // //プレイヤーとステージ stage->ColPlayer(player); // stage->ColPlayer_Bullet(player); // //プレイヤーとエネミー player->ColEnemy_Bullet(enemy_mng); // //エネミーとプレイヤー enemy_mng->ColPlayer_Bullet(player); // // ##### ##### } //描画 void Game_Scene::Draw() { stage->Draw(); //ステージ描画 player->Draw(); //プレイヤー描画 enemy_mng->Draw(); //エネミー描画 } //デストラクタ Game_Scene::~Game_Scene() { }

cpp

void Stage::LoadStage() { mStage.clear(); //ステージをクリア // *** ステージロード *** glm::ivec2 StageSize = glm::ivec2(0, 0); //画面サイズ FILE* fp = NULL; //ファイルポインタ fopen_s(&fp, "Stage_Data/Debug_Stage.bin", "rb"); //読み込みモードでファイルを開く if (fp != NULL) { //ステージサイズを読み込む(先頭8バイト) fread(&StageSize.x, sizeof(int), 1, fp); fread(&StageSize.y, sizeof(int), 1, fp); for (int y = 0; y < StageSize.y; y++) { std::vector<byte> tmp; for (int x = 0; x < (int)StageSize.x; x++) { byte b = 0; fread(&b, sizeof(byte), 1, fp); tmp.push_back(b); } Stage_Grid->push_back(tmp); } fclose(fp); } else { printf("ファイルを読み込めません。\n"); } //マップオブジェクトを設定 for (int y = 0; y < StageSize.y; y++) { for (int x = 0; x < StageSize.x; x++) { switch (Stage_Grid->at(y).at(x)) { //ブロック case 1: { mStage.push_back(MapChip(StageObjectType::Block, glm::ivec2(x * CELL, y * CELL), BlockSize, Block_sprite)); } break; //レンガ case 2: { mStage.push_back(MapChip(StageObjectType::Brick, glm::ivec2(x * CELL, y * CELL), BrickSize, Brick_sprite)); } break; //ショップ case 3: { mStage.push_back(MapChip(StageObjectType::Shop, glm::ivec2(x * CELL, y * CELL), ShopSize, Shop_sprite)); } break; default: { mStage.push_back(MapChip(StageObjectType::Shop, glm::ivec2(x * CELL, y * CELL), glm::ivec2(0, 0), -1)); } } } } fclose(fp); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

tiitoi

2021/03/11 06:30 編集

デバッグモードは最適化が行われないので、リリースモードに比べて10倍ぐらい遅くなるのはそういうものなのでは?
退会済みユーザー

退会済みユーザー

2021/03/11 06:57

そうなのでしょうか?画像も数枚しか読み込んでないしそんなに不可がかかっているとは思えないのですが?
sazi

2021/03/11 07:30

遅いというのは実行が遅いという事ですか? ビルドが遅いのではないのですか?
退会済みユーザー

退会済みユーザー

2021/03/11 10:25

いや実行が遅いです。処理が遅いのですがフレームレート
退会済みユーザー

退会済みユーザー

2021/03/11 12:45

以前から遅かったのか、急に遅くなったのかどちら?
退会済みユーザー

退会済みユーザー

2021/03/12 04:03

文章とタイトルを変更しました。
退会済みユーザー

退会済みユーザー

2021/03/12 04:29

とりあえずLoadStageのどこが原因かまで絞り込んでみては。
退会済みユーザー

退会済みユーザー

2021/03/12 04:58 編集

StageSizeのxとyって実際どのくらいのサイズです?
fana

2021/03/12 06:28

これ, 処理が重い というのは, 「Stage::LoadStage()の処理に時間がかかる」という意味ですか? それとも 「Stage::LoadStage()を1回実行すると,それ以降,プログラムの(Stage::LoadStage()ではない)他の部分の実行速度が遅くなる」といったような意味ですか?
退会済みユーザー

退会済みユーザー

2021/03/12 06:48

StageSizeは100,100です。
dodox86

2021/03/12 08:51 編集

> fread(&b, sizeof(byte), 1, fp); > tmp.push_back(b); 1バイトごとfread()してvector::push_back()。このようなコードでパフォーマンスは大丈夫なのでしょうか。
dodox86

2021/03/12 09:55

1バイトfread+push_backもさることながら既にご回答いただいているように後段のループのMapChipのコンストラクト+push_backがすごいので、それぞれのループの前後ででも経過時間を計測してみれば、少なくともどこで時間的なコストがかかっているか容易に分かるのでは。
退会済みユーザー

退会済みユーザー

2021/03/14 04:27

原因を絞り込みました。イテレーターによる1万回ループが原因なのですが100x100のステージを全部ループするのは無理なのでしょうか?

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。