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

differences between drawing a line or many points

我正在使用带有 SDL2 引擎的 C++。

我不明白为什么用 width: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 函数的作用相同...

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

Driver function-call 开销。 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()) 通常只是将他们的抽奖结果分配给 driver 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 的排序语义绝对需要时才向 driver 发出实际的 draw-calls。像这样将几何图形和 draw-calls 组合在一起通常会给您 更大的吞吐量。