我应该在每一帧上重新绘制SurfaceLayer吗?

时间:2012-04-04 06:20:01

标签: playn

我创建了一个简单的例子:背景表面层和10个小“点”(10个表面层10x10像素,每个通过fillRect()填充颜色)。 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上填充一个矩形 - 它会永久地在这一层上进行ramin还是应该在每个绘制调用中填充它?如果是 - 这与ImmeadiateLayer不同吗?

1 个答案:

答案 0 :(得分:1)

每次调用绘图时都不需要重绘表面图层。正如您所示,只有在准备时才会绘制它,并且您绘制的纹理将在每一帧中呈现,而无需您采取进一步操作。

如果Android和HTML后端未绘制所有表面图层,则必定存在错误。我会尝试重现你的测试,看看它是否适合我。

一个注意事项:创建一个巨大的表面大小的屏幕,并在其中绘制一个纯色是一个巨大浪费纹理内存。只需创建一个在每个帧上调用fillRect()的ImmediateLayer,这比创建大量屏幕覆盖纹理更有效。