Войти
ПрограммированиеСтатьиГрафика

Работа с расширениями OpenGL с использованием NVIDIA OpenGL SDK 5.1. (Часть 2) (2 стр)

Автор:

Влияние расширения ARB_multitexture на производительность

Исследуем падение производительности, которое происходит при использовании хромированных поверхностей. Для начала произведем замер при стандартных размерах текстур: текстура дерева с разрешением 256x128 и текстура отражения 256x256, затем, чтобы компенсировать малое число текстур на сцене, увеличим размер текстур до 2048*1024 и 2048*2048 (максимальный размер текстуры, поддерживаемый большинством 3D-ускорителей). Результаты измерения приведены в таблице 1 (использовалась следующая конфигурация: PIII-800EB, i815E, GeForce2 MX 32MB AGP, Windows XP, Detonator 23.11, разрешение окна - 640x480:32  при разрешении рабочего стола 1152x864:32). Хочу заметить, что это не профессиональный тест, а просто любительское исследование зависимости производительности от объема текстур. Приведенные ниже выводы основаны на моих личных предположениях и догадках, и вполне возможно, что где-то я могу ошибаться.

Таблица 1:


Размер окна
(ширина* высота:
битов на пиксель) 
Параметры текстуры №1  Параметры текстуры №2  Память, необходимая
для хранения текстур
(МБ) 
Объем требуемой
видеопамяти
(МБ) 
Производительность
(FPS)
640x480:32  256x128:32  Нет  0.13  76
640x480:32  Нет  256x128:32  0.13  77
640x480:32  256x128:32  256x256:32  0,4  5,3  76
640x480:32  256x256:32  256x128:32  0,4  5,3  62
640x480:32  2048x1024:32  Нет  8,3  13,3  42
640x480:32  Нет  2048x1024:32  8,3  13,3  42
640x480:32  2048x1024:32  2048x2048:32  25  30  28
640x480:32  2048x2048:32  2048x1024:32  25  30  27
640x480:32
FSAA2x 
256x128:32  Нет  0.13  25  42
640x480:32
FSAA2x 
Нет  256x128:32  0.13  25  35
640x480:32
FSAA2x 
256x128:32  256x256:32  0,4  25,2  42
640x480:32
FSAA2x 
256x256:32  256x128:32  0,4  25,2  42
640x480:32
FSAA2x 
2048x1024:32  Нет  8,3  33,2  21
640x480:32
FSAA2x 
Нет  2048x1024:32  8,3  33,2  28
640x480:32
FSAA2x 
2048x1024:32  2048x2048:32  25  50  6
640x480:32
FSAA2x 
2048x2048:32  2048x1024:32  25  50  5

Объем памяти, необходимой для хранения текстуры, вычисляется по формуле

ширина*высота*число байтов на пиксель.

В случае использования 32-разрядных текстур на хранения одного пикселя текстуры тратится 4 байта (3 байта на каждый цвет + 1 байт на альфа-канал)

Объем видеопамяти, используемой программой, вычисляется по формуле

(память для текстур)+(ширина экрана)*(высота экрана)*(количество байт на пиксель)*(число кадровых буферов).

В 32-битном режиме видеокарты NVIDIA тратят 8 байт видеопамяти на каждый пиксель (3 байта на каждый цвет + 1 байт на альфа-канал + 3 байта на Z-буфер + 1 байт на буфер шаблона). Учтите, что я вывел эти формулы путем логических рассуждений, поэтому вполне возможно, что они не совсем верны. Число кадровых буферов в режиме двойной буферизации равно 2. Включение режима FSAA2x приводит к повышению реального разрешения экрана в 2.25 раза, т.е. режим 640x480 превращается в 1440x1080.

Первые 4 случая показывают падение производительности при использовании текстур невысокого качества и небольшого разрешения экрана. Падение производительности в этом случае небольшое и составляет примерно 1-2%. С увеличением размера текстур разница в скорости увеличивается и достигает 50%.

При увеличении разрешения экрана (включении FSAA) разница в производительности при использовании небольших  текстур практически отсутствует. Причина этого в том, что видеокарта тратит большую часть времени на прорисовку экрана (объем текстур составляет 0,8% от используемой видеопамяти).

С увеличением объема текстур мы сталкиваемся с интересной ситуацией - разница в скорости резко увеличивается до 250%. Причина этого в том, что во втором случае объем интенсивно используемой видеопамяти превосходит объем имеющейся видеопамяти (50MБ против 33.5). В этом случае мы сталкиваемся с так называемым Texture Trashing. Суть его в том, что видеокарта из-за нехватки памяти начинает интенсивно прокачивать текстуры через шину AGP, скорость которой отличается от скорости видеопамяти почти на порядок (скорость прокачки текстур через видеопамять у GeForce2MX обычно около 2.7ГБ/сек, в то время, как скорость загрузки текстур из оперативной памяти обычно не превышает 200-300МБ/сек). Выход из этой ситуации - использование сжатых текстур, которые будут рассмотрены в одной из следующих статей.

Также можно заметить, что во всех случаях конфигурация "маленькая текстура на первом текстурном блоке, большая на втором" быстрее, чем "большая текстура на первом текстурном блоке, маленькая на втором". Это может показаться странным, но на самом деле ничего удивительного в этом нет. Все дело в том, что первый модуль использует координаты текстур объекта, а второй - сферические координаты. А при использовании сферических координат на экран выводится только часть текстуры. Следовательно, реальный объем текстуры на втором блоке меньше чем на первом, что приводит к сжижению скорости. Это будет еще более заметно, если командой glEnable включить режим GL_CULL_FACE. Для этого вставьте в функцию Init следующие строки:

glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);

Результаты измерений приведены в таблице 2:


Разрешение экрана
(ширина* высота:
битов на пиксель) 
Параметры текстуры №1  Параметры текстуры №2  Память, необходимая
для хранения текстур
(MБ) 
Объем требуемой
видеопамяти
(MБ) 
Производительность
(FPS)
640x480:32  2048x1024:32  Нет  8,3  13,3  50
640x480:32  Нет  2048x1024:32  8,3  13,3  66

Включение режима GL_CULL_FACE приводит к тому, что задняя сторона чайника не выводится. В результате, при использовании сферических текстурных координат эффективный объем текстуры, прокачиваемый через видеопамять, составляет примерно 50%. А при использовании текстурных координат объекта эффективный объем текстуры намного превышает 50% (50% было бы при выводе чайника без ручки, носика и крышки).

Расширения ARB_multitexture и EXT_texture_env_add поддерживаются всеми видеокартами NVIDIA, за исключением семейства Riva128/128ZX. При этом семейства TNT, TNT2, GeForce256 и GeForce2 имеют 2 текстурных модуля, а GeForce3 и GeForce4 - вроде бы 4 (с ними я на практике пока не сталкивался). Расширение ARB_multitexture было включено в стандарт OpenGL начиная с OpenGL 1.2.1, а ARB_texture_env_add - с OpenGL 1.3.

Вот и все на этот раз. В следующей статье речь пойдет о расширении WGL_ARB_pbuffer, при помощи которого можно создавать довольно интересные эффекты.

Исходный код примеров: ExNV_2.rar (140 kB).

Страницы: 1 2

#расширения OpenGL, #NVIDIA, #OpenGL, #SDK, #текстурирование

23 февраля 2002 (Обновление: 17 сен. 2009)