SDL渲染太慢了

时间:2015-04-20 21:22:13

标签: c++ sdl sdl-2

我是C ++和SDL的初学者,我在一些教程之后慢慢写一个小游戏来学习一些概念。

我遇到了问题:我的渲染似乎真的慢。 我使用PerformanceCounters来计算我的循环,无论是否有渲染功能。没有它,我每帧得到0~2毫秒;当我添加渲染时,每帧最多可达65毫秒。

有人能告诉我渲染功能有什么问题吗?

SDL_Texture *texture;

...

// gets called by the main loop
void render(int x_offset, int y_offset)
{
  if (texture)
  {
    SDL_DestroyTexture(texture);
  }

  texture = SDL_CreateTexture(renderer,
      SDL_PIXELFORMAT_ARGB8888,
      SDL_TEXTUREACCESS_STREAMING,
      texture_w,
      texture_h);

  if (SDL_LockTexture(texture, NULL, &pixel_memory, &pitch) < 0) {
    printf("Oops! %s\n", SDL_GetError());
  }

  Uint32 *pixel;
  Uint8 *row = (Uint8 *) pixel_memory;

  for (int j = 0; j < texture_h; ++j) {
    pixel = (Uint32 *)((Uint8 *) pixel_memory + j * pitch);
    for (int i = 0; i < texture_w; ++i) {

      Uint8 alpha = 255;
      Uint8 red = 172;
      Uint8 green = 0;
      Uint8 blue = 255;

     *pixel++ = ((alpha << 24) | (red << 16) | (green << 8) | (blue));

    }
  }
  SDL_UnlockTexture(texture);
} 

3 个答案:

答案 0 :(得分:5)

它可能很慢,因为你在每一帧都在破坏和创建纹理,锁定纹理/上传像素数据并不是非常快,但我怀疑它是这里的瓶颈。我强烈建议在进入主循环之前分配纹理一次,并在渲染过程中重新使用它,然后在程序退出之前将其销毁。

答案 1 :(得分:5)

SDL2基于硬件渲染。由于您使用GPU打乒乓球,因此即使使用流式传输标记也不会很快进行纹理处理。

除了在每个帧中创建和销毁纹理外,您应该考虑在重绘之前简单地清理它。

另一种选择是使用表面。你用表面做你的东西,然后把它作为纹理绘制。我不确定增益是否会很大但我认为它仍然比每帧的破坏,创建,锁定和解锁纹理更好。

查看您的代码,我知道它只是一个测试,尽管您可以尝试使用SDL基元渲染到纹理。

最后,在测试期间请记住,您的驱动程序可能会强制执行垂直同步,这可能会导致虚假的糟糕性能。

答案 2 :(得分:2)

可能没什么。锁定纹理以进行直接像素访问很慢。有可能,你可以在渲染功能中做很多额外的事情,而不会看到任何进一步的速度下降。

如果想要更快的渲染,则需要更高级别的功能。