如何在SDL 2中优化多纹理渲染?

3
我是使用SDL 2,并且我有一个8x8像素块的2D数组:
    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的内容或者应该做些什么呢?


1
最终类似于https://bugzilla.libsdl.org/show_bug.cgi?id=1734的东西将会出现。在此期间,您可以从我的分支编译:https://bitbucket.org/gabomdq/sdl-1.3-experimental/commits/branch/RenderGeometry - gabomdq
1个回答

2
尝试按材质/纹理分组SDL_RenderCopy()调用,并希望您的OpenGL驱动程序通过快速路径消除冗余的glBindTexture()
并/或将所有瓷砖分组到一个大型纹理集中。
或者,如果您的瓷砖实际上没有移动/每帧更改,请将它们混合成一个大纹理,然后渲染该纹理。
长期来看,请在邮件列表上向错误Sam寻求类似于SDL_RenderDrawRects()SDL_RenderCopyBatch()

一个想法与Terraria的方块有关。我有一个巨大的2D数组,但我只渲染被切断的部分。 - Necronomicron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接