画一条线或多点之间的区别

man*_*cri 4 c++ c++11 sdl-2 c++14

我在 SDL2 引擎中使用 C++。

我不明白为什么画一条宽度为 10000 的线比循环 10000 次迭代并绘制构成这条线的所有点要快。

画一条线:

SDL_RenderDrawLine(Renderer, 0, 100, 10000, 100);
Run Code Online (Sandbox Code Playgroud)

绘制10000点:

for(unsigned k=0; k<10000; k++) {
    SDL_RenderDrawPoint(Renderer, 0+k, 100);
}
Run Code Online (Sandbox Code Playgroud)

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

我想知道为什么会这样,因为我正在尝试创建一些有关着色器的功能..

gen*_*ult 5

驱动程序函数调用开销。SDL_Renderer(或至少是OpenGL的后端)没有试图一批在一起的多个非s电话(SDL_RenderDrawLine()/ SDL_RenderDrawPoint()/ SDL_RenderDrawRect()/ SDL_RenderFillRect())在一起,它只是调用s与变种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);
}
Run Code Online (Sandbox Code Playgroud)

s功能(SDL_RenderDrawLines()/ SDL_RenderDrawPoints()/ SDL_RenderDrawRects()/ SDL_RenderFillRects())通常只是图示出他们提请司机,然后有

// 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;
}
Run Code Online (Sandbox Code Playgroud)

更复杂的后端可以将几何图形收集到更大的缓冲区中,并且仅在 API 的排序语义绝对需要时才向驱动程序发出实际的绘制调用。配料几何和绘制通话在一起,就像是一般给你多少更大的吞吐量。

  • @DiCri 但 SDL 可以(或不是 GL,但例如 directx 或 metal - 取决于操作系统和环境,但基本思想是相同的)。 (5认同)