画一条线或许多点之间的区别
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 组合在一起通常会给您 多 更大的吞吐量。
我正在使用带有 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 组合在一起通常会给您 多 更大的吞吐量。