c++ - 巨大的 SDL_Textures - 内存不足

标签 c++ sdl sdl-2

我正在编写一个基于 Tile 的游戏的原型(prototype)来学习 SDL。我的 map 只是一个 257x257 的 Tiles 阵列,每个 Tile 是 1x1 到 60x60 像素(不同的缩放)。SDL 窗口的分辨率为 1024x768。所以我可以显示 18x13 到 1024*768 的图 block 。

到目前为止,我尝试了 2 种方法。

第 1:从 Tiles 渲染

//for (at worst) 1024*768 Tiles
SDL_Rect Tile;
SDL_SetRenderDrawColor(gRenderer, /*some color*/ , 255);
Tile = { Tile_size * x, Tile_size * y, Tile_size, Tile_size };
SDL_RenderFillRect(gRenderer, &(Tile));

缺点:这很耗时,如果我尝试移动 map ,游戏就会开始滞后。


第二次在游戏开始前创建纹理

使用:SDL_CreateRGBSurfaceSDL_FillRectSDL_CreateTextureFromSurface

con:纹理将是 (257x257)(Tiles)x(60x60)(pixel/Tile)x(32)(bit/pixel) ~ 951 MB。并且对于不同的 Zoom 有多个纹理,它的处理方式非常庞大。

如果有任何提高性能的提示,我将不胜感激。

最佳答案

第一个例子只是绘制了一个填充的矩形......这不会很慢,我必须看到更多才能给出更好的答案。

一般来说,您希望只渲染屏幕上可见的图 block ,而不是 map 本身的图 block 。对于 60x60 的图 block ,您只需使用 SDL 2d 绘图功能即可。当您添加不同的缩放级别时,恐怕您将无法仅使用 1x1 像素图 block 并使用相同的方法 - 您会尝试通过函数调用来调用每个像素!

因此,一旦您添加了不同的缩放级别,您就必须弄清楚如何将其显示在屏幕上 - 以及这对玩家来说意味着什么:)

关于c++ - 巨大的 SDL_Textures - 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27889460/

相关文章:

c++ - C++访问结构中的结构数组的元素

c++ - "lossless" float 到字节的转换

c++ - 如何让 boost::thread 休眠 N 个滴答?

c++ - “glGetTexLevelParameter”未在此范围内声明

c++ - 如何在 OS X 上使用 SDL2 编译 C++ 程序?

c++ - TTF_RenderText_Solid() 崩溃游戏和 Visual Studio [c++][sdl ttf]

C++ 使用标准 :string v char* in a base class - base class has a redudant copy of the string

c++ - 我正在使用未定义 SDL_main 的 SDL 函数。这样好吗?

visual-studio-2010 - 如何使用VS2010在Windows上静态编译SDL游戏

c++ - 复制构造函数不识别继承的成员