0

簡単な例を作成しました: 背景の表面レイヤーとその上の 10 個の小さな「ドット」(それぞれが fillRect() を介して色で塗りつぶされた 10x10 ピクセルの 10 個の表面レイヤー)。Paint メソッドは、ドットを定期的に移動するだけです。

private SurfaceLayer background;
private List<Layer> dots = new ArrayList<Layer>();

@Override
public void init()
{
    background = graphics().createSurfaceLayer(graphics().width(), graphics().height());
    background.surface().setFillColor(Color.rgb(100, 100, 100));
    background.surface().fillRect(0, 0, graphics().width(), graphics().height());
    graphics().rootLayer().add(background);

    for (int i = 0; i < 10; i++)
    {
        SurfaceLayer dot = graphics().createSurfaceLayer(10, 10);
        dot.surface().clear();
        dot.surface().setFillColor(Color.rgb(250, 250, 250));
        dot.surface().fillRect(0, 0, 10, 10);
        dot.setDepth(1);
        dot.setTranslation(random()*graphics().width(), random()*graphics().height());
        dots.add(dot);

        graphics().rootLayer().add(dot);
    }
}

@Override
public void paint(float alpha)
{
    for (Layer dot : dots)
    {
        if (random() > 0.999)
        {
            dot.setTranslation(random()*graphics().width(), random()*graphics().height());
        }
    }
}

どういうわけか、Javaバージョンはすべてのドットを描画しますが、htmlおよびAndroidバージョンは1つしか描画しません.

マニュアルには、すべての paint() 呼び出しでこれらすべてのドットを再描画する必要があるかどうかが明確に記載されていません。そして、私が理解している限り、SurfaceLayer は、すべてのフレームでレイヤーを変更しない場合 (同じバッファーを再利用できますか?) を対象としていますが、これは機能しません。

では、SurfaceLayer の正しい使い方を教えていただけませんか? SurfaceLayer で四角形を塗りつぶしただけの場合、このレイヤーで永遠にラミンになりますか、それとも各ペイント呼び出しで塗りつぶす必要がありますか? はいの場合 - これは ImmadiateLayer とは異なりますか?

4

1 に答える 1

1

ペイントを呼び出すたびに表面レイヤーを再描画する必要はありません。あなたが示したように、それを準備するときにのみ描画し、描画したテクスチャは、あなたの側でそれ以上のアクションなしですべてのフレームにレンダリングされます.

Android と HTML バックエンドがすべてのサーフェス レイヤーを描画していない場合は、バグがあるはずです。あなたのテストを再現して、それがうまくいくかどうかを確認します。

1 つの注意点: 画面サイズの巨大なサーフェスを作成し、そこに単色を描画すると、テクスチャ メモリが大量に浪費されます。すべてのフレームで fillRect() を呼び出す ImmediateLayer を作成するだけです。これは、画面を覆う巨大なテクスチャを作成するよりもはるかに効率的です。

于 2012-04-04T21:00:30.270 に答える