画线或多点之间的差异

时间:2018-04-06 18:22:40

标签: c++ c++11 c++14 sdl-2

我使用C ++和SDL2引擎。

我不明白为什么用宽度绘制一条线:10000比制作10000次迭代的循环更快并绘制构成该线的所有点。

画一条线:

SDL_RenderDrawLine(Renderer, 0, 100, 10000, 100);

绘制10000点:

for(unsigned k=0; k<10000; k++) {
    SDL_RenderDrawPoint(Renderer, 0+k, 100);
}

为什么绘制所有点会导致程序性能下降? 我认为draw_line函数做同样的事情......

我想知道为什么会这样,因为我试图创建一些关于着色器的函数..

1 个答案:

答案 0 :(得分:4)

驱动程序功能 - 调用开销。 SDL_Renderer(或至少是OpenGL后端)不会尝试将多个非s次呼叫(SDL_RenderDrawLine() / SDL_RenderDrawPoint() / SDL_RenderDrawRect() / SDL_RenderFillRect())一起批处理,它只是calls the s variants with count = 1

// src/render/SDL_render.c#l1558
int
SDL_RenderDrawPoint(SDL_Renderer * renderer, int x, int y)
{
    SDL_Point point;

    point.x = x;
    point.y = y;
    return SDL_RenderDrawPoints(renderer, &point, 1);
}

s函数(SDL_RenderDrawLines() / SDL_RenderDrawPoints() / SDL_RenderDrawRects() / SDL_RenderFillRects())通常只会将其抽奖信息展示给驱动程序right then and there

// src/render/opengl/SDL_render_gl.c#l1220
static int
GL_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points,
                    int count)
{
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
    int i;

    GL_SetDrawingState(renderer);

    data->glBegin(GL_POINTS);
    for (i = 0; i < count; ++i) {
        data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y);
    }
    data->glEnd();

    return 0;
}

更复杂的后端可以将几何体收集到更大的缓冲区中,并且只有在API的排序语义绝对需要时才向驱动程序发出实际的绘制调用。将几何体和绘制调用一起批处理通常可以为您提供更多更大的吞吐量。