【问题标题】:Slow pixel per pixel rendering with SDL2's textures使用 SDL2 的纹理进行缓慢的逐像素渲染
【发布时间】:2015-02-05 07:23:57
【问题描述】:

我正在尝试逐像素创建图像并使用 SDL 将其显示在屏幕上。图像必须刷新并再次显示〜每秒 50 次(我正在寻找 50 FPS 游戏)。我尝试创建一个简单的程序来说明我想要做什么:我创建了一个 1280 * 720 的窗口和纹理,我用绿色和红色交替填充。 问题是代码运行速度非常慢(~8 FPS)。我哪里搞砸了?

这是我的代码

  SDL_Texture   *display;
  SDL_Window    *window;
  SDL_Renderer  *renderer;
  int           x;
  int           y;
  int           a = 255;
  int           b = 0;

  window = SDL_CreateWindow(gl_title, SDL_WINDOWPOS_CENTERED,
                            SDL_WINDOWPOS_CENTERED, gl_width, gl_height, 0);
  renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED |
                                           SDL_RENDERER_TARGETTEXTURE |
                                           SDL_RENDERER_PRESENTVSYNC);
  display = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
                              SDL_TEXTUREACCESS_TARGET, gl_width, gl_height);
  while (true)
    {
      SDL_SetRenderTarget(renderer, display);
      SDL_SetRenderDrawColor(renderer, a, b, 0, 255);
      for (x = 0; x < gl_width; ++x)
        {
          for (y = 0; y < gl_height; ++y)
            {
              SDL_RenderDrawPoint(renderer, x, y);
            }
        }
      a = a == 255 ? 0 : 255;
      b = b == 255 ? 0 : 255;
      SDL_SetRenderTarget(renderer, NULL);
      SDL_RenderCopy(renderer, display, NULL, NULL);
      SDL_RenderPresent(renderer);
    }

【问题讨论】:

  • 我知道为时已晚,但如果您将积分保存到数组中并调用SDL_RenderDrawPoints,它会快很多倍。

标签: c sdl sdl-2


【解决方案1】:

对每个像素使用函数在屏幕上绘图会很慢。您可以在循环中手动编写像素,避免每次调用函数的成本,或者使用 SDL 提供的函数之一:

SDL_RenderFillRect

SDL_RenderDrawLines

SDL_RenderDrawPoints

SDL_RenderDrawRect

【讨论】:

  • 由于屏幕上的每个像素都在变化,因此使用此类功能不是一个好主意。我找到的解决方案是使用 SDL_Surface 并直接修改其像素,然后将 ot 转换为纹理并显示它。
  • @BrendanRius 这真的很慢。 SDL_RenderFillRect() 将是最快的方法。
  • 即使是逐像素渲染?
  • 为什么不使用纹理流 (SDL_TEXTUREACCESS_STREAMING)。您可以锁定纹理 - SDL_LockTexture(),修改像素数据,然后解锁它 - SDL_UnlockTexture() 并正常渲染。这消除了每次重新创建纹理的开销,并且效率更高。
猜你喜欢
  • 2021-05-19
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多