8

「ゲームの世界」全体がビューポートの何千倍も広く、scene2d を使用してゲーム オブジェクトをActors として管理したい場合、全世界と同じ幅の Stage オブジェクトを作成する必要がありStageますか、それとも現在の周囲の領域にする必要がありますビューポートではなく全世界ですか?
言い換えると、Stageビューポート サイズの小さな部分にのみオブジェクトをレンダリングしたとしても、幅と高さが大きいほどメモリ自体が消費されますか?

4

2 に答える 2

14

a とは何かを誤解していると思いますStage。ステージ自体には実際にはサイズがありません。幅、高さ、または を指定せずStage、ビューポートの幅と高さのみを指定します。ビューポートは窓のようなもので、世界の一部 (シーン) のみを表示します。AStageは 2D シーン グラフであり、 とともに「成長」しますActors。アクターの数が多いほど、ステージは (メモリに関して) 大きくなりますが、アクターが実際にどれだけ分散しているかには依存しません。それらが非常に広範囲に広がっていて、全体の非常に小さな部分のみを表示する場合、非常Stageに効率的に処理されます。シーン グラフはこの巨大なスペースを細分化して、特定のアクタを無視するか、または無視するかを非常に迅速に決定できるためです。画面に描画します。

つまり、aStageはまさにこの種の状況に必要なものであり、FPS とメモリに関してはおそらく問題はないはずです。しかしもちろんStage、ビューポートの数千倍のサイズがあり、特定のアクタがすぐに表示されないことがわかっている場合は、まだステージに追加しない方がよいかもしれません。

于 2013-10-31T06:30:26.393 に答える
0

ステージは、すべてのアクターを保持するルート ノードにすぎません。その役割は、子のメソッドを呼び出すことです (draw や act など)。したがって、メモリとフレーム レートに影響を与えるのは、アクターの数と複雑さだけです。


あなたの状況では、カリング方法が確かに必要です。最も簡単な方法は、俳優がビューポートにいるかどうかを確認し、そうでない場合は描画をスキップすることです。カスタム アクターを作成し、次のコードを追加します: source

        public void draw (SpriteBatch batch, float parentAlpha) {
            // if this actor is not within the view of the camera we don't draw it.
            if (isCulled()) return;

            // otherwise we draw via the super class method
            super.draw(batch, parentAlpha);
        }    




        Rectangle actorRect = new Rectangle();
        Rectangle camRect = new Rectangle();
        boolean visible;

        private boolean isCulled() {

            // we start by setting the stage coordinates to this
            // actors coordinates which are relative to its parent
            // Group.
            float stageX = getX();
            float stageY = getY();

            // now we go up the hierarchy and add all the parents'
            // coordinates to this actors coordinates. Note that
            // this assumes that neither this actor nor any of its
            // parents are rotated or scaled!
            Actor parent = this.getParent();
            while (parent != null) {
                stageX += parent.getX();
                stageY += parent.getY();
                parent = parent.getParent();
            }

            // now we check if the rectangle of this actor in screen
            // coordinates is in the rectangle spanned by the camera's
            // view. This assumes that the camera has no zoom and is
            // not rotated!
            actorRect.set(stageX, stageY, getWidth(), getHeight());
            camRect.set(camera.position.x - camera.viewportWidth / 2.0f,
                    camera.position.y - camera.viewportHeight / 2.0f,
                    camera.viewportWidth, camera.viewportHeight);
            visible = (camRect.overlaps(actorRect));
            return !visible;
        }


パフォーマンスをさらに改善する必要がある場合は、何が表示され、何が表示されないかを手動で決定するように切り替えることができます (カメラを移動する場合など)。すべてのカリング計算がすべてのフレームで、すべてのアクターに対して実行されるため、これはより高速です。したがって、描画する代わりに何らかの計算を行う方がはるかに高速ですが、多数のアクターが大量の不要な呼び出しを行うことになります。

于 2013-11-18T10:27:56.517 に答える