ну вот ДХ не инлайнится но всёже быстрее ))
Smouking
он быстрей, при левых тестах))
а так, он медленнее раза в 3...5 получается( в зависимости от функций )
D3DXQUATERNION - вообще тормозная штука.
у D3DXMATRIX - только D3DXMatrixMultiply более-менее, хотя тоже не дотягивает( но там, действительно дело в инлайне, т.е. у себя его затираешь и время выполнения примерно равное получается )
p.s. хотя, честно говоря, самому охота от него( инлайн ) избавится, чтобы движок не стал Open Source =), но без него FPS меньше =\
Aldaron
Поворот - сам по себе тяжелая операция, хоть с D3DX хоть нет. А ты как поворачиваешь модель ?
ksacvet777
модель?! Кватернионами, и их же передаю шейдеру( или же получаю из них World матрицу, у меня тут несколько реализаций )
Вопрос:
Почему никто не использует SSE3? Там есть замечательная команда: _mm_hadd_ps С ее помощью можно ускорить DOT векторов и умножение матриц.
Нечто типа:
TH_FINLINE Matrix Multiply(const Matrix& M1, const Matrix& M2) { //Транспонируем M2 TH_VECTOR vTemp1 = _mm_shuffle_ps(M2.r[0],M.2r[1],_MM_SHUFFLE(1,0,1,0)); TH_VECTOR vTemp3 = _mm_shuffle_ps(M2.r[0],M2.r[1],_MM_SHUFFLE(3,2,3,2)); TH_VECTOR vTemp2 = _mm_shuffle_ps(M2.r[2],M2.r[3],_MM_SHUFFLE(1,0,1,0)); TH_VECTOR vTemp4 = _mm_shuffle_ps(M2.r[2],M2.r[3],_MM_SHUFFLE(3,2,3,2)); TH_VECTOR vTemp0 = _mm_shuffle_ps(vTemp1, vTemp2,_MM_SHUFFLE(2,0,2,0)); vTemp1 = _mm_shuffle_ps(vTemp1, vTemp2,_MM_SHUFFLE(3,1,3,1)); vTemp2 = _mm_shuffle_ps(vTemp3, vTemp4,_MM_SHUFFLE(2,0,2,0)); vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4,_MM_SHUFFLE(3,1,3,1)); //Умножаем строка на строку return Matrix( _mm_hadd_ps(_mm_hadd_ps(_mm_mul_ps(M1.r[0],vTemp0),_mm_mul_ps(M1.r[0],vTemp1)),_mm_hadd_ps(_mm_mul_ps(M1.r[0],vTemp2),_mm_mul_ps(M1.r[0],vTemp3))), _mm_hadd_ps(_mm_hadd_ps(_mm_mul_ps(M1.r[1],vTemp0),_mm_mul_ps(M1.r[1],vTemp1)),_mm_hadd_ps(_mm_mul_ps(M1.r[1],vTemp2),_mm_mul_ps(M1.r[1],vTemp3))), _mm_hadd_ps(_mm_hadd_ps(_mm_mul_ps(M1.r[2],vTemp0),_mm_mul_ps(M1.r[2],vTemp1)),_mm_hadd_ps(_mm_mul_ps(M1.r[2],vTemp2),_mm_mul_ps(M1.r[2],vTemp3))), _mm_hadd_ps(_mm_hadd_ps(_mm_mul_ps(M1.r[3],vTemp0),_mm_mul_ps(M1.r[3],vTemp1)),_mm_hadd_ps(_mm_mul_ps(M1.r[3],vTemp2),_mm_mul_ps(M1.r[3],vTemp3)))); }
В сравнении с вариантом из поста #19 экономим 8 shuffle.
DOT:
TH_FINLINE static Vector4 Dot(const Vector4& V1, const Vector4& V2) { TH_VECTOR vTemp2 = V2.v; TH_VECTOR vTemp = _mm_mul_ps(V1.v,vTemp2); //w1*w2 z1*z2 y1*y2 x1*x2 vTemp2 = _mm_hadd_ps(vTemp2,vTemp2); //w+z y+x w+z y+x vTemp2 = _mm_hadd_ps(vTemp2,vTemp2); //w+z+y+x w+z+y+x w+z+y+x w+z+y+x return Vector4(vTemp2); }
В сравнении с обычной реализацией на SSE/SSE2 экономится 3 shuffle
еще можно оптимизировать не само умножение матриц (общий случай), а преобразования
например, есть матрица, хотим ее сдвинуть (translate)
в данном случае, можно получить матрицу трансляции и перемножить
такое умножение займет (без MMX\SSE) 64*48+
а можно дописать метод postTranslate( x, y, z ) - которая будет сдвигать матрицу-this за 12*12+
аналогично с масштабированием и вращениями по основным осям
Я конечно извиняюсь, что встреваю в ваш разговор, но разве ДХ делает перемножение не на вершинном шейдере? В этом случае там по умолчанию перемножение должно быть бестрее.
dave
> Я конечно извиняюсь, что встреваю в ваш разговор, но разве ДХ делает
> перемножение не на вершинном шейдере? В этом случае там по умолчанию
> перемножение должно быть бестрее.
в перлы?
А хотя, если он функцию использует, то наверное на процессоре считает.
Тема в архиве.