メモリの効率の良い使い方。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やっくん

メモリの効率の良い使い方。

#1

投稿記事 by やっくん » 15年前

お久しぶりです。
覚えていられる方が居たら幸いですが、
夏前にRPG作成で困ったとき質問させてもらっていた者です。

夏に入る時にパソコンが壊れてしまい、
ようやく新しいパソコンを購入できたのでまた再開しています。

前にここの方々に色々な本を読むと良いと進められたので、夏はデータ構造とアルゴリズム、C言語の実践的な使い方などが書いてある本を買って大学のパソコンで勉強していました。

そのせいか昔の自分のソースコードを見て、
無駄な部分が多くあるのを知り書き直してる最中です。

ここから質問です。
戦闘で戦う敵のデータを変数に読み込むとします。
画像や数値(ステータス)など。
それを読み込むタイミングはやはり戦う直前に読み込むのがベストでしょうか。
具体的に言うと戦闘を行う関数を呼び出す直前に。
マップ読み込みなども同じように次のマップが現れる直前がベストでしょうか。
そして使い終わったら開放する、と。
それとも確保はゲームの実効時に一括でやってしまうのが良いのでしょうか。

Justy

Re:メモリの効率の良い使い方。

#2

投稿記事 by Justy » 15年前


> それを読み込むタイミングはやはり戦う直前に読み込むのがベストでしょうか

 環境とかデータ量に依ります。
 
・ ゲームの仕様
・ データ全体の規模
・ データが置かれている媒体からの読み込み速度
・ 使える総メモリ
・ 通常時、戦闘時の想定しているメモリ配分
・ 一度読み込んだデータをキャッシュとしてとっておくだけのメモリがあるかどうか、
 あるならその仕組みはどうなのか
・ 各データの使用傾向・頻度

などのバランスをとって決めるべきものなので、そのあたりの情報なしには
「どれがベスト」とは言うことは出来ません。

 まぁ、敵の数値くらいは起動時に読み込んでもいいとは思いますが。


 仮に少し古い PCをターゲットにしたゲームを作るとします。
 
 1匹の敵のデータが 1MBだったとして全部で 10体だった場合、
ゲーム起動時に読んでも 10MBですし起動時に諸諸の初期化の中に紛れるので
ロード時間もさほど気にならない&かからないはずです。
 しかし、1000体いた場合、それだけで 1GBものメモリを消費しますし、読み込む時間も
相当なものになるので現実的ではありません。

 マップ読み込み時にそのマップ上で使われる敵だけを読めばだいぶ軽くはなります。
 それが 10体 20体ならそれで全然問題ないでしょう。
 しかしそれがあるマップで 100体 200体いたらメモリの状況次第では厳しく
なってくるかもしれませんし、ロード時間も気になってくることでしょう
(その場合はマップ分割を検討することになりそうですが)。

 戦闘直前に読めば本当に必要なものしか読み込まないので、無駄はなくなります。
 しかし戦闘は相当回数繰り返すものなので 数秒程度の時間といえどもストレスに
なってしまうかもしれません(某RPGで戦闘毎に結構長いこと待たされたものがあったような)。


 と、このように状況によってどこで読むのがベストなのかは変わってくるので、
そのあたりを検討に入れながら決めればいいのではないでしょうか。

softya

Re:メモリの効率の良い使い方。

#3

投稿記事 by softya » 15年前

ゲーム機の場合はメモリが足らないので毎回読むのが当たり前ですが、パソコンの場合プレイする人がストレス無くプレイ出来てメモリに収まれば最初に全部読んでも構いません。
ただ、最初に全部読むと待たされる時間が長いのであれば必要に応じて読み込んでいって、メモリが足りる限り捨てる必要は無いと思います。長くプレイすればするほど快適になるって寸法です。
パラメータや小さなデータは最初に全部読み込んでおくのが良いと思います(あるいはプログラムに初期値データとして組み込んでおく)。

ゲーム機のゲームでも、スレッド等で常に読み込んでいてシームレスに戦闘に移れるゲームもありますので、ストレスの無いゲームのデータを読み込んでいるタイミングを調べてみるのも良いかもしれません。PS2あたりならシーク音などで読み込んでいることが分かりますよね。

やっくん

Re:メモリの効率の良い使い方。

#4

投稿記事 by やっくん » 15年前

Justyさん、softyaさん
レスポンスありがとうございます。

ゲーム機のロードの話で置き換えるとしっくりきました。
パターン認識をするために大量の画像処理をC言語を用い最近やることがあったため、今回の件も疑問に浮かんだのですが、すっきりしました。
3000枚の28×28ピクセルの白黒画像を読み込み、その値を処理し、他の画像と比較し、出力する。
というような内容なのですが、Justyさん、softyaさんから教わったことを利用すればこっちの方も効率を上げれそうです。

閉鎖

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