Методы предотвращения перерасхода (OpenGL) - PullRequest
1 голос
/ 01 июля 2010

Я рисую много полупрозрачных полигонов. Моя сцена 2D и использует 2f вершин. Я не могу использовать буфер глубины, так как он не поможет из-за альфа-смешения. Каковы некоторые другие методы, чтобы уменьшить перерасход, поскольку это то, что наносит вред моему приложению, а не количество полигонов, поскольку я использую VBO.

Ответы [ 3 ]

5 голосов
/ 01 июля 2010

Прежде всего, как вы определили, что овердрейт - это ваша проблема?Без дополнительной информации о том, что именно вы рисуете, довольно сложно догадаться, как нарисовать это быстрее.Говоря в целом, ключ к тому, чтобы избежать перерисовки, состоит в том, чтобы избегать рисования чего-либо, что не требуется.Таким образом, если у вас есть 2D-игра с боковой прокруткой с несколькими слоями фоновой прокрутки независимо друг от друга для целей параллакса - неба, облаков, гор, далеких лесов и близлежащих лесов - вам не следует рисовать небо везде, где есть другиеслои видны.Итак, если вы знаете, что горы гарантированно покрывают определенную часть неба, измените форму вашего неба, чтобы рисовать только в тех областях, где вы ожидаете, что небо будет видимым.Потенциально, сделайте сетку с достаточно высоким разрешением для неба, которая повторяет форму гор, если у вас все еще есть проблема.Точно так же, если наземная плоскость лесных слоев гарантированно покрывает определенный диапазон высот, тогда не рисуйте горы в этой области.

OTOH, на современном видеооборудовании несколько слоев overdrawв 2D-сцене это обычно не так уж и сложно, поэтому мне все еще интересно знать, как именно вы это определили, и может ли быть какая-то предвзятость в ваших инструментах и ​​профилировании, которая может сбить вас с толку.

0 голосов
/ 18 ноября 2018

Если вы рисуете сложный, многослойный фон, который вызывает рывок, то вы можете попробовать то, что я сделал. Вместо того, чтобы рисовать несколько слоев по одному основному холсту, я рисовал их на отдельном холсте (не на экране), а затем перетаскивал этот завершенный холст на экран. Это упало на мой хвост более чем на треть.

private final Rect rect;
private final Bitmap bitmap;
private final Canvas canvas;

public Background()
{
    rect = new Rect(0, 0, screenWidth, screenHeight);
    bitmap = Bitmap.createBitmap(rect.width(), rect.height(), Bitmap.Config.ARGB_8888)
    canvas = new Canvas(bitmap);
}

public void draw(final Canvas g)
{
    for (int i = 0; i < 8; i++)
    {
        drawBackground(i);
    }
    g.drawBitmap(bitmap, 0, 0, null);
}

private void drawBackground(final int i)
{
    canvas.drawBitmap(background[i], xPos[i], 0, null);
    canvas.drawBitmap(background[i], xPos[i] + background[i].getWidth(), 0, null);
}
0 голосов
/ 01 июля 2010

В вашем конкретном сценарии я хотел бы рассмотреть рендеринг некоторого пакета слоев в FBO OpenGL (статические).Затем наложение динамических слоев на статические и т. Д.

В конце концов, если это приложение для векторного рисования, вам не нужно перерисовывать все при каждом взаимодействии с пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...