Привет, ребята, у меня работает базовая L-система, и я решил попробовать оптимизировать рендеринг приложения. Раньше я перебирал всю строку L-системы с помощью переключателя и рисовал ... еще лучше я покажу вам, что я делал.
for(unsigned int stringLoop = 0; stringLoop < _buildString.length(); stringLoop++)
{
switch(_buildString.at(stringLoop))
{
case'X':
//Do Nothing
//X is there just to facilitate the Curve of the plant
break;
case'F':
_prevState = _currState;
_currState.position += _currState.direction * stdBranchLength;
//Set the previous state to the current state
_graphics.SetColour3f(0.0f, 1.0f, 0.0f);
_graphics.Begin(OGLFlags::LINE_STRIP);
_graphics.Vertex3f(_prevState.position.X(), _prevState.position.Y(), _prevState.position.Z());
_graphics.Vertex3f(_currState.position.X(), _currState.position.Y(), _currState.position.Z());
_graphics.End();
break;
case'[':
_prevStack.push(_currState);
break;
case']':
_prevState = _currState;
_currState = _prevStack.top();
_prevStack.pop();
break;
case'-':
_currState.direction = _currState.direction.RotatedAboutZ(-(ROTATION) * Math::DegreesToRadians);
break;
case'+':
_currState.direction = _currState.direction.RotatedAboutZ(ROTATION * Math::DegreesToRadians);
break;
};
}
Я удалил все это, потому что буквально разрешал дерево в каждом отдельном кадре, я изменил этот цикл так, чтобы он сохранял все вершины в стандартном векторе.
for(unsigned int stringLoop = 0; stringLoop < _buildString.length(); stringLoop++)
{
switch(_buildString.at(stringLoop))
{
case'X':
break;
case'F':
//_prevState = _currState;
_currState.position += _currState.direction * stdBranchLength;
_vertexVector.push_back(_currState.position);
break;
case'[':
_prevStack.push(_currState);
break;
case']':
_currState = _prevStack.top();
_prevStack.pop();
break;
case'-':
_currState.direction = _currState.direction.RotatedAboutZ(-(ROTATION) * Math::DegreesToRadians);
break;
case'+':
_currState.direction = _currState.direction.RotatedAboutZ(ROTATION * Math::DegreesToRadians);
break;
};
}
Теперь я изменил свой цикл рендеринга, поэтому я просто читаю прямо из массива векторов.
DesignPatterns::Facades::OpenGLFacade _graphics = DesignPatterns::Facades::openGLFacade::Instance();
_graphics.Begin(OGLFlags::LINE_STRIP);
for(unsigned int i = 0; i < _vertexVector.size(); i++)
{
_graphics.Vertex3f(_vertexVector.at(i).X(), _vertexVector.at(i).Y(), _vertexVector.at(i).Z());
}
_graphics.End();
Теперь моя проблема в том, что когда я использую векторный массив и использую Line Stip, я получаю дополнительный артефакт.
Первое изображение - это исходный рендер, который неоптимизирован, затем второе - более новый рендер, который работает быстрее, а третьи - это рендеринг кривой дракона, которая не использует толчков и всплывающих окон, как первые два (я довольно уверен, что толчок и популярность - то, где проблемы прибывают).
Проблема в моей логике хранения вершин или потому, что я использую линейную полосу? Я бы просто использовал строки, но на самом деле это вообще не работает, в конечном итоге это выглядит как line_stipple.
Также извините за длину этого поста.
альтернативный текст http://img197.imageshack.us/img197/8030/bettera.jpg
альтернативный текст http://img23.imageshack.us/img23/3924/buggyrender.jpg
альтернативный текст http://img8.imageshack.us/img8/627/dragoncurve.jpg