我正在制作一个基于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磁贴的2d数组,那么它在内存中只有3mb左右,当我从hd保存/加载时。
但现在我需要动画磁贴,所以我需要额外的数据,如
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数组定义如下:
瓷砖[x] [y];
每个图块大约为10个字节,即使很小一部分图块是动画的。
我正在考虑存储一个2D指针数组,然后每个指向一个普通的tile或一个动画的,但这意味着每个指针都是4个字节,并指向至少4-10个字节。
答案 0 :(得分:3)
如果要保存内存,请不要将动画数据存储在切片中。相反,您可以在游戏程序中定义一个单独的结构,例如:
struct AnimationSequence
{
BYTE first;
BYTE current;
BYTE frames[];
float frametime;
}
然后你可以定义一些数组,这些数组代表动画的每种类型的平铺,以及它的动画效果。然后,在动画计时器中,循环显示此数组,根据屏幕上的图块进行检查,并根据需要重新绘制它们。
为了节省更多内存,您可能需要考虑的另一件事是不在切片数据中存储X / Y坐标值。我假设您的X / Y字节表示在屏幕上绘制图块的位置,或类似的东西。你可以尝试将坐标值附加到他们自己的数组中的游戏视图窗口,而不是贴在瓷砖本身上,这样你只需要有一个视图窗口,可以作为一个查找列表,用于绘制它们时的查找列表到了屏幕,而不是整个地图的价值。
答案 1 :(得分:-1)
你能把这个结构化成一个联盟吗?例如(请原谅任何语法错误,我不记得确切的语法):
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个开销字节。