今までは簡単かつ小規模なものしか作ったことなかったので初めてぶち当たる壁なのですが、
メモリとロード時間をあまりにも取り過ぎてしまいます。
タスクマネージャーを起動してみると、衝撃の1GBかつロード時間が20秒という体たらく。
実験の結果、画像に関してはメモリは画像の縦横のピクセル数に比例する、
ロード時間は実験が難しいのですがおそらく画像の容量(何バイトか)に比例すると推測しましたが合ってるでしょうか?
またこの場合、節約の仕方なのですが、
メモリのために画像のピクセル数を小さくして、描画時に数倍にする、
ロード時間のために画像の容量を下げるってことでいいんでしょうか。
また音楽の場合は検討も付きません。何をすればいいんでしょう。
なんだか質問数が絞れてなくて申し訳ないですが、以上です。
このサイトの過去ログからなんとかメモリは100MB、ロードは5秒付近まで減らす心積もりです。
メモリの節約の仕方とロード時間の短縮
Re: メモリの節約の仕方とロード時間の短縮
状況がよくわかりませんが
全てを一度にロードして保持しなければならないのでしょうか?
例えば音楽なら,今演奏するやつだけロードしてあればいい とか
何かしら「必要な時点でロードし,不要になったら捨てる(メモリを空ける)」ことが可能なデータがあるなら
そのようにすれば問題が軽減されませんか?
全てを一度にロードして保持しなければならないのでしょうか?
例えば音楽なら,今演奏するやつだけロードしてあればいい とか
何かしら「必要な時点でロードし,不要になったら捨てる(メモリを空ける)」ことが可能なデータがあるなら
そのようにすれば問題が軽減されませんか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: メモリの節約の仕方とロード時間の短縮
画像がそこまで膨らんでしまった仕様的な原因そのもの検討しないとピクセルを減らすだけではクオリティダウンに繋がります。
プロの場合、部分的な画像を繋ぎ合わせたりして画像減らします。
あと部分的なロードとか、バッググラウンドの読み込みとかで操作上の時間を節約します。
プロの場合、部分的な画像を繋ぎ合わせたりして画像減らします。
あと部分的なロードとか、バッググラウンドの読み込みとかで操作上の時間を節約します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: メモリの節約の仕方とロード時間の短縮
usaoさんありがとうございます。
音楽は毎度読み込む方針でぐっとメモリは減りました。恐らくロード時間も減っていると思います。
画像もこの方針でいくらか削れそうです。
ただ実験でわかったんですが、曲一個に10MB以上のメモリを使います。
画像はまだ分かりませんが、
そもそもウィンドウを出すだけ(while(ProcessLoop()==0){の行に初めて入った瞬間で)
既に40MBも使っています。
世のゲームは明らかに100MBのラインはクリアしているのですが、
一体どういうことでしょう。
何か恐ろしい勘違いを自分がしている気がしてならないのですが、
少なくともこの最初の40MBはあって当たり前の数字ですか?
音楽は毎度読み込む方針でぐっとメモリは減りました。恐らくロード時間も減っていると思います。
画像もこの方針でいくらか削れそうです。
ただ実験でわかったんですが、曲一個に10MB以上のメモリを使います。
画像はまだ分かりませんが、
そもそもウィンドウを出すだけ(while(ProcessLoop()==0){の行に初めて入った瞬間で)
既に40MBも使っています。
世のゲームは明らかに100MBのラインはクリアしているのですが、
一体どういうことでしょう。
何か恐ろしい勘違いを自分がしている気がしてならないのですが、
少なくともこの最初の40MBはあって当たり前の数字ですか?
Re: メモリの節約の仕方とロード時間の短縮
僕の環境で単純なDXライブラリのアプリを立ち上げても40MB弱はメモリを食ってるようです。
曲一個に10MBということですが、元のファイルは何MBなんでしょうか。圧縮形式は?
で、今の時代、メモリの100MBや200MBは気軽に使っていいと思いますよ。
ロード時間を減らす工夫として、ゲーム進行中に近い将来必要となりそうな画像、音楽を先読みするというのも出来ると思います。
ゲームとは別のスレッドでロードすれば、ゲーム本体の進行は妨げられません。
曲一個に10MBということですが、元のファイルは何MBなんでしょうか。圧縮形式は?
で、今の時代、メモリの100MBや200MBは気軽に使っていいと思いますよ。
ロード時間を減らす工夫として、ゲーム進行中に近い将来必要となりそうな画像、音楽を先読みするというのも出来ると思います。
ゲームとは別のスレッドでロードすれば、ゲーム本体の進行は妨げられません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: メモリの節約の仕方とロード時間の短縮
DXライブラリは事前確保が多いので40MBは標準です。
> ただ実験でわかったんですが、曲一個に10MB以上のメモリを使います。
PlaySoundMemじゃなく PlayMusicではダメですか?
【追記】
PlaySoundFileの方が曲の再生ではメモリが少ないかも? 実験してみてください。
PlayMusicでメモリ消費大の環境があるようです。
> ただ実験でわかったんですが、曲一個に10MB以上のメモリを使います。
PlaySoundMemじゃなく PlayMusicではダメですか?
【追記】
PlaySoundFileの方が曲の再生ではメモリが少ないかも? 実験してみてください。
PlayMusicでメモリ消費大の環境があるようです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: メモリの節約の仕方とロード時間の短縮
(DXライブラリを使ってない話なので参考になるかわかりませんが)
私の作った小さなWin32アプリ(http://dixq.net/forum/viewtopic.php?f=78&t=14198)は
タスクマネージャで見てみるとBGM無しでメモリ使用量が3.8MBなのが
BGM(ファイルサイズ2.7MBのmp3ファイル,ビットレート128kbps, 曲の長さ2:55 ) をMCIで流すと7.2MBになってました.
BGMだけで3.4MBほど増えてます.
再生されるBGMのファイル次第では10MBとか使うのも十分ありえるような気がします.
私の作った小さなWin32アプリ(http://dixq.net/forum/viewtopic.php?f=78&t=14198)は
タスクマネージャで見てみるとBGM無しでメモリ使用量が3.8MBなのが
BGM(ファイルサイズ2.7MBのmp3ファイル,ビットレート128kbps, 曲の長さ2:55 ) をMCIで流すと7.2MBになってました.
BGMだけで3.4MBほど増えてます.
再生されるBGMのファイル次第では10MBとか使うのも十分ありえるような気がします.
オフトピック
DXライブラリ使用+BGM1曲だけで 40MB+10MB 程度だとして,
(その後,画像や音などのリソースを除いたプログラムのメモリ使用量がどの程度増えるのかわからないけれど)
画像については,単純に,640x480のカラー画像のメモリ使用量が1MB程度になるものと考えると
それなりの数の画像を同時に保持する形にしたとしても
最終的には全体で100MB程度に収まったりしないのかな?
(その後,画像や音などのリソースを除いたプログラムのメモリ使用量がどの程度増えるのかわからないけれど)
画像については,単純に,640x480のカラー画像のメモリ使用量が1MB程度になるものと考えると
それなりの数の画像を同時に保持する形にしたとしても
最終的には全体で100MB程度に収まったりしないのかな?
Re: メモリの節約の仕方とロード時間の短縮
結果としていうと、ロード時間は5秒までに収まって、
メモリも200MB弱以下までは減らせました。
メモリは目標に到達していませんが、十分であると見て解決とします。
音楽は新しく流すたびに読み込みました。(一瞬で終わります。)
画像は完全に1つの画像セットのせいでした。
場所合わせが面倒くさいということで作っていた3000*3000ぐらいのほぼ透明処理されたマップ画像を複数読み込んでいたのですが、
この画像自体は大した容量を持たないのですが、
たとえ10KBのスッカスカで大きな画像でも、それ1つで100MB近くのメモリをとっていました。
改善策として、場所合わせの苦労はありましたが、
使う場所だけの小さな画像にしてやり直しました。
ありがとうございました。
メモリも200MB弱以下までは減らせました。
メモリは目標に到達していませんが、十分であると見て解決とします。
音楽は新しく流すたびに読み込みました。(一瞬で終わります。)
画像は完全に1つの画像セットのせいでした。
場所合わせが面倒くさいということで作っていた3000*3000ぐらいのほぼ透明処理されたマップ画像を複数読み込んでいたのですが、
この画像自体は大した容量を持たないのですが、
たとえ10KBのスッカスカで大きな画像でも、それ1つで100MB近くのメモリをとっていました。
改善策として、場所合わせの苦労はありましたが、
使う場所だけの小さな画像にしてやり直しました。
ありがとうございました。