减少特定数据的内存占用量c

时间:2018-02-23 10:54:14

标签: c memory

我有一个网格来划分游戏中的几何体。此网格中的每个单元格都包含三角形索引,它可以包含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也非常有限,而且这些信息必须经常访问) ?

谢谢!

1 个答案:

答案 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.

的一般信息