Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 防止透支的技术(OpenGL)_C++_C_Opengl - Fatal编程技术网

C++ 防止透支的技术(OpenGL)

C++ 防止透支的技术(OpenGL),c++,c,opengl,C++,C,Opengl,我正在画很多半透明的多边形。我的场景是2D,使用2f垂直。我不能使用深度缓冲区,因为它不会帮助,因为阿尔法混合。由于这是我的应用程序的障碍,而不是由于我使用VBO而导致的多边形计数,因此有哪些其他技术可以减少透支。首先,您是如何确定透支是您的问题的?如果没有更多关于你到底在画什么的信息,很难猜测如何画得更快。一般来说,避免过度绘制的关键是避免绘制任何不需要的内容。因此,如果您有一个二维侧滚动游戏,其中有几个背景图像独立滚动,以达到视差的目的——天空、云层、山脉、森林远和森林附近——您将希望避免在

我正在画很多半透明的多边形。我的场景是2D,使用2f垂直。我不能使用深度缓冲区,因为它不会帮助,因为阿尔法混合。由于这是我的应用程序的障碍,而不是由于我使用VBO而导致的多边形计数,因此有哪些其他技术可以减少透支。首先,您是如何确定透支是您的问题的?如果没有更多关于你到底在画什么的信息,很难猜测如何画得更快。一般来说,避免过度绘制的关键是避免绘制任何不需要的内容。因此,如果您有一个二维侧滚动游戏,其中有几个背景图像独立滚动,以达到视差的目的——天空、云层、山脉、森林远和森林附近——您将希望避免在任何其他层可见的地方绘制天空。因此,如果您知道山脉一定会覆盖天空的某一部分,请更改天空多边形的形状,使其仅在希望天空可见的区域中绘制。如果仍然存在问题,可以为天空制作一个相当高分辨率的网格,该网格遵循山脉的形状。同样,如果森林层的地平面保证覆盖一定的高度跨度,那么就不会在该区域绘制山脉


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

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


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

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


毕竟,如果它是一个矢量绘图应用程序,你不需要在每个用户交互中重新绘制所有的东西。

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


毕竟,如果它是一个矢量绘图应用程序,您不需要在每次用户交互时都重新绘制所有内容。

如果您正在绘制导致jank的复杂多层背景,那么您可以尝试我所做的。我没有一次一个地将多层绘制到主画布上,而是将它们绘制到各自独立的画布上(而不是屏幕上),然后将最终确定的画布绘制到屏幕上。它使我的jank下降了三分之一多

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);
}
private final Rect;
私有最终位图;
私人最终画布;
公共背景()
{
rect=新的rect(0,0,屏幕宽度,屏幕高度);
bitmap=bitmap.createBitmap(rect.width()、rect.height()、bitmap.Config.ARGB_8888)
画布=新画布(位图);
}
公共作废图纸(最终画布g)
{
对于(int i=0;i<8;i++)
{
牵引地面(i);
}
g、 drawBitmap(位图,0,0,null);
}
私人无效退税地(最终int i)
{
drawBitmap(背景[i],xPos[i],0,空);
drawBitmap(背景[i],xPos[i]+background[i].getWidth(),0,null);
}

如果你正在绘制一个复杂的多层背景,导致jank,那么你可以试试我所做的。我没有一次一个地将多层绘制到主画布上,而是将它们绘制到各自独立的画布上(而不是屏幕上),然后将最终确定的画布绘制到屏幕上。它使我的jank下降了三分之一多

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);
}
private final Rect;
私有最终位图;
私人最终画布;
公共背景()
{
rect=新的rect(0,0,屏幕宽度,屏幕高度);
bitmap=bitmap.createBitmap(rect.width()、rect.height()、bitmap.Config.ARGB_8888)
画布=新画布(位图);
}
公共作废图纸(最终画布g)
{
对于(int i=0;i<8;i++)
{
牵引地面(i);
}
g、 drawBitmap(位图,0,0,null);
}
私人无效退税地(最终int i)
{
drawBitmap(背景[i],xPos[i],0,空);
drawBitmap(背景[i],xPos[i]+background[i].getWidth(),0,null);
}

您所说的“透支”到底是什么意思?仅仅因为你使用VBO并不意味着你不能一次渲染太多。@Jon Cage:基本上,在渲染场景时多次绘制相同的像素。在使用半透明多边形时,有些透支是必要的,但我很确定你可以前后排列多边形,然后使用一些模板魔法,在你已经绘制了一些次像素之后,不绘制到像素。我的意思是,如果我绘制一个50x50的正方形数组,它不会延迟,但50x50的正方形是1