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

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

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

我不明白为什么绘制一条宽度为 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 函数的作用相同...

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

最佳答案

驱动程序函数调用开销。 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 的排序语义绝对需要时才向驱动程序发出实际的绘制调用。像这样将几何图形和绘制调用一起批处理通常会给您很多更大的吞吐量。

关于c++ - 画一条线或许多点之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49698902/

相关文章:

c++ - 使用 C 或 C++ 编写 Linux shell

c++ - 与线正交的点平移

c++ - 暂停循环直到按下某个键

C++:多行字符串常量中的行尾是否有标准定义?

c++ - 为什么 `const` 指向函数的指针在常量表达式中不可用?

c++ - 在编译时推导整个 vector 空间

c++ - 从 (const) *this 推导的类型用作模板函数模板参数

c++ - 为什么存在用户声明的析构函数时生成移动构造函数?

c++ - std::signal 和 std::raise 线程安全吗?

c++ - 使用另一个 vector 按非递增顺序对一个 vector 进行排序