Ускорение вычислений преобразований

Я программирую движок 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 установлен, потому что это отладочная версия для запуска профилировщика.

7
задан genpfault 21 January 2018 в 18:41
поделиться