【问题标题】:How to optimize rendering of many textures in SDL 2?如何优化 SDL 2 中许多纹理的渲染?
【发布时间】:2013-10-15 01:20:09
【问题描述】:

我正在使用 SDL 2,并且我有一个 8x8 像素块的二维数组:

    SDL_RenderClear(renderer);
    SDL_SetRenderDrawColor(renderer, 0xdf, 0xef, 0xff, 0xff);
    for (s32 y = 0, Y = 0; y < worldSize.y; y++, Y += blockSize)
        for (s32 x = 0, X = 0; x < worldSize.x; x++, X += blockSize)
            if (block[x][y].GetMaterial())
            {
                if (block[x][y].IsSolid())
                {
                    SDL_Rect src =
                    {
                        block[x][y].GetTileVariant() * blockSize,
                        block[x][y].GetTile() * blockSize,
                        blockSize,
                        blockSize
                    };
                    SDL_Rect dst =
                    {
                        X + (s32)posX,
                        Y + (s32)posY,
                        blockSize,
                        blockSize
                    };
                    SDL_RenderCopy(renderer, materials[block[x][y].GetMaterial()]->texture, &src, &dst);
                }
            }
    SDL_RenderPresent(renderer);

所以在这里我以随机顺序使用了一些纹理,例如:1、2、5、2、2、3、1 等。如果它填满了整个屏幕 (1920x1080),它就会滞后。没有那么多,但无论如何大声。所以我的问题是:如何优化它?我应该使用什么?我需要一些代码示例。最后,是我自己在openGL上写点什么还是怎么办?

【问题讨论】:

标签: c++ opengl optimization rendering sdl-2


【解决方案1】:

尝试按材质/纹理对您的 SDL_RenderCopy() 调用进行分组,并希望您的 OpenGL 驱动程序快速路径冗余 glBindTexture()s。

和/或将所有图块组合成一个大纹理图集。

或者,如果您的图块实际上并未逐帧移动/更改 blit them into one large texture 并进行渲染。

长期来看,mailing list 上的错误 Sam 类似于 SDL_RenderCopyBatch(),类似于 SDL_RenderDrawRects()

【讨论】:

  • 创意与泰拉瑞亚的方块有关。我有巨大的 2D 数组,但我渲染的只是截断。
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多