【发布时间】: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(例如)。绘制线条也很昂贵(与三角形相比),但个别点只会影响性能。