0

这是一个非常笼统的问题,与特定语言无关。我有这个int数组:

int[100][100] map;

这仅包含瓦片编号,并呈现为 256x256 瓦片。所以它基本上只是一个瓦片地图或任何它应该被调用的东西。事情是我希望能够在任何地方写任何东西到地图上,而且它应该留在那里。例如,能够在地面上的东西上绘画,例如草、花、石头和其他使地形更加多样化的东西,而不必在每次渲染时对每个精灵进行大量渲染。但是让每个图块包含它自己的要写入的纹理将非常消耗内存,因为要存储 256x256x100x100 = 655360000 像素。那会不会像千兆字节的数据之类的!?

有没有人知道一个很好的一般 sulotion 可以在不杀死太多内存的情况下完成我正在尝试做的事情?

如果有人想知道我将 C++ 与 HGE(Haaf 的游戏引擎)一起使用。

编辑:我选择限制屏幕上的内容数量,以便它可以渲染。但是看看这里,也许你会明白我试图实现的目标: 链接到图像,因为我不允许使用图像标签:(

4

4 回答 4

2

如果它只是基于瓦片,那么您只存储每个唯一瓦片和每个唯一“叠加层”(花卉、岩石等)的一个实例。您可以通过 id 或内存位置引用它,就像您一直在做的那样。

您只需存储一个位置(图块编号和图块上的位置)和对覆盖的引用以“绘制”它而不会消耗大量内存。

另外,我确定您知道这一点,但您只渲染屏幕上的内容。因此,一旦所有内容都加载完毕,内存使用量几乎是恒定的。

于 2009-08-10T08:10:57.680 回答
1

我不确定您要做什么,但是您可能应该将瓷砖放在不同的图层中。所以说,对于每个“平铺”,您都有一个自下而上排序的纹理列表,您将它们混合在一起,这样您就只存储平铺索引。

于 2009-08-10T08:11:29.910 回答
1

不仅存储图块编号,还存储覆盖编号和偏移位置。

struct map_zone {
    int tile; // tile number
    int overlay; // overlay number (flower, rock, etc). In most cases will be zero
    int overlay_offset_x; // draw overlay at X pixels across from left
    int overlay_offset_y; // draw overlay at Y pixels down from top
}

map_zone[100][100] map;

对于渲染:

int x, y;
for(y = 0; y < 100; ++y) {
    for(x = 0; x < 100; ++x) {
        render_tile(map[y][x].tile)
        render_overlay(map[y][x].overlay, map[y][x].overlay_offset_x, map[y][x].overlay_offset_y);
    }
}

可以说,将叠加层和偏移量存储在与图块不同的数组中会更快,但是像这样让地图上的每个区域自包含更容易理解。

于 2009-08-10T08:35:20.237 回答
0

你必须使用阿尔法地图..

您将绘制一个 256x256 的纹理来映射您的整个地形。对于每个通道 r、g、b、a,您将使用另一个纹理平铺您的地形。

r = 沙子.jpg g = 草.jpg b = 水.jpg a = 土壤.jpg

在着色器中,您将检查 alpha 贴图的颜色并使用这些纹理进行绘制。

我现在正在做这样的事情,我确实喜欢那样

替代文字

替代文字

于 2009-08-10T08:10:49.023 回答