2017-01-09 6 views
1

Я написал код openGLES, который имеет один вершинный шейдер и один шейдер фрагмента. Псевдокод выглядит так:OpenGL Performance

main() 
    { . 
    . 
    . 
    for(int i=0; i<100;i++) 
    { 
     //t1 = clock(); 
     //Setting two textures as input 
     //Setting 10 glUniform 4f variables 
     //Setting Viewport 
     //Launch : glDrawArray 
     //glFinish(); 
     //t2 = clock(); 
     //printf("Execution time : %f\n",t2-t1); 
    } 
    } 

Я получаю ожидаемый результат. Но, выполняя его 100 раз, для первого выполнения я получаю 80 мс, а для последующего исполнения - 25 мс. Я просто хочу подтвердить, что ожидается в openGLES (из-за некоторых фекеров) или я ошибаюсь.

Спасибо

ответ

2

Большинство водителей OpenGLES не полностью компилировать шейдеры, когда вы сначала создать их, они не откладывать большую часть работы, пока в первый раз вы рисуете что-то с ними.

Они делают это, потому что они знают эмпирически, что множество программ создают шейдеры, которые они никогда не будут использовать. Недостатком является то, что он создает фрейм-глюки/непоследовательные призывы времени вызовов для пользователей, которые более осторожны.

Иногда люди «pre-warm» шейдеров, делая вне экрана визуализацию с ними, чтобы избежать сбоев кадра во время игры.

2

В дополнение к временам установки драйвера, упомянутым в @Colombo, также стоит отметить, что если вы работаете на мобильном устройстве, потребуется некоторое время (> 100 мс), чтобы производительность устройства достигла устойчивого состояния при изменении рабочих нагрузок , Производительность графического процессора (рабочая частота) адаптируется «на лету» к требуемой рабочей нагрузке, поэтому первые кадры, вероятно, имеют более низкую частоту, чем это было бы идеально.