这是我在做什么。我的应用程序在拖动时从用户获取点,并实时显示填充的多边形。

它基本上在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 &currentcontour )
{
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毫秒,那么我们将会很有名。

相反,找出循环中哪些部分花费的时间最长,并对其进行优化。不要朝着任意时间方向努力。我建议获得一个好的分析器以获得准确的结果。这样,您就不必猜测什么慢了(循环中发生了什么),但是实际上可以看到哪个部分慢了。

09-25 19:39