如何用sdl2快速绘制像素网格?

问题描述 投票:0回答:1

我有一个在窗口上绘制像素网格的函数,我使用的是sdl。

问题是,这是非常慢的!它使我的程序以10fps的速度运行,所以我使用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的方式有问题?

c++ sdl-2
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.