【问题标题】:differences between drawing a line or many points绘制一条线或许多点之间的差异
【发布时间】:2018-04-06 18:22:40
【问题描述】:

我正在使用带有 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_RenderDrawPoints(末尾带有s)。我无法回答您的问题,因为我根本不知道为什么它很慢,但我的假设是在每次绘制调用的开始和/或结束时都会发生一些非常昂贵的操作。
  • @GarrettGutierrez 我也这么认为。这让我很难过
  • 就像我说的,这可以通过将要渲染的点推送到内存的连续部分,然后在指向第一个点的指针上使用 SDL_RenderDrawPoints 来完全避免。
  • @GarrettGutierrez 好的,但我应该每帧推点 10000 次。这么慢吗?
  • @DiCri 如果我们谈论的是硬件加速渲染,每次绘图调用都会在内存压力和驱动程序/GPU 处理上产生开销——这就是为什么一次调用绘制 100 万个三角形比一次调用快得多的原因100万抽奖。除此之外 - 渲染器具有大量的并行性,并且仅绘制一个点,例如最佳情况的执行单元的 1/64(例如)。绘制线条也很昂贵(与三角形相比),但个别点只会影响性能。

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


【解决方案1】:

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

【讨论】:

  • 我的程序中没有使用 OpenGL
  • @DiCri 但 SDL 可以(或者不是 GL,而是例如 directx 或 metal - 取决于操作系统和环境,但基本思想是相同的)。
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 2019-08-15
  • 2018-03-30
  • 2020-10-19
  • 2014-03-20
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
相关资源
最近更新 更多