3D 矢量与不同大小的 3D 数组的速度
Speeds of 3D Vector Versus 3D Array of Varying Size
我正在为基于文本的游戏中的角色设计一个动态伤害盒,它可以捕获挥舞在他们身上的武器命中(或未命中)的位置。然后将命中的位置(指数)和伤害(量级)转化为角色相应肢体健康变量的减少。我的想法是,这个 hurtbox 最好使用 class 和一些 3D vector/array 成员来实现。
当然,我可能想要针对不同大小的敌人使用不同尺寸的 3D 容器,但我知道大小通常是在初始化时确定的。所以这是我的问题:
使用 C 风格的动态数组会更有效吗?我可以像这样在参数化构造函数中决定和分配其大小?
class hurtBox {
private:
int ***hurtBoxMatrix;
public:
hurtBox(int l, int w, int h) {
hurtBoxMatrix = new int**[l];
for (int i = 0; i < l; i++) {
hurtBoxMatrix[i] = new int*[w];
for (int j = 0; j < w; j++) {
hurtBoxMatrix[i][j] = new int[h] ();
}
}
}
};
或者,我将元素推入到我想要的尺寸的向量是否足够?
class hurtBox {
private:
vector<vector<vector<int>>> hurtBoxMatrix;
public:
hurtBox(int l, int w, int h) {
for (int i = 0; i < l; i++) {
hurtBoxMatrix.push_back(vector<vector<int>>);
for (int j = 0; j < w; j++) {
hurtBoxMatrix[i].push_back(vector<int>);
for (int k = 0; k < h; k++) {
hurtBoxMatrix[i][j].push_back(0);
}
}
}
}
};
我想是前者,因为第一次分配是常数时间,对吧?有没有比这两种方法都更好的方法?
提前致谢。
最好在一次分配中简单地分配 3D 数组,并使用索引访问元素。然后可以在 std::vector.
的构造函数中处理 std::vector 存储的分配
一般来说最好避免:
- 多次分配
- 反复调用push_back
class hurtBox {
private:
vector<int> hurtBoxMatrix;
int m_l;
int m_w;
int m_h;
public:
hurtBox(int l, int w, int h)
: hurtBoxMatrix(l * w * h), m_l(l), m_w(w), m_h(h) {}
int& operator (int i, int j, int k) {
return hurtBoxMatrix[ I*m_w*m_h + j*m_w + k ];
}
const int operator (int i, int j, int k) const {
return hurtBoxMatrix[ i*m_w*m_h + j*m_w + k ];
}
};
我正在为基于文本的游戏中的角色设计一个动态伤害盒,它可以捕获挥舞在他们身上的武器命中(或未命中)的位置。然后将命中的位置(指数)和伤害(量级)转化为角色相应肢体健康变量的减少。我的想法是,这个 hurtbox 最好使用 class 和一些 3D vector/array 成员来实现。
当然,我可能想要针对不同大小的敌人使用不同尺寸的 3D 容器,但我知道大小通常是在初始化时确定的。所以这是我的问题:
使用 C 风格的动态数组会更有效吗?我可以像这样在参数化构造函数中决定和分配其大小?
class hurtBox {
private:
int ***hurtBoxMatrix;
public:
hurtBox(int l, int w, int h) {
hurtBoxMatrix = new int**[l];
for (int i = 0; i < l; i++) {
hurtBoxMatrix[i] = new int*[w];
for (int j = 0; j < w; j++) {
hurtBoxMatrix[i][j] = new int[h] ();
}
}
}
};
或者,我将元素推入到我想要的尺寸的向量是否足够?
class hurtBox {
private:
vector<vector<vector<int>>> hurtBoxMatrix;
public:
hurtBox(int l, int w, int h) {
for (int i = 0; i < l; i++) {
hurtBoxMatrix.push_back(vector<vector<int>>);
for (int j = 0; j < w; j++) {
hurtBoxMatrix[i].push_back(vector<int>);
for (int k = 0; k < h; k++) {
hurtBoxMatrix[i][j].push_back(0);
}
}
}
}
};
我想是前者,因为第一次分配是常数时间,对吧?有没有比这两种方法都更好的方法?
提前致谢。
最好在一次分配中简单地分配 3D 数组,并使用索引访问元素。然后可以在 std::vector.
的构造函数中处理 std::vector 存储的分配一般来说最好避免:
- 多次分配
- 反复调用push_back
class hurtBox {
private:
vector<int> hurtBoxMatrix;
int m_l;
int m_w;
int m_h;
public:
hurtBox(int l, int w, int h)
: hurtBoxMatrix(l * w * h), m_l(l), m_w(w), m_h(h) {}
int& operator (int i, int j, int k) {
return hurtBoxMatrix[ I*m_w*m_h + j*m_w + k ];
}
const int operator (int i, int j, int k) const {
return hurtBoxMatrix[ i*m_w*m_h + j*m_w + k ];
}
};