Вот что я делаю. Мое приложение получает точки от пользователя при перетаскивании и в режиме реального времени отображает заполненный многоугольник.
Это в основном добавляет положение мыши на MouseMove. Эта точка является точкой USERPOINT и имеет маркеры Безье, потому что в конечном итоге я сделаю Безье, и поэтому я должен перенести их в вектор.
Так что в основном 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, он прыгает до 16 мс и никогда не оглядывается назад. Я уверен, что это связано с std :: vector. Что я могу сделать, чтобы он оставался на 0мс. Я не возражаю против использования большого количества памяти при генерации формы, а затем при удалении излишка, когда форма завершена, или что-то вроде этого.