ファイルのロード

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ochaduke
記事: 36
登録日時: 8年前

ファイルのロード

#1

投稿記事 by ochaduke » 8年前

(C++, DxLib, visual studio2015, windows7使用)
ファイルのロードとメモリについて質問です。

!!!!!!!!!!!!!!2015/11/23追記!!!!!!!!!!!!!!!!!!!
相互リンク:
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=3695
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

<今やっていることと問題>
非同期で大量のファイル(画像*49、音楽*35、フォントハンドルの作成*3、動画*2)を読み込んでいるのですが、いつも3~4個のファイルを読み込めません。
※コードは最下部に載せましたので、必要に応じてご覧になってください。


<原因の推測と質問>
私は、これはメモリ不足なのかなと考えています。
なぜなら、失敗する個数は、いつも3~4個で、ファイルの破損はない(と思う。実際、前はそのファイル単体でロードできた)からです。
皆さんはどうお考えでしょうか?

また、もし、原因がメモリ不足だとしたら、どのようにすればよいでしょうか?(これ以上ファイルはロードしないから必要な分だけ静的確保?)メモリについては無知なので、どうぞご享受ください。
別の原因があったら、その解決方法を示してくださるとありがたいです。


以下がコードになります。

コード:

SetDrawScreen(DX_SCREEN_BACK);

	int mov = 0;
	int mov_bgm = 0;
	int loadnum;
	int check;
	int error = 0;
	
//ロード画面で使う動画のロード
	mov = LoadGraph("動画.ogv");
	mov_bgm = LoadSoundMem("音楽.ogg");

	PlaySoundMem(mov_bgm, DX_PLAYTYPE_BACK);
	PlayMovieToGraph( mov );
	
//非同期で種々のファイルをロード
SetUseASyncLoadFlag( TRUE ) ;
//色々なファイルのロード
LoadGraph("画像.png");//等々

const int loadmax = GetASyncLoadNum();


	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
		DrawExtendGraph(127, 10, 895, 610, mov, 1);
		loadnum = GetASyncLoadNum();
		DrawFormatString(320, 620, GetColor(185, 185, 185), "NOW LOADING WAIT A MINUTE...%d%", int((loadmax - loadnum) * 100 / loadmax));

		if( GetMovieStateToGraph(mov) == 0 && loadnum == 0 ) {//動画と読み込みが終了
			break;
		}

		else if( GetMovieStateToGraph(mov) == 0 && loadnum != 0 ){//動画ループ処理
			SeekMovieToGraph(mov, 0);//最初から
			StopSoundMem(mov_bgm);//一回止めて、
			PlayMovieToGraph( mov );
			PlaySoundMem(mov_bgm, DX_PLAYTYPE_BACK);
		}

		else if( GetMovieStateToGraph(mov) == 1 && loadnum == 0 ){//動画だけ終わってない
			DrawFormatString(420, 640, GetColor(255, 185, 185), "COMPETED! PUSH ANY BUTTON to SKIP");
			if( CheckHitKeyAll() != 0){
				break;
			}
		}
	}

//読み込チェック
	if (CheckHandleASyncLoad(handle) < 0) { error++; }//全ハンドルについて行う

if (error > 0) {
		DrawFormatString(500, 330, GetColor(255, 0, 0), "注意!%d個のファイルの読み込みに失敗しました。", error);
		DrawFormatString(500, 400, GetColor(255, 0, 0), "何かキーを押してスタートします。");
		ScreenFlip();
		WaitKey();
	}
	SetUseASyncLoadFlag(FALSE);

	StopSoundMem(mov_bgm);
	DeleteSoundMem(mov_bgm);
最後に編集したユーザー ochaduke on 2015年11月23日(月) 21:52 [ 編集 2 回目 ]
電車グ人生…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ファイルのロード

#2

投稿記事 by softya(ソフト屋) » 8年前

DXライブラリであれば、log.txtにエラーが記録されているはずですので確認してみてください。
メモリ不足の場合は、タスクマネージャで消費メモリを確認します。2GBとかあるなら、配布するゲームとしては失格だと思いますのでデータの見直しが必要だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ochaduke
記事: 36
登録日時: 8年前

Re: ファイルのロード

#3

投稿記事 by ochaduke » 8年前

返信遅くなって申し訳ありません!

教えていただき、ありがとうございます。プログラミングできる環境になったら確かめたいと思います。
電車グ人生…

ochaduke
記事: 36
登録日時: 8年前

ファイルのロード(更新)

#4

投稿記事 by ochaduke » 8年前

ご無沙汰しております。しばらくプログラミングが出来なかったのですが、今日チャンスが舞い降りてきたので、softyaさんに教えていただいたことをやってみました。

-----結果(logより抜粋)-----
0:ヒープ用メモリの確保に失敗しました
0:
1:Alloc memory dump
24: size: 32880( 32.109kb) user size: 32768( 32.000kb) time:07069 file:Main\DxHandle.cpp line:86 ID:1 addr:0a0500b0 data:[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00]

225:音声ファイルを格納するメモリ領域の確保に失敗しました
227:Sound File Setup Error : C:\{ファイル名}.ogg{や.mp3}
12190:ヒープ用メモリの確保に失敗しました
12191:
12194:Alloc memory dump
----------------------------------------
このように出ました。(なんじゃこりゃぁーーー)
勿論のごとく、エラーが出ているファイルは読み込みに失敗していました。

-----さらに抜粋------
1569: Total size:261340305(255215.141kb) Alloc num:279
//エラー文
20390: Total size:526603078(514260.812kb) Alloc num:359
//エラー文
20905: Total size:536717862(524138.531kb) Alloc num:357
//エラー文
21582: Total size:472511206(461436.719kb) Alloc num:363
//エラー文
23778: Total size:460954663(450151.031kb) Alloc num:421
//エラー文
24662: Total size:471510276(460459.250kb) Alloc num:425
---------------------------------

さて、ここで質問ですが、

1.「ヒープ用メモリの確保に失敗しました」と「音声ファイルを格納するメモリ領域の確保に失敗しました」と「Sound File Setup Error : C:\{ファイル名}.ogg{や.mp3}」について解説をお願いします!
2.上のそれぞれにおいての対策(処理)の必要の有無を教えてください!
3.もし対策が必要なら、その方法を教えてください!


どうぞよろしくお願いします。
最後に編集したユーザー ochaduke on 2015年11月23日(月) 21:20 [ 編集 1 回目 ]
電車グ人生…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ファイルのロード

#5

投稿記事 by softya(ソフト屋) » 8年前

メモリ不足ですね。
前の私の質問にありますが実行時のメモリはどのぐらい消費していたのでしょうか? 落ちる直前の情報は最重要です。
もし2GBとか本当にあるのなら、元々読み込むのが無茶なデータか、解放忘れでメモリリークしてメモリが足らなくなったかのどちらかです。
確認できませんか? 
ochadukeさんがデータもプログラム持っているので把握できるのはochadukeさんだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 525
登録日時: 11年前

Re: ファイルのロード

#6

投稿記事 by Rittai_3D » 8年前

ochaduke さんが書きました:1.「ヒープ用メモリの確保に失敗しました」と「音声ファイルを格納するメモリ領域の確保に失敗しました」と「Sound File Setup Error : C:\{ファイル名}.ogg{や.mp3}」について解説をお願いします!
2.上のそれぞれにおいての対策(処理)の必要の有無を教えてください!
3.もし対策が必要なら、その方法を教えてください!
「DxLib ヒープ用メモリの確保に失敗しました」と「DxLib 音声ファイルを格納するメモリ領域の確保に失敗しました」で検索すれば解決策が出る・・・と思っていて調べましたら、出てこないのですね・・・。

予想ですが、「ヒープ用メモリの確保に失敗しました」は、DxLibが使用するメモリの確保に失敗したとき、
「音声ファイルを格納するメモリ領域の確保に失敗しました」は、音声ファイルハンドルを格納しておく領域の確保に失敗したとき、
「Sound File Setup Error : C:\{ファイル名}.ogg{や.mp3}」は、上のエラーが原因で初期化が出来なかった時に出てくるエラーだと思います。

もう一度言いますが、あくまでもわたしの予想です。正確な情報が欲しいのであれば、「DXライブラリ置き場」の掲示板(http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?)で質問をしてみてください。

その際、フォーラムルールにある相互リンクを忘れずにしてください。
► スポイラーを表示
色々勘違いしてました。このコードは撤回します。
混乱させるようなことを言ってしまい、申し訳ありませんでした。
しばらくROMってます。
最後に編集したユーザー Rittai_3D on 2015年11月24日(火) 08:05 [ 編集 1 回目 ]
初心者です

ochaduke
記事: 36
登録日時: 8年前

Re: ファイルのロード

#7

投稿記事 by ochaduke » 8年前

softyaさん、logのファイルからそれっぽい数字を探して取り上げ、前の記事を編集したのでご覧ください。
(一番最後にあるのが最終的なメモリ上のサイズなのかな・・・)

また、説明不足でしたが、今作っているものは、”日本にあり、万能ネズミが住んでいる某超有名テーマパーク”を画像、音楽、動画を用いて解説するソフトです(勿論、表向きにリリースするつもりはありませんよ!)
だから、円滑にいろいろなものにアクセスするために、一番最初に膨大な量のファイルを読み込んでしまえ!!と思い、今に至っています。


なるべく一度に読み込みたいものですが、、、やっぱり、メモリ不足ということだったら、すべてのファイルを一度に読み込んだ状態にするのは難しそうですか・・・
電車グ人生…

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ファイルのロード

#8

投稿記事 by みけCAT » 8年前

Rittai_3D さんが書きました:

コード:

#include <DxLib.h>
#include <malloc.h>

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
	ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

	int* image = ( int* )malloc( sizeof( int ) );

	*image = LoadGraph( "dat/test.png" );

	while( !ProcessMessage() ) {
		ClearDrawScreen();

		DrawGraph( 10, 10, *image, TRUE );

		ScreenFlip();
	}

	DeleteGraph( *image );
	free( image );

	DxLib_End();
	return 0;
}
などとやってみてはどうでしょうか。
ただでさえメモリ不足だといっているのに、(数バイトくらい誤差だとは思うが)どうしてさらにメモリの使用量を増やすのですか?
ここでmallocをしてもDXライブラリにはほとんど影響を与えないと予想できる上、ポインタの分メモリの使用量が数バイト増えます。
それとも、もしかしたら何らかの実験により、ここでおまじないとしてmallocを使うと、
なんらかのトリックが働いてDXライブラリの動作に影響を与え、メモリの使用量が減るということがわかっているのですか?
最後に編集したユーザー みけCAT on 2015年11月23日(月) 21:39 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ochaduke
記事: 36
登録日時: 8年前

Re: ファイルのロード

#9

投稿記事 by ochaduke » 8年前

3Dさん、ご指南ありがとうございます。

私はまだまだ初心者で、メモリあたりのことなどはあまりわからず、まずは勉強から始めないとダメなようです。
もう少し研究して、教えてくださった方法も近いうちに試してみたいと思います。
(なんせ試験前だったりしなかったり・・・(._.) )

とにかく、詳しく教えていただき、ありがとうございます。
電車グ人生…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ファイルのロード

#10

投稿記事 by softya(ソフト屋) » 8年前

log.txtでほしい情報は得られないので、メモリはタスクマネージャで確認してください。
あと読み込んでいるファイルの合計容量を教えて下さい。フォルダ内ファイルの合計容量で良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ochaduke
記事: 36
登録日時: 8年前

Re: ファイルのロード

#11

投稿記事 by ochaduke » 8年前

お待たせしました。

画像
タスクマネジャーの画像です。

あと、ファイルの総量は
913,719KBでした。
電車グ人生…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ファイルのロード

#12

投稿記事 by softya(ソフト屋) » 8年前

画像が添付されていません、ファイル添付の機能を使ってください。
投稿前のプレビューで確認もお願いします。

> 913,719KBでした。
タスクマネージャの画像がないので断言はできませんが圧縮状態で1GB近いとすると、展開状態で保存(読み込み)するメモリは2GBでも足らないと思います。
ストリーム再生を検討する必要があるでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ochaduke
記事: 36
登録日時: 8年前

Re: ファイルのロード

#13

投稿記事 by ochaduke » 8年前

失礼しました。ようやく添付機能を発見しました。

※また、データはdxlibのアーカイバでまとめています。
添付ファイル
IMG_メモリ.jpg
電車グ人生…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ファイルのロード

#14

投稿記事 by softya(ソフト屋) » 8年前

jpgで文字潰れてます。pngかgifを使ってください。
あとプロセスの方が情報が細かいので、そちらをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ochaduke
記事: 36
登録日時: 8年前

Re: ファイルのロード

#15

投稿記事 by ochaduke » 8年前

返信遅れました。
softya(ソフト屋) さんが書きました:プロセスの方が情報が細かいので、そちらをお願いします。
勝手で申し訳ないのですが、早くても水曜日までパソコンを触れそうにないので、もう少し待ってください。お願いします。

一応、pngにし直したのをアップします。
宜しくお願いしますm(_ _)m
添付ファイル
メモリ.png
メモリ.png (44.61 KiB) 閲覧数: 7822 回
電車グ人生…

ochaduke
記事: 36
登録日時: 8年前

お待たせしました!

#16

投稿記事 by ochaduke » 8年前

パソコンをやる時間が少しだけ捻出できたので、プロセスを確認することが出来ました!
なので、画像を載せます。
プロセス.png
選択してある部分です。
プロセス.png (56.01 KiB) 閲覧数: 7649 回
また、これは大体メモリが最大値を示したあたり(読み込み完了時)の物です。

#追記:
ちなみに、学校のPCで確認したところ、下の画像のようになりました。
プロセスwin8ver.png
学校のPCはwindows8です。
プロセスwin8ver.png (46.39 KiB) 閲覧数: 7569 回
softyaさんはじめ、他の方も解説、指示よろしくお願い致します。
電車グ人生…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ファイルのロード

#17

投稿記事 by softya(ソフト屋) » 8年前

既に1.3GB近く消費していて、更に0.5GB程を幾つも読み込もうとしているようですから、32bitゲームアプリの制限2GBを超えるので元々無理だったと考えたほうが良いでしょう。
メモリ常駐はあきらめてください。としか言えないですね。
そもそも2G近く消費するものを作るのは動く環境を限るのでやめた方が良いでしょう。
ochadukeさんのご自宅環境で開発できなくなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ochaduke
記事: 36
登録日時: 8年前

Re: ファイルのロード

#18

投稿記事 by ochaduke » 8年前

やはりそうですか、、、

皆さん、色々とありがとうございます。
諦めてストリーミングなりなんなり、したいと思います。

感謝です!
電車グ人生…

閉鎖

“C言語何でも質問掲示板” へ戻る