トップページ > 記事閲覧
ヒープメモリの異常な使用
名前:リョウセイ 日時: 2019/02/03 17:05

3DのゲームをDXライブラリを使用し作っています しかし、ゲームのマップ移動時(データのロード時)に 消し忘れのオブジェクトや、二重削除などのしていないのに どこからかメモリが大量に使用され、それによって3Dデータが読み込まれなくなったり 一部の処理が行われなくなったりします。 自分で何度考えても解決策が出てきません、どうかご助力願います エラー内容です↓ 34471:ヒープ用メモリの確保に失敗しました 34471: 34472:Alloc memory dump 34473: size: 12816( 12.516kb) user size: 12704( 12.406kb) time:30230 file:\Main\DxModel.cpp line:21378 ID:22697 addr:176c00b0 data:[01 00 00 00 00 00 01 34 02 00 00 00 d2 00 00 00] 〜〜〜〜〜〜〜〜〜〜〜〜〜〜省略(似たような文章が続く) 34473: size: 3392( 3.312kb) user size: 3272( 3.195kb) time:30263 file:NoName line:0 ID:105544 addr:176cd1a0 data:[b0 d1 6c 17 e0 de 6c 17 00 00 00 00 b8 0c 00 00] 34935: Total size:297465290(290493.437kb) Alloc num:722 34936: 34937:Read Model Convert Error : 頂点座標と頂点法線を一時的に格納するメモリ領域の確保に失敗しました 34939:VMD Load Error : 対応していない VMD バージョンです たまにゲームを終了していないのに↓のようなエラーも出ます(スレッド()の中の数字は毎回違う) スレッド(0xbb8) はコード 0 (0x0) で終了しました。
メンテ

Page: 1 |

Re: ヒープメモリの異常な使用 ( No.1 )
名前:NDMK 日時:2019/02/03 18:50

数年前のことですが、自分も画像、音声、3Dモデルなどを多数読んでは解放を繰り返すアプリを 作っていたのですが、しばらくするとヒープエラーが発生してテクスチャが読まれないなどの問題に 悩んでいました。C++がよくわからないままスレッドを使っていたりしていたので、おそらく自分の コードが悪いんだろうと思っていましたが、最後まで解決できませんでした。 結局、32bitアプリをあきらめ、64bitアプリに変更しました。 これでとりあえず、ヒープエラーで悩むことは無くなりました。 もし開発や配布での支障が無ければ、64bitアプリを検討されるのもよろしいかもしれません。 ただ、ログを見ると開始後35秒程度でヒープエラーになっています。それなりに多くのデータを 読んでいるのならともかく、「絶対、この程度でエラーになる量ではない(と思う)」のであれば プログラムまたはライブラリに何か問題があるかもしれません。 今回のログは3Dモデルの読み込み時のものですが、特定のモデルで発生しやすいとかがあるなら、 別の物に差し替えて検証してみるのも手かもしれません。
メンテ
Re: ヒープメモリの異常な使用 ( No.2 )
名前:リョウセイ 日時:2019/02/03 21:21

ご回答ありがとうございます。 エラーが治らないことは少し悔しいですが、NDMKさんの回答がなければ私の企画はすべて消失するところでした。 本当にありがとうございました。 ほぼ初めてネットで質問をしたのですがこんなに丁寧に教えてくださり 独りよがりでやっていたプログラミングもより、好きになれそうです。 本当にありがとうございました。
メンテ
Re: ヒープメモリの異常な使用 ( No.3 )
名前:管理人 日時:2019/02/03 23:35

すみません、DXライブラリの3Dモデルファイルのロード処理は mv1ファイル以外の xファイルや pmdファイルでは大量のメモリを使用するので最大でも 2GB弱しかメモリが使用できない 32bit アプリでは メモリが足りなくなることがあると思います ( 当初は xファイルや pmdファイルを直接使用するのではなく、DxLibModelViewer.exe で mv1ファイルに 変換してから使用することを想定していたので、メモリを湯水のように使用する設計になっています… ) NDMKさんが仰られていますように 64bitアプリにしていただければ PC に搭載されている全てのメモリを 使用することができますので、メモリ不足になることは無いと思います m(_ _;m > たまにゲームを終了していないのに↓のようなエラーも出ます(スレッド()の中の数字は毎回違う) >  > スレッド(0xbb8) はコード 0 (0x0) で終了しました。 こちらは何かのスレッドが終了したことを伝えているだけのログなのでエラーではありません
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存