2016-07-11 5 views
3

グッドイブニング(ヨーロッパから)2Dゲームエンジンゲームオブジェクトをどのように整理できますか?

私はと似た が動作するpythonとpygame
で2Dゲームエンジンを作成しようとしていますが、2Dゲームしか作成できません。
私の問題を説明するために、私はあなたが必要とする私のクラスのいくつかを表示します
私は続行する前に知っている。


私は私のゲームオブジェクトを表し、私たちは気に方法は方法をレンダリングでスプライトというクラスを持っています。このメソッドは、毎秒フレーム と呼ばれ、スプライトオブジェクトのイメージを画面に描画します。 また、別のメソッドの更新が呼び出され、スプライトオブジェクトの一部の文字を上書きして、 ロジックを作成することができます(私はそれをbrains:pと呼んでいます)。また、私はクラスを持っていますシーン私はすべての私のスプライトオブジェクトをリンクリストに格納します。

私のシーンのすべての私のゲームオブジェクトをレンダリングするために、私は上記のアルゴリズムで私のシーンクラス内のメソッドを作成しました:あなたは、これがすべてレンダリングする最も単純な方法で見ることができるように

#obj is a sprite object. 
#Is been called every frame per second. 
for obj in gameobjects: 
    obj.render() 

私のシーンのgameobjects。そして、ここで私の問題が始まるところです。私は、もし私が10.000ゲームの オブジェクトをシーンに持っていると言うなら、これはループのためにフレームを遅らせる問題を引き起こすでしょう。

私が考えた解決策は、 (ウィンドウ枠内にあるgameオブジェクト)が表示できるgameオブジェクトだけをレンダリングすることでした。それはうまく動作します しかし、問題は、私の シーンにあるすべてのゲームオブジェクトをチェックして、ウィンドウの解像度内にして、それらのみをレンダリングしなければならないことです。あなたは、私はまだ私は事を成功しなかったように、すべてのゲームオブジェクトをチェックする必要が見ることができるように

#This method is been called only every time there is a movement 
#action into te game causing all the game objects to change position. 
for obj in all_game_objects: 
    if inside_resolution(obj): 
     render_objects.append(obj) 

#Is been called every frame per second. 
for obj in render_objects: 
    obj.render() 

:だから私はこのような何かをやりました!

ゲームオブジェクトをバイナリツリーのようなデータ構造に整理して、 のゲームオブジェクトのみを返すスマートメソッドを作成すると、高速レンダリングシステムを成功させることができます。

私のゲームのオブジェクトを保存するために使用できるデータ構造は何ですか? ツリーは非常に高速ですが、どのゲームオブジェクトが の画面解像度の中にあるのか、それらをすべて確認することなくどのように知ることができますか? unity3Dのような聞いたことが、現代のゲームエンジンは、(ビューの距離が内に収まるとtheresの)異なるシーンの領域をレンダリング に木を使用しているから、

【選択のものは、これがどのように機能するかです。

私の問題の説明が十分であることを願っています。
あなたのご尽力ありがとうございます:p

+0

クワッドツリーは、どのオブジェクトが空間の特定の部分にあるかを迅速に判断するための比較的一般的な方法です。 –

+1

レンダリング10000オブジェクトを試してみましたが、レンダリングループがアプリケーションの主なボトルネックであることを確実に知っていますか?あなたがしていない場合、これは[未熟な最適化]の別のケースです(http://c2.com/cgi/wiki?PrematureOptimization)。ほとんどのレンダリングライブラリは、10000sのオブジェクトを問題なくレンダリングするのに十分な効率があります。レンダリングループがパフォーマンスのボトルネックを引き起こしていることを完全に**確信している場合は、他の人たちがあなたに手伝ってくれるようにしてください。 – EvilTak

+0

ああ、実際にボトルネックになっている場合は、別のスレッドですべてのレンダリングを行うことができます。実際にあなたがしたことは、実際にパフォーマンスを改善する最も簡単な方法です*もしそれが問題ならば。あなたは**各オブジェクトを繰り返し処理し、その更新メソッドを実行する必要があります。だからこの小切手はどうですか?実際にレンダリングコードをすべて「カメラ」または同様のクラスに移動できます。各オブジェクトは、ビューポートを離れるか入力したときに各カメラに通知できます。このチェックは、レンダリングが呼び出される前に各オブジェクトに対して実行されます。 – EvilTak

答えて

0

グリッドがあなたの全体のシーンを表す2次元グリッドにすべてのオブジェクトを配置します。次に、画面上に表示されているものだけを簡単に反復することができます。衝突検知がより簡単になりました。

セルのサイズはあなた次第です。さまざまなサイズを試してみてください。どちらが最適ですか

関連する問題