- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用带有 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/
我想以 headless 模式(屏幕上根本没有 GUI)将 JPanel 绘制到 BufferedImage 中。 final JPanel panel = createPanel(); panel.
我是 Canvas 的新手,正在尝试创建看起来逼真的 float 粒子动画。 目前,我正在创建 400 个随机散布在 400x400 Canvas 上的粒子。 然后,在每个 requestAnimat
有没有办法在悬停时停止悬 float 画? :hover 这是一个显示动画的链接: https://codepen.io/youbiteme/pen/RprPrN 最佳答案 只需为您的 svg 悬停添
我想在谷歌地图上绘制覆盖图,其中除了特定点周围 1.5 公里半径以外的所有内容都被遮蔽了。为此,我尝试使用带有大量边框的圆圈,所以我会在边框中放置透明中心和覆盖颜色来实现这一点,但它无法渲染。
我正在尝试通过扩展类 UIView 来创建自定义 View ,该类可以在自定义 View 的中心显示一个圆圈。为了添加自定义绘图,我重写了 draw(_ rect: CGRect) 方法,如下所示。
我是一名优秀的程序员,十分优秀!