Я делаю 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)
};
так что если у меня 2d массив 1024x1024 тайлов, то в памяти его только около 3мб, а когда я сохраняю / загружаю с 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 байт, даже если очень небольшая часть плиток является анимированной.
Я думал о том, чтобы сохранить двумерный массив указателей, а затем каждый из них указывает либо на обычный фрагмент, либо на анимированный, но это означало бы, что каждый указатель составляет 4 байта и указывает по крайней мере на 4-10 байтов.