防止透支的技术(OpenGL)

时间:2010-06-30 23:14:24

标签: c++ c opengl

我画了很多半透明多边形。我的场景是2D并使用2f verticies。我无法使用深度缓冲区,因为它不会因为alpha混合而有所帮助。还有哪些其他技术可以减少透支,因为这是因为我使用VBO而使我的应用程序瘫痪,而不是多边形计数。

3 个答案:

答案 0 :(得分:5)

首先,您如何确定透支是您的问题?如果没有关于您正在绘制的内容的更多信息,则很难猜测如何更快地绘制它。一般来说,避免过度抽取的关键是避免抽取任何不需要的东西。因此,如果您有一个2D侧滚动游戏,其中几层背景图像独立滚动以用于视差目的 - 天空,云,山脉,森林远处和森林附近 - 您可能希望避免在任何其他地方绘制天空图层是可见的。因此,如果您知道山脉保证覆盖天空的某个部分,请将天空多边形的形状更改为仅在您希望天空可见的区域中绘制。如果你仍然有问题,可能会为天空制作一个相当高分辨率的网格,它遵循山脉的形状。同样,如果森林层的地平面保证覆盖一定的高度跨度,那么就不要在该区域绘制山脉。

OTOH,在现代视频硬件上,2D场景中的几层透支通常不是什么大不了的事情,所以我仍然有兴趣知道你是如何确定这一点的,如果可能有某种你的仪器和剖析中的偏见可能导致你误入歧途。

答案 1 :(得分:0)

在您的特定场景中,我会考虑将一些图层渲染到OpenGL FBO(静态图层)中。 然后用静态图层合成动态图层

毕竟,如果它是矢量绘图应用程序,则无需在每次用户交互时重绘所有内容。

答案 2 :(得分:0)

如果您绘制的是一个复杂的,多层的背景,该背景会造成垃圾,那么您可以尝试我做的事情。我没有一次将多层绘制到主画布上,而是将它们绘制到了自己的单独画布上(而不是绘制在屏幕上),然后将最终的画布绘制到了屏幕上。它使我的抽搐下降了三分之一以上。

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);
}
相关问题