这是我在做什么。我的应用程序在拖动时从用户获取点,并实时显示填充的多边形。
它基本上在MouseMove上添加鼠标位置。这一点是一个USERPOINT,具有bezier句柄,因为最终我会做bezier,这就是为什么我必须将它们转移到 vector 中的原因。
所以基本上是MousePos-> USERPOINT。 USERPOINT被添加到std::vector<USERPOINT>
。然后在我的UpdateShape()函数中,执行以下操作:
DrawingPoints的定义如下:
std::vector<std::vector<GLdouble>> DrawingPoints;
Contour[i].DrawingPoints.clear();
for(unsigned int x = 0; x < Contour[i].UserPoints.size() - 1; ++x)
SetCubicBezier(
Contour[i].UserPoints[x],
Contour[i].UserPoints[x + 1],
i);
SetCubicBezier()当前如下所示:
void OGLSHAPE::SetCubicBezier(USERFPOINT &a,USERFPOINT &b, int ¤tcontour )
{
std::vector<GLdouble> temp(2);
if(a.RightHandle.x == a.UserPoint.x && a.RightHandle.y == a.UserPoint.y
&& b.LeftHandle.x == b.UserPoint.x && b.LeftHandle.y == b.UserPoint.y )
{
temp[0] = (GLdouble)a.UserPoint.x;
temp[1] = (GLdouble)a.UserPoint.y;
Contour[currentcontour].DrawingPoints.push_back(temp);
temp[0] = (GLdouble)b.UserPoint.x;
temp[1] = (GLdouble)b.UserPoint.y;
Contour[currentcontour].DrawingPoints.push_back(temp);
}
else
{
//do cubic bezier calculation
}
因此,出于三次方贝塞尔曲线的原因,我需要将USERPOINTS设置为GlDouble [2](因为GLUTesselator接受一个double静态数组)。
所以我做了一些分析。在〜100点处,代码:
for(unsigned int x = 0; x < Contour[i].UserPoints.size() - 1; ++x)
SetCubicBezier(
Contour[i].UserPoints[x],
Contour[i].UserPoints[x + 1],
i);
花费0毫秒执行。然后在120左右跳到16ms,再也不会回头。我很肯定这是由于std::vector造成的。我该怎么做才能使其保持在0ms。我不介意在生成形状时使用大量内存,然后在形状最终确定时删除多余的内存,或类似的事情。
最佳答案
0ms是没有时间...什么都不会立即执行。这应该是您可能想检查计时方法而不是计时结果的第一个指标。
即,计时器通常没有很好的分辨率。您的16毫秒前结果实际上可能只是1毫秒-0毫秒时错误报告了15毫秒。无论如何,如果我们可以告诉您如何将其保持在0毫秒,那么我们将会很有名。
相反,找出循环中哪些部分花费的时间最长,并对其进行优化。不要朝着任意时间方向努力。我建议获得一个好的分析器以获得准确的结果。这样,您就不必猜测什么慢了(循环中发生了什么),但是实际上可以看到哪个部分慢了。