我有一个网格来划分游戏中的几何体。此网格中的每个单元格都包含三角形索引,它可以包含0到n个索引。
所以最初我想到了这个结构来保存这些数据:
struct GRID_CELL
{
unsigned short m_num_indexes;
unsigned int * m_indexes;
}
这是一个内存有限的系统,很快我就用尽了。我需要存储60x60x60网格单元。首先,我考虑将 m_num_indexes 存储为 m_indexes 的第一个元素,以减少由于对齐而导致的结构大小(从8到4个字节)。
然后我想我可以使用这个结构:
struct GRID_CELL
{
unsigned short m_first_index;
unsigned short m_num_index;
}
然后将所有索引连续存储在单个int *数组中。
你能想到以更小的内存占用存储这些信息的任何其他方式(也没有使得提取信息过于复杂,因为CPU也非常有限,而且这些信息必须经常访问) ?
谢谢!
答案 0 :(得分:0)
我们可以将GRID_CELL
简化为一个字节 - 一种类型的单元格,即:
struct GRID_CELL
{
uint8_t m_type;
}
struct GRID_CELL grid[60][60][60];
unsigned int *indexes[256];
unsigned short num_indexes[256];
这意味着我们将仅限于256个独特的单元格,但对于大多数游戏来说应该足够了。要访问索引:
uint8_t cell_type = grid[x][y][z];
unsigned short n = num_indexes[cell_type];
unsigned int *p = indexes[cell_type];
细胞类型示例:
0
是一个空单元格(空中); 1
是水; 2
是地球; 3
是一个障碍; 128
是空单元格中的游戏角色; 129
是水中的字符; 130
是地球上的一个角色; 255
是一个唯一的单元格(情况有所变化); 等等。
我们也可以尝试使用稀疏矩阵来保存一些字节。但它可能会使游戏引擎变得复杂和减速。以下是有关Sparse Matrix on Wikipedia.
的一般信息