gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:51:32 25 4
gpt4 key购买 nike

我正在使用带有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com