Должен ли я перерисовывать SurfaceLayer в каждом кадре?

Я создал простой пример: фоновый поверхностный слой и 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?


person Dmitry Murashenkov    schedule 04.04.2012    source источник


Ответы (1)


Вам не нужно перерисовывать поверхностный слой при каждом вызове функции рисования. Как вы показали, вы рисуете его только при подготовке, а текстура, в которую вы нарисовали, будет рендериться каждый кадр без дальнейших действий с вашей стороны.

Если серверная часть Android и HTML не отрисовывает все ваши поверхностные слои, это должно быть ошибкой. Я попробую воспроизвести ваш тест и посмотреть, сработает ли он для меня.

Одно замечание: создание гигантской поверхности размером с экран и рисование на ней сплошного цвета — это огромная трата текстурной памяти. Просто создайте ImmediateLayer, который вызывает fillRect() для каждого кадра, что намного эффективнее, чем создание массивной текстуры, покрывающей экран.

person samskivert    schedule 04.04.2012
comment
Я добавил тест, подобный вашему, в тесты поверхности PlayN, и они отлично работают на Java, HTML и Android. Так может что-то еще не так? - person samskivert; 05.04.2012
comment
Теперь вот тестовая игра: speedy.sh/Q56mx/test-game.tar.gz Я запускаю его с помощью: mvn clean install mvn test -Ptest-html Затем откройте localhost: 8080 в FF или Chrome - он показывает черный экран с одной белой точкой. Возможно, вы сможете взглянуть на код и быстро найти ошибку? Или поделитесь своим тестом, чтобы я мог решить проблему сам. - person Dmitry Murashenkov; 06.04.2012