Я программирую 2D-движок OpenGL3. В настоящее время я пытаюсь решить узкое место. Пожалуйста, следуйте следующим выводам 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;
}
}
Я не могу сделать это в шейдере, потому что я объединяю все спрайты сразу. Это означает, что я должен использовать ЦП для вычисления преобразований.
Мой вопрос: как лучше всего решить это узкое место?
Я не использую потоки, поэтому, когда я использую vsync, я также получаю дополнительный удар по производительности, потому что он ожидает завершения экрана. Это говорит мне, что я должен использовать многопоточность.
Другой способ - использовать OpenCL, может быть? Я хочу избежать CUDA, потому что, насколько я знаю, он работает только на картах NVIDIA. Это правильно?
пост скриптум:
Вы можете скачать демо здесь, если хотите:
http://www63.zippyshare.com/v/45025690/file.html
Обратите внимание, что для этого требуется установленная версия VC++2008, так как это отладочная версия для запуска профилировщика.