У меня есть следующий фрагмент аудиокода, который, как я думал, был бы хорошим кандидатом для использования vDSP в ускорении.Ускорение используемой рамки, отсутствие наблюдаемого ускорения
// --- get pointers for buffer lists
float* left = (float*)audio->mBuffers[0].mData;
float* right = numChans == 2 ? (float*)audio->mBuffers[1].mData : NULL;
float dLeftAccum = 0.0;
float dRightAccum = 0.0;
float fMix = 0.25; // -12dB HR per note
// --- the frame processing loop
for(UInt32 frame=0; frame<inNumberFrames; ++frame)
{
// --- zero out for each trip through loop
dLeftAccum = 0.0;
dRightAccum = 0.0;
float dLeft = 0.0;
float dRight = 0.0;
// --- synthesize and accumulate each note's sample
for(int i=0; i<MAX_VOICES; i++)
{
// --- render
if(m_pVoiceArray[i])
m_pVoiceArray[i]->doVoice(dLeft, dRight);
// --- accumulate and scale
dLeftAccum += fMix*(float)dLeft;
dRightAccum += fMix*(float)dRight;
}
// --- accumulate in output buffers
// --- mono
left[frame] = (float)dLeftAccum;
// --- stereo
if(right) right[frame] = (float)dRightAccum;
}
// needed???
// mAbsoluteSampleFrame += inNumberFrames;
return noErr;
Таким образом, я модифицировал его для использования vDSP, умножая fMix в конце блока кадров.
// --- the frame processing loop
for(UInt32 frame=0; frame<inNumberFrames; ++frame)
{
// --- zero out for each trip through loop
dLeftAccum = 0.0;
dRightAccum = 0.0;
float dLeft = 0.0;
float dRight = 0.0;
// --- synthesize and accumulate each note's sample
for(int i=0; i<MAX_VOICES; i++)
{
// --- render
if(m_pVoiceArray[i])
m_pVoiceArray[i]->doVoice(dLeft, dRight);
// --- accumulate and scale
dLeftAccum += (float)dLeft;
dRightAccum += (float)dRight;
}
// --- accumulate in output buffers
// --- mono
left[frame] = (float)dLeftAccum;
// --- stereo
if(right) right[frame] = (float)dRightAccum;
}
vDSP_vsmul(left, 1, &fMix, left, 1, inNumberFrames);
vDSP_vsmul(right, 1, &fMix, right, 1, inNumberFrames);
// needed???
// mAbsoluteSampleFrame += inNumberFrames;
return noErr;
Однако мое использование ЦП по-прежнему остается неизменным. Я не вижу ощутимой выгоды от использования vDSP здесь. Я делаю это правильно? Большое спасибо.
Еще новый для векторных операций, легко идти на меня :)
Если есть некоторые очевидные оптимизации, что я должен делать (вне рамок ускорения), не стесняйтесь указать на это мне, спасибо!
Предполагая, что m_pVoiceArray [i] -> doVoice (dLeft, dRight); изменяет dLeft и dRight (потому что они передаются по ссылке, и это C++?) Я бы хотел, чтобы функция doVoice создавала кучу образцов одновременно, а не только одну. Вероятно, вы тратите большую часть времени на накладные расходы, просматривая данные и делая вызовы функций. То есть, измените порядок циклов в цикле обработки кадров. В противном случае я хотел бы познакомить вас с моим другом оператором multiply. –
Да, они передаются по ссылке, C++. – lppier
Вероятно, это не ускорилось, потому что большая часть вашего времени на выборку была потрачена в цикле MAX_VOICES. Вы можете проверить это, посмотрев время использования на строку источника в Инструментах. Несколько размножений, как то, что вы вышли из цикла, тривиально по сравнению со стоимостью вызова указателя функции на (образец * голос). –