【发布时间】:2017-04-23 03:51:49
【问题描述】:
让我一点一点地解释我的问题。
这是一个 2D 游戏。
我有简单的课程。
第一个是 Point 类:
class Point {
public:
double x;
double y;
Point(double x, double y)
{
this->x = x;
this->y = y;
};
};
第二个是指示边缘的类:
class Edge {
public:
Point startPoint;
Point endPoint;
Edge(Point startPoint, Point endPoint)
{
this->startPoint = startPoint;
this->endPoint = endPoint;
};
};
然后是一个指示角度点的类:
class AnglePoint {
public:
Point point;
Edge prevEdge;
Edge nextEdge;
AnglePoint(Point point,
Edge prevEdge,
Edge nextEdge)
{
this->point = point;
this->prevEdge = prevEdge;
this->nextEdge = nextEdge;
};
};
然后我有一个 std::vector 来存储我生成的 Edge 对象:
std::vector<std::vector<Edge>> polyEdgeArray;
这是我初始化polyEdgeArray的方法:
polyEdgeArray.clear();
for (int i = 0; i < N; i ++) {
std::vector<Edge> edgeArray;
for (int j = 0; j < M; j ++) {
Point s = Point(x, x);
Point e = Point(x, x);
edgeArray.push_back(Edge(s, e));
}
polyEdgeArray.push_back(edgeArray);
}
我还有另一个向量来保存所有 AnglePoint 对象:
std::vector<AnglePoint> anglePointArray;
这是我初始化anglePointArray的方法:
for (int i = 0, l = (int)polyEdgeArray.size(); i < l; i ++) {
std::vector<Edge> edgeArray = polyEdgeArray[i];
for (int j = 0, ll = (int)edgeArray.size(); j < ll; j ++) {
Edge edge = edgeArray[j];
Edge preEdge = (j == 0 ? edgeArray[ll - 1] : edgeArray[j - 1]);
Edge nextEdge = (j == ll - 1 ? edgeArray[0] : edgeArray[j + 1]);
addEndPointAnglePoint(edge.startPoint, edge, preEdge, nextEdge);
}
}
void addEndPointAnglePoint(Point& point,
Edge& edge,
Edge& prevEdge,
Edge& nextEdge)
{
AnglePoint anglePoint = AnglePoint(point, prevEdge, nextEdge);
anglePointArray.push_back(anglePoint);
}
然后,这是我游戏的背景,polyEdgeArray 和 anglePointArray 的数量会很大,比如 100000。
并且,polyEdgeArray 和 anglePointArray 将每帧重新生成/重新计算。
上面的代码在我的游戏中运行良好,但我不确定它们是否足够高效。
根据以上信息,我有几个问题:
一个。对于 Edge 类,构造中的参数是:
Point xxx
我改成这样会不会更好:
Point* xxx or `Point& xxx`
b.同样关于std::vector<Edge>,我应该将其更改为:
std::vector<Edge*>
c。在我的情况下,哪种方式是更好的解决方案 - 在没有 new 运算符或 new 运算符作为指针的情况下保存所有对象。
任何建议将不胜感激,谢谢:)
【问题讨论】:
-
“上面的代码在我的游戏中运行良好,但我不确定它们是否足够高效。”然后对其进行基准测试。在确定工作代码太慢之前不要优化工作代码,如果是,它的哪一部分太慢以及需要多快。如果你猜测要优化什么,你就会把时间浪费在错误的地方。首先关注“它是否有效”。谁知道呢——不管它有多快,你最终都可能把所有这些代码都扔给另一种方法。
标签: c++ pointers vector reference new-operator