オブジェクトに生成について
オブジェクトに生成について
最近、オブジェクト指向について勉強しているのですが、
勉強といっても「C++で学ぶオブジェクト指向プログラミング」 湯田幸八 著
を読んでみた程度ですが、
オブジェクト指向で「勇者のくせになまいきだ」というソフトを、
部分的に再現してみようかなと思っているのですが、
このゲームは味方が100体以上になることもあるのですが
この場合、
味方を1つのオブジェクトとすると、100体味方を召喚すると、
100体分オブジェクトを生成するのでしょうか?
なんだかデータが膨大になってしまいそうな気がするのですが、
勉強といっても「C++で学ぶオブジェクト指向プログラミング」 湯田幸八 著
を読んでみた程度ですが、
オブジェクト指向で「勇者のくせになまいきだ」というソフトを、
部分的に再現してみようかなと思っているのですが、
このゲームは味方が100体以上になることもあるのですが
この場合、
味方を1つのオブジェクトとすると、100体味方を召喚すると、
100体分オブジェクトを生成するのでしょうか?
なんだかデータが膨大になってしまいそうな気がするのですが、
Re:オブジェクトに生成について
>味方を1つのオブジェクトとすると、100体味方を召喚すると、
>100体分オブジェクトを生成するのでしょうか?
そうです。
>なんだかデータが膨大になってしまいそうな気がするのですが
100体でデータが膨大過ぎるというのであれば、体数を減らすか
1体あたりのデータ量を減らすしかないかと。
・・・って 100体くらいでそんな膨大になるのでしょうか?
Re:オブジェクトに生成について
実際は分からないので、適当に考えてみたのですが、
データメンバ
画像、体力、攻撃力、フラグ数種
メンバ関数
攻撃、移動、体力管理、描画
あ、書き出したら結構少ないですね。
まぁ、かなり適当ですが、
数の問題はどうにかなるようですね。
では、味方オブジェクトは
最初から味方の最大数まで生成しておき召喚するたびに空いているオブジェクトに割り当てるのか、
それとも
召喚するたびにオブジェクトを生成するのか、
どちらがいいでしょうか?
私的には後者が良いと思うんですが、
データメンバ
画像、体力、攻撃力、フラグ数種
メンバ関数
攻撃、移動、体力管理、描画
あ、書き出したら結構少ないですね。
まぁ、かなり適当ですが、
数の問題はどうにかなるようですね。
では、味方オブジェクトは
最初から味方の最大数まで生成しておき召喚するたびに空いているオブジェクトに割り当てるのか、
それとも
召喚するたびにオブジェクトを生成するのか、
どちらがいいでしょうか?
私的には後者が良いと思うんですが、
Re:オブジェクトに生成について
> 最初から味方の最大数まで生成しておき召喚するたびに空いているオブジェクトに割り当てるのか、
> それとも
> 召喚するたびにオブジェクトを生成するのか、
> どちらがいいでしょうか?
速度とメモリ管理の簡略化のどちらをとるかです。
基本的に,newは重い処理なので,速度が出ないのであればnewを削る方向になると思います。
で,100程度のオブジェクトであれば,std::vector<T>で管理してしまって問題ないと思います。
おそらく,capacityが128まで大きくなって,あとはそのままになると思います。
# つまり,メモリアロケートが発生しない。
> それとも
> 召喚するたびにオブジェクトを生成するのか、
> どちらがいいでしょうか?
速度とメモリ管理の簡略化のどちらをとるかです。
基本的に,newは重い処理なので,速度が出ないのであればnewを削る方向になると思います。
で,100程度のオブジェクトであれば,std::vector<T>で管理してしまって問題ないと思います。
おそらく,capacityが128まで大きくなって,あとはそのままになると思います。
# つまり,メモリアロケートが発生しない。
Re:オブジェクトに生成について
「勇者のくせに生意気だ」というゲームが何なのかは知りませんが、
ここは敵の数が100固定ではないと思うので、
可変配列vectorを使ってみてはどうでしょう。
気になさっていた膨大なデータも最小限にできると思います。
確かvectorのメンバ関数にreserveやresize等があったはずです。
これで敵データの個数ぴったし分だけ簡単かつ動的に用意できます。
もし、vectorの使い方が分からないようであれば、
http://www.cppll.jp/cppreference/
を参照するといいと思います。
ここは敵の数が100固定ではないと思うので、
可変配列vectorを使ってみてはどうでしょう。
気になさっていた膨大なデータも最小限にできると思います。
確かvectorのメンバ関数にreserveやresize等があったはずです。
これで敵データの個数ぴったし分だけ簡単かつ動的に用意できます。
もし、vectorの使い方が分からないようであれば、
http://www.cppll.jp/cppreference/
を参照するといいと思います。
Re:オブジェクトに生成について
最大数が高々数百程度であれば、その都度デフォルトのnewで割り付けるより、その分のメモリを事前に用意しておいて、メモリプールを作る方がよいでしょう。
その際、std::vectorでもよいですが、operator newを多重定義した方が利便性が高いと思います。
その際、std::vectorでもよいですが、operator newを多重定義した方が利便性が高いと思います。
Re:オブジェクトに生成について
>最初から味方の最大数まで生成しておき召喚するたびに空いているオブジェクトに割り当てるのか、
>それとも召喚するたびにオブジェクトを生成するのか、どちらがいいでしょうか?
基本的には、後者でいいと思います。
前者も有りといえば有りですが、味方オブジェクトが1種類(1クラス)で
なくなった場合、その分の空いているオブジェクトリストが必要になってしまうかも
しれません。
Re:オブジェクトに生成について
vectorを使う場合
コンテナについては、ほとんど知らないのですが、
自分はコンテナは関数付きの配列みたいなものと思ってたんですが、
コンテナの要素として、味方オブジェクトを召喚するたびに入れていくと言うことですか?
コンテナについては、ほとんど知らないのですが、
自分はコンテナは関数付きの配列みたいなものと思ってたんですが、
コンテナの要素として、味方オブジェクトを召喚するたびに入れていくと言うことですか?
Re:オブジェクトに生成について
そのゲームのことは何も知りませんが、
味方が100人も出るのですか?!!
同時に出ないのであれば100人分を確保する必要はないと思いますが、
出てくる味方のみのオブジェクト生成→描画→破棄 でいいのでは??
味方が100人も出るのですか?!!
同時に出ないのであれば100人分を確保する必要はないと思いますが、
出てくる味方のみのオブジェクト生成→描画→破棄 でいいのでは??
Re:オブジェクトに生成について
> 勇者のくせになまいきだ
紹介ページ
http://watch.impress.co.jp/game%2Fdocs/ ... 7/nama.htm
絵が(わざと)ファミコンレベルなんだけど、ゲームシステムが秀逸で結構面白ですよ。
紹介ページ
http://watch.impress.co.jp/game%2Fdocs/ ... 7/nama.htm
絵が(わざと)ファミコンレベルなんだけど、ゲームシステムが秀逸で結構面白ですよ。
Re:オブジェクトに生成について
どこかのフリーゲームかと思いきや PSPですか、プレイできませんねorz
スクリンショットを見ただけですが、
モンスターサイドのゲームということで中々面白そうです。
とりあえずは上限100でしたら、100体のオブジェクトを生成して描画してみてはどうでしょうか。
それで重ければ、また次の方法を考えればよろしいかと思います。
スクリンショットを見ただけですが、
モンスターサイドのゲームということで中々面白そうです。
とりあえずは上限100でしたら、100体のオブジェクトを生成して描画してみてはどうでしょうか。
それで重ければ、また次の方法を考えればよろしいかと思います。
Re:オブジェクトに生成について
あるいは、100体作っておいて足りなくなったらnewする、とか
生成のタイミングが頻繁なら、予め確保したほうが良さそうですね。
間が開くなら1つずつ動的確保の方がループ数の削減になりますね。
もしくは、配列のフラグ検索でループ数を食わないように
・配列の要素を消したら、最後尾の要素を消した部分にコピー
・有効な要素数をカウンタとして保存
みたいなことをすればちょっとは節約になったり・・・笑
生成のタイミングが頻繁なら、予め確保したほうが良さそうですね。
間が開くなら1つずつ動的確保の方がループ数の削減になりますね。
もしくは、配列のフラグ検索でループ数を食わないように
・配列の要素を消したら、最後尾の要素を消した部分にコピー
・有効な要素数をカウンタとして保存
みたいなことをすればちょっとは節約になったり・・・笑
Re:オブジェクトに生成について
たくさんの意見ありがとうございます。
とりあえず、オブジェクトを作ってどの程度の処理速度になるか等、
実験的なプログラムを組んで模索していきたいと思います。
こんなふわふわした質問にも答えていただき、
ありがとうございました。
とりあえず、オブジェクトを作ってどの程度の処理速度になるか等、
実験的なプログラムを組んで模索していきたいと思います。
こんなふわふわした質問にも答えていただき、
ありがとうございました。