是否不希望将指针存储在具有不同访问方法的多个容器中?

Is it undesirable to store pointers in multiple containers with different access methods?

本文关键字:方法 访问 指针 希望 存储 是否      更新时间:2023-10-16

我目前正在制作一个节点图来存储我正在制作的一款2D游戏的贴图/对象数据。本质上它是一个六边形贴图,每个贴图上都有对象。

我当前的设置基本上是这样的:

class HexCell {
public:
    HexCell* GetNeighbor(int dir) { return neighbors[dir]; };
private:
    HexCell* neighbors[6];
    // (x, y) position
    // Contents of cell
};
class HexGraph {
public:
    HexCell* GetCellByIndex(int index) { return cells[index]; };
    vector<HexCell*> GetCellsByGridIndex(int x, int y) { return grid[x][y]; };
private:
    vector<HexCell*> cells;
    vector< vector< vector <HexCell*> > > grid;
};

目前有三种方法访问hexcel:

  1. 通过cells[]的随机访问(用于迭代整个列表)
  2. 查找具有grid[x][y]的单元格子集(用于渲染)
  3. 图节点的单元级遍历(对游戏逻辑有用)

我的问题是:是一个可怕的内存浪费存储8个指针为每个对象(一个在cells一个在grid和多达六个作为其他单元的邻居)?

是否有更好/更常见的方法来做到这一点,或者它是一个可接受的系统,以便为不同的用途提供不同的访问方法?

给定十六进制地图只是一个具有直列和波浪行的2D网格,我建议将您的地图数据存储为一个2D数组的hexcell。您将能够根据X索引确定十六进制单元格列是偶数还是奇数,以确定它是否是一个向下移位的十六进制单元格

这是一个十六进制单元格及其对应的x,y索引在10x4数组中的粗略表示,其中x %2==1是向下移动1/2十六进制单元格高度的列

0,0     2,0     4,0     6,0     8,0
    1,0     3,0     5,0     7,0     9,0
0,1     2,1     4,1     6,1     8,1
    1,1     3,1     5,1     7,1     9,1
0,2     2,2     4,2     6,2     8,2
    1,2     3,2     5,2     7,2     9,2
0,3     2,3     4,3     6,3     8,3
    1,3     3,3     5,3     7,3     9,3

使用此方法,您可以编写逻辑来确定X,Y的6个邻居非常简单,而无需在每个十六进制单元格中存储额外的信息