Я программирую движок OpenGL3 2D. В настоящее время я пытаюсь устранить узкое место. Пожалуйста, отсюда следующий вывод AMD Profiler: http://h7.abload.de/img/profilerausa.png
Данные были получены с использованием нескольких тысяч спрайтов.
Однако при 50 000 спрайтов testapp уже не работает при 5 кадрах в секунду.
Это показывает, что моим узким местом является функция преобразования, которую я использую. Это соответствующая функция: http://code.google.com/p/nightlight2d/source/browse/NightLightDLL/NLBoundingBox.cpp#130
void NLBoundingBox::applyTransform(NLVertexData* vertices)
{
if ( needsTransform() )
{
// Apply Matrix
for ( int i=0; i<6; i++ )
{
glm::vec4 transformed = m_rotation * m_translation * glm::vec4(vertices[i].x, vertices[i].y, 0, 1.0f);
vertices[i].x = transformed.x;
vertices[i].y = transformed.y;
}
m_translation = glm::mat4(1);
m_rotation = glm::mat4(1);
m_needsTransform = false;
}
}
Я не могу сделать это в шейдере, потому что я объединяю все спрайты сразу. Это означает, что я должен использовать ЦП для вычисления преобразований.
Мой вопрос: Как лучше всего решить эту проблему?
Я не использую никаких потоков atm, поэтому, когда я использую vsync, я также получаю дополнительное снижение производительности, потому что он ожидает завершения экрана. Это говорит мне, что я должен использовать потоки.
Другой вариант - использовать OpenCL? Я хочу избежать CUDA, потому что, насколько я знаю, он работает только на картах NVIDIA. Это правильно?
post scriptum:
Вы можете скачать демо здесь, если хотите:
http://www63.zippyshare.com/v/45025690/file.html
Обратите внимание, что для этого требуется VC ++ 2008 установлен, потому что это отладочная версия для запуска профилировщика.