我创建了一个简单的例子:背景表面层和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不同吗?
答案 0 :(得分:1)
每次调用绘图时都不需要重绘表面图层。正如您所示,只有在准备时才会绘制它,并且您绘制的纹理将在每一帧中呈现,而无需您采取进一步操作。
如果Android和HTML后端未绘制所有表面图层,则必定存在错误。我会尝试重现你的测试,看看它是否适合我。
一个注意事项:创建一个巨大的表面大小的屏幕,并在其中绘制一个纯色是一个巨大浪费纹理内存。只需创建一个在每个帧上调用fillRect()的ImmediateLayer,这比创建大量屏幕覆盖纹理更有效。