这是一个非常普遍的问题,与特定的语言无关。我有这个int数组:
int[100][100] map;它只包含平铺编号,并渲染为256x256平铺。因此,它基本上只是一个平铺地图或任何它应该被称为。问题是,我希望能够在地图的任何位置写入任何内容,并且它应该留在那里。例如,可以在地面上的东西上绘制,如草、花、石头和其他使地形更加多样化的东西,而不必在每次渲染时渲染这些精灵大量的次数。但是让每个瓦片包含它自己的纹理来写入将会消耗大量的内存,那将是256x256x100x100 = 655360000像素来存储。那不就是千兆字节的数据吗!?
有没有人知道一个好的通用解决方案,可以在不消耗太多内存的情况下完成我想要做的事情?
如果有人怀疑我在使用C++和HGE (哈夫的游戏引擎)。
编辑:我选择限制屏幕上的内容数量,这样它就可以渲染了。但是看看这里,也许你会明白我想要实现什么:Link to image because I'm not allowed to use image tags :(
发布于 2009-08-10 08:11:30
我不是很清楚你想要做什么,但你可能应该把这些瓦片放在不同的层上。所以说,对于每个“瓦片”,你有一个自下而上的纹理列表,你将它们混合在一起,这样你就只存储了瓦片索引。
发布于 2009-08-10 08:10:58
如果它只是基于瓦片,那么你只存储每个独特瓦片和每个独特的“覆盖”(花,岩石等)的一个实例。您可以通过id或内存位置引用它,就像您一直在做的那样。
您只需存储一个位置(瓦片编号和瓦片上的位置)和一个对覆盖图的引用来“绘制”它,而不会消耗大量内存。
另外,我相信你知道这一点,但你只渲染屏幕上的东西。因此,一旦所有内容都加载完毕,内存使用量几乎是恒定的。
发布于 2009-08-10 08:35:20
除了存储平铺编号之外,还可以存储覆盖编号和偏移位置。
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);
}
}可以说,将覆盖和偏移量存储在与tiles分开的数组中会更快,但让地图上的每个区域像这样自包含更容易理解。
https://stackoverflow.com/questions/1253617
复制相似问题