【问题标题】:How to draw a grid of pixels fast with sdl2?如何使用 sdl2 快速绘制像素网格?
【发布时间】:2020-06-14 23:47:42
【问题描述】:

我有以下在窗口上绘制像素网格的函数,我正在使用 sdl。

问题是速度很慢!它使我的程序以 10fps 运行,所以我认为我一定做错了什么。

这是我正在使用的代码

void rayTracing(SDL &sdl) {
  int nx = 1440;
  int ny = 810;

  for (int x = 0; x < nx; x++) {
    for (int y = 0; y < ny; y++) {
      float r = float(x) / float(nx);
      float g = float(y) / float(ny);
      float b = 0.2;
      int ir = int(255.99 * r);
      int ig = int(255.99 * g);
      int ib = int(255.99 * b);

      SDL_SetRenderDrawColor(sdl.renderer.get(), ir, ig, ib, 255);
      SDL_RenderDrawPoint(sdl.renderer.get(), x, ny - y);
    }
  }

  SDL_SetRenderDrawColor(sdl.renderer.get(), 0, 0, 0, 0);
}

也许问题出在我使用 SDL_RenderDrawPoint 的方式上?

【问题讨论】:

  • 您使用的是哪个版本的 SDL?如果可以,请升级到支持 SDL_Renderer 批处理的最新版本之一(2.0.10+?)并通过SDL_HINT_RENDER_BATCHING 提示强制启用它。否则,按颜色对您的点进行分组并使用SDL_RenderDrawPoints()。或者,因为一切都在一个网格中,所以将像素加载到 SDL_Texture 并绘制它。
  • 我会尝试 SDL_HINT_RENDER_BATCHING,而 SDL_RenderDrawPoints 不适用于我的这种情况。我应该如何以高效的方式使用 SDL_Texture?
  • 如果用 OpenGL & shaders 实现会快很多。
  • learnopengl.com 是一个很好的教程。

标签: c++ sdl-2


【解决方案1】:

您最好的选择可能是创建一个单独的渲染纹理,您可以通过指针直接访问它。您进行更改,完成后,调用一次 SDL 纹理更新,它会将您的内存中纹理传输到显示器。

这就是您创建 SDL 纹理的方式

    theTexture = SDL_CreateTexture( theRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, nx, ny );

然后您还可以创建一个内存缓冲区以进行绘制

    uint32_t *textureBuffer = new uint32_t[ nx * ny ];

绘制完成后,您可以像这样一举更新整个纹理

    SDL_UpdateTexture( theTexture , NULL, textureBuffer, nx * sizeof (uint32_t));

此时,绘制一个像素其实就是将各自的 RGB8888 颜色值写入到 textureBuffer 数组中,有点像这样

    textureBuffer[(yPos*nx) + xPos) = 0xFF000000 | (ir<<16) | (ib<<8) | ig;

【讨论】:

  • 可以,只要每个平台都支持您使用的像素格式。如果您不需要完整的 ARGB8888,也可以使用 RGB888 或 RGB565 等。ARGB8888 是我对大多数平台的偏好,因为它使每个像素都成为 32 位条目,允许您优化绘图循环和相应的索引。使用 24 位格式时,您总是会遇到对齐问题等,因为 C/C++ 中不存在原生 24 位数据类型。
  • 谢谢,效果很好。一件事是我的图像现在是颠倒的,我该如何改变它来翻转它?纹理缓冲区[(yPos*nx) + xPos) = 0xFF000000 | (ir
  • 嗯,这很奇怪。它不应该倒置——除非您将 BMP 文件加载到缓冲区中,而缓冲区本身就是倒置存储的。
  • 是的,这是因为我如何渲染光线追踪器,现在我只是反转 y 和它的精细
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2021-03-05
  • 2023-04-07
  • 2012-12-19
  • 2017-12-09
  • 2019-07-27
相关资源
最近更新 更多