teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

文言

2021/03/12 06:12

投稿

int32_t
int32_t

スコア21933

answer CHANGED
@@ -1,2 +1,4 @@
1
1
  `MapChip` の生成・コピーにとてもコストがかかっていませんか?
2
- 以前の質問で見たコードのままだと、生成するたびにファイル読み込みしてたと思います。
2
+ 以前の質問で見たコードのままだと、生成するたびにファイル読み込みしてたと思います。
3
+
4
+ とりあえず、ループの前に「`mStage.reserve(StageSize.x * StageSize.y);`」と書くことで `MapChip`のコピー回数をぐっと減らせるかもしれません。あと、`MapChip`をコピー不能にして`mStage`をスマートポインタのベクタにしたほうが速くなると思います。

1

全面的に書き換え

2021/03/12 06:12

投稿

int32_t
int32_t

スコア21933

answer CHANGED
@@ -1,15 +1,2 @@
1
- 最初は「デバッグビルドだと重い」という問題だったと思います。リリースビルドでの速度に問題がなく、自分のコードにデバッグビルド専用コードがないのだったら、そういうものとして受け入れるのが通常です。
2
-
3
- `Stage::LoadStage()`が想定外に重いというのが確実であるなら、「頻繁なメモリ確保を避けるために、`std::vector`のサイズを予約する」「頻繁な関数コールを避けるために、できるだけまとめて `fread()` する」あたりで速くなる可能性があります。
4
-
5
- ```c++
6
- Stage_Grid->reserve(StateSize.y); // 容量予約
7
- for (int y = 0; y < StageSize.y; ++y) {
8
- // サイズ指定ストラクタを使う
1
+ `MapChip` の生成・ピーにとてもコストがかかっていませんか?
9
- std::vector<byte> tmp(StageSize.x);
2
+ 以前の質問で見たコードのままだと、生成するたびにファイル読み込みしてたと思います。
10
- // StageSize.xぶん一度に読み込み
11
- fread(tmp.data(), sizeof(byte), tmp.size(), fp);
12
- // コピー回避のためムーブする
13
- Stage_Grid->push_back(std::move(tmp));
14
- }
15
- ```