我正在制作一个基于2d瓦片的游戏,我试图通过使用位字段和字节作为瓦片结构中的值来保持我的瓦片结构很小:
struct Tile
{
// 3 bytes (24 bits)
BYTE i : 8; // Texture index (0-255)
BYTE p : 1; // Passable (0-1)
BYTE x : 7; // Texture x (0-127)
BYTE y : 7; // Texture y (0-127)
BYTE v : 1; // Visible (0-1)
};因此,如果我有一个1024x1024瓦片的二维数组,那么当我从hd保存/加载时,它的内存只有大约3mb。
但是现在我需要动画瓦片,所以我需要额外的数据,
struct Tile
{
#define TILE_NORMAL 0
#define TILE_ANIMATED 1
BYTE tile_type;
// 3 bytes (24 bits)
BYTE i : 8; // Texture index (0-255)
BYTE p : 1; // Passable (0-1)
BYTE x : 7; // Texture x (0-127)
BYTE y : 7; // Texture y (0-127)
BYTE v : 1; // Visible (0-1)
// For animated tiles
BYTE frame;
BYTE maxFrame;
float frameTime;
};在每个瓦片上,由于2D数组的定义如下:
瓦片瓦片;
每个瓦片大约是10字节,即使很小比例的瓦片是动画的。
我在考虑存储一个2D指针数组,然后每个指针指向一个普通的瓦片或一个动画瓦片,但这意味着每个指针都是4个字节,并且至少指向4-10个字节。
发布于 2011-07-15 06:54:01
如果要节省内存,请不要将动画数据存储在平铺本身中。相反,您可以在游戏程序中定义一个单独的结构,例如:
struct AnimationSequence
{
BYTE first;
BYTE current;
BYTE frames[];
float frametime;
}然后你可以定义一个数组,这些数组代表每种类型的瓷砖动画,以及它的动画效果。然后,在动画计时器中,循环此数组,对照屏幕上的磁贴检查它,并根据需要重新绘制它们。
为了节省更多内存,您可能需要考虑的另一件事是不在平铺数据中存储X/Y坐标值。我假设你的X/Y字节表示在屏幕上绘制磁贴的位置,或者类似的东西。您可以尝试将坐标值附加到游戏视图窗口的数组中,而不是附加到图块本身,这样,当您将图块绘制到屏幕上时,将只有一个图块的视图窗口用作查找列表,而不是整个地图的图幅。
发布于 2011-07-15 05:38:09
你能让这个结构成为一个联合吗?例如(请原谅任何语法错误,我不记得确切的语法了):
struct Tile
{
#define TILE_NORMAL 0
#define TILE_ANIMATED 1
BYTE tile_type;
// 3 bytes (24 bits)
BYTE i : 8; // Texture index (0-255)
BYTE p : 1; // Passable (0-1)
BYTE v : 1; // Visible (0-1)
BYTE x : 7; // Texture x (0-127)
BYTE y : 7; // Texture y (0-127)
union
{
struct AnimatedTileData
{
// For animated tiles
BYTE frame;
BYTE maxFrame;
float frameTime;
};
struct NoData
{
};
};
};因此,在这种情况下,您有一个额外的字节来表示它是否为动画。如果它不是动画,那么将使用'NoData‘,不会增加任何开销。如果瓦片是动画的,则为动画相关数据添加6个开销字节。
https://stackoverflow.com/questions/6700037
复制相似问题