0

我创建了一个简单的示例:背景表面层和上面的 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 上填充了一个矩形 - 它会永远在这一层上运行,还是应该在每次绘制调用中填充它?如果是 - 这与 ImmeadiateLayer 有什么不同?

4

1 回答 1

1

您不需要在每次调用绘画时重新绘制表面层。正如您所展示的,您仅在准备时才绘制它,并且您绘制的纹理将在每一帧都被渲染,而无需您采取进一步的行动。

如果 Android 和 HTML 后端没有绘制所有的表面层,那么一定有一个错误。我会尝试重现您的测试,看看它是否适合我。

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

于 2012-04-04T21:00:30.270 回答