STGでの、オブジェクトの確保方法

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

STGでの、オブジェクトの確保方法

#1

投稿記事 by YYSS » 7年前

~開発環境~
 Windows 7 Ultimate SP1 64bit
 Visual C++ 2010
 DXライブラリ

オブジェクトの確保の仕方について、今まではソフト起動時に一括確保していたのですが、
龍神録のソースを参考にしていたところ、オブジェクトが必要になった時にnewで確保し、必要なくなったらdeleteで解放(間違っていたらすみません)
していたので、効率としてはそのほうが良いのでしょうか?

メモリリークが怖いのでnewは避けていたのですが、
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
というメモリリークの発生を確認できる関数があるのを知ってからnewを使ってみたくなったのが現状です。

私の考えとしては、
静的確保
・deleteしなくてもいいのでメモリリークを防げる
・起動時に大量のメモリ領域を確保するが、最近のPCは1GBくらい積んでることが多いから大丈夫?
・初期化のタイミングが分からないのがネック
・オブジェクトを配列で管理した場合、空きを探す手間がある

動的確保
・メモリリークのリスク
・コンストラクタを有効に活用できそう
・オブジェクトの空きを探す手間は無いが、動的に確保するときの処理時間はどうか?
・newによる動的確保は処理が遅いと聞いた事があります、STGのように1フレームが重要なゲームの場合どうか?


今はこんな感じです。

コード:

const int BULLET_MAX	= 1000;

class C_Bullet;		//	弾オブジェクトのクラス

class C_ObjBase{

private:
	C_Bullet m_Obj[ BULLET_MAX ];


・・・・その他関数


};
新しく考えたのが

コード:

const int BULLET_MAX	= 1000;

class C_Bullet;		//	弾オブジェクトのクラス

class C_ObjBase{

private:
	std::list<*C_Bullet> m_Obj;		//	リストに追加したほうが効率的?

public:
	void *CreateBullet(){
	
		//最大数を越えてたらつくらない
		if( m_Obj.size < BULLET_MAX ){
		
			C_Bullet *bullet	= new C_Bullet;
			m_Obj.push_back( bullet );
		}
		else{
			//オーバーフローをしらせる
			・・・
		}
	}
・・・・その他関数
};

どちらがいい?・・・と聞いても人によって考え方は違うと思いますが、何かしら意見を下さると幸いです。

また、STGを作ってる方は「私は動的に確保してますよ」、「違う方法で確保してます」など、
どうやっているかを教えてくださると幸いです。

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

Re: STGでの、オブジェクトの確保方法

#2

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

newではなくvectorじゃダメですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nil
記事: 428
登録日時: 8年前

Re: STGでの、オブジェクトの確保方法

#3

投稿記事 by nil » 7年前

新しい方の14行目、
設定した数以上オブジェクトを確保しない、ですが、

listでは配列と違って確保できるオブジェクトの数に制限がありません。
する必要も特にはなく、メモリ不足になったとき程度でしょうが、
今のパソコンなら少なくとも2GB~4GBは積んでいるでしょうし大丈夫でしょう。

動的確保はそれなりに時間がかかり、CPUが弱ければ処理落ちをするでしょうが、
逆にi5以上程度の性能のCPUであればサクサクと動いてくれるでしょう。

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: STGでの、オブジェクトの確保方法

#4

投稿記事 by h2so5 » 7年前

YYSS さんが書きました: 静的確保
・deleteしなくてもいいのでメモリリークを防げる
・起動時に大量のメモリ領域を確保するが、最近のPCは1GBくらい積んでることが多いから大丈夫?
・初期化のタイミングが分からないのがネック
・オブジェクトを配列で管理した場合、空きを探す手間がある
これは静的確保ではなくて静的変数の特徴ではないですか?
ローカル変数については2番目と3番目は当てはまりません。
(スタック上の変数が静的確保に当てはまるのかは分かりませんが)
YYSS さんが書きました: また、STGを作ってる方は「私は動的に確保してますよ」、「違う方法で確保してます」など、
どうやっているかを教えてくださると幸いです。
自分は基本的にSTLコンテナとスマートポインタの組み合わせで管理しています。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: STGでの、オブジェクトの確保方法

#5

投稿記事 by ISLe » 7年前

newをオーバーライドすれば、あらかじめ一括で確保しておいたメモリを要求に応じてオブジェクトひとつずつ割り振る、ということもできますけど。

newのデフォルト実装ではありますが、遅いのはメモリの動的確保であってnewの呼び出しではありません。

アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

Re: STGでの、オブジェクトの確保方法

#6

投稿記事 by YYSS » 7年前

色々な意見をありがとうございます。
下手にnew使うよりSTLコンテナを使ったほうが安全で良さそうな気がしてきました。

とりあえず、vectorを使う場合でも、メモリを動的に確保するから処理速度的にはどうだろう、
と思ったのですが、あらかじめ最低限必要な分をreserveで確保しておけば、メモリ確保処理に掛かる時間は多少緩和されるのでしょうか?

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: STGでの、オブジェクトの確保方法

#7

投稿記事 by Dixq (管理人) » 7年前

最近のPCではメモリの動的確保を気にする必要はないのではないかと思ってます。
こちらに、最近C++とJavaでDXライブラリを使用した時のパフォーマンス比較を行ったデータを置いています。
http://dixq.net/forum/blog.php?u=53&b=3266
C++もJavaも、7万個程度弾を描画して初めて処理落ちしました。(この辺はPCスペックによりますが)
その処理時間も、計算:描画=1:4で、ほとんどが描画にかかっています。
"計算"は描画以外のほぼ全ての処理が含まれますから、メモリ確保、解放にかかっている時間は、全体の割合からするとかなり少ないと思われます。

ちなみに、このデータはSTLのlistに必要な時Bulletをnewして突っ込み、画面から出たらdeleteして消しています。

アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

Re: STGでの、オブジェクトの確保方法

#8

投稿記事 by YYSS » 7年前

Dixq (管理人) さんが書きました:最近のPCではメモリの動的確保を気にする必要はないのではないかと思ってます。
"計算"は描画以外のほぼ全ての処理が含まれますから、メモリ確保、解放にかかっている時間は、全体の割合からするとかなり少ないと思われます。
参考になりました。
呼んでた参考書も、初版が昔の本だったので、当時は動的確保に時間が掛かってたのかもしれませんが、
最近は気にするほどではないみたいですね。

ありがとうございます。

閉鎖

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