В моей программе выводится очень много 2D графики с альфа-составляющей, т.е. 10-20 картинок накладываются друг на друга. Все это дико тормозит (на GeForce2 fps падает до 10). Существует ли механизм, позволяющий решить подобную задачу с меньшими тормозами? Отказаться от подобного я не могу (ну специфическое приложение, где приходится поступать именно так)...
22.08.05 09:11: Перенесено модератором из 'Разработка игр' — Odi$$ey
Здравствуйте, Vandalf, Вы писали:
V>В моей программе выводится очень много 2D графики с альфа-составляющей, т.е. 10-20 картинок накладываются друг на друга. Все это дико тормозит (на GeForce2 fps падает до 10). Существует ли механизм, позволяющий решить подобную задачу с меньшими тормозами? Отказаться от подобного я не могу (ну специфическое приложение, где приходится поступать именно так)...
Прямо на экран выводишь или есть какая-то буфферизация?
Здравствуйте, Vandalf, Вы писали:
V>В моей программе выводится очень много 2D графики с альфа-составляющей, т.е. 10-20 картинок накладываются друг на друга. Все это дико тормозит (на GeForce2 fps падает до 10). Существует ли механизм, позволяющий решить подобную задачу с меньшими тормозами? Отказаться от подобного я не могу (ну специфическое приложение, где приходится поступать именно так)...
А картинки выводишь битмапами или текстурированными полигонами?
Выводить надо полигонами, они намного быстрее обрабатываются.
Здравствуйте, HeaveN, Вы писали:
HN>Здравствуйте, Vandalf, Вы писали:
V>>В моей программе выводится очень много 2D графики с альфа-составляющей, т.е. 10-20 картинок накладываются друг на друга. Все это дико тормозит (на GeForce2 fps падает до 10). Существует ли механизм, позволяющий решить подобную задачу с меньшими тормозами? Отказаться от подобного я не могу (ну специфическое приложение, где приходится поступать именно так)...
HN>А картинки выводишь битмапами или текстурированными полигонами? HN>Выводить надо полигонами, они намного быстрее обрабатываются.
Здравствуйте, HeaveN, Вы писали:
A>>Прямо на экран выводишь или есть какая-то буфферизация? HN>Ну, раз выводит полигонами, то это непринципиально для скорости...
Наложение частично прозрачных элементов связано с чтением из памяти, так что как раз имеет значание куда они рисуются. Чтение из видео памяти в разы медленнее записи. Наиболее корректно насколько я знаю. Рисовать всё это дело в текстуру а потом выводить один полигон (2 треугольника если прямоугольная область) с этой вот текстурой.
Здравствуйте, Vandalf, Вы писали:
V>Вывожу примерно так:
<покоцано>
Странно, должно работать достаточно быстро. Имхо, почти неважно то, используется ли альфа-канал или нет... на скорость это мало влияет. А в игрушках и несколько тысяч полигонов вполне приличный fps дают. Проблемы могут быть две:
1) полигоны текстуры слишком большие...
2) не включается аппаратное ускорение, это могут косячить дрова. Такая проблема обсуждалась здесь
. Я потом с тем человеком пообщался в привате и он прислал свой проект. Когда я его запустил, то на Riva TNT2 (у него GF2) получил 396 fps, при тех условиях, когда он получал 55. В такой ситуации я обычно запускаю Quake 3, чтобы проверить работоспособность драйвера.
Здравствуйте, adontz, Вы писали:
A>Наложение частично прозрачных элементов связано с чтением из памяти, так что как раз имеет значание куда они рисуются. Чтение из видео памяти в разы медленнее записи. Наиболее корректно насколько я знаю. Рисовать всё это дело в текстуру а потом выводить один полигон (2 треугольника если прямоугольная область) с этой вот текстурой.
Спорить не буду, не пробовал.
Но приведу такой пример из моего древнего простенького проектика. Там на фоне 3D-леталки выводился 2D текст, методом из Quake3. Когда каждый символ — это полигон с наложенной текстурой. В тех местах, где у символа нет пикселей используется прозрачность, чтобы картинка на заднем плане была видна. В разрешении 800x600 все это чудо давало ~200 fps. Символов на экране было чуть больше сотни. Правда размер полигонов небольшой и текстурка на кождом что-то вроде 8х8 или 8х16 была. Если текст не выводить, то fps возрастал кадров на 10-15. Система: Celeron 667, RIVA TNT2 Ultra 32MB, WinXP Pro, остальные параметры, имхо, не важны. Так что я думаю, если даже текстуры и полигоны достаточно большие, такого падения fps, как Vandalf'а быть не должно.
Тут точно косяк с аппаратным ускорением OpenGL. (Кстати если по какой-то причине оно у меня отрубалось, прога давала 1-2 fps и кучу глюков).
Здравствуйте, HeaveN, Вы писали:
HN>Тут точно косяк с аппаратным ускорением OpenGL. (Кстати если по какой-то причине оно у меня отрубалось, прога давала 1-2 fps и кучу глюков).
Вообще я так и не понял как определить есть ли аппаратное ускорение на OpenGL программно. С DX гораздо проще в этом смысле.
Здравствуйте, adontz, Вы писали:
A>Вообще я так и не понял как определить есть ли аппаратное ускорение на OpenGL программно. С DX гораздо проще в этом смысле.
int pixelformat;
PIXELFORMATDESCRIPTOR pfd;
bool bHardwareAccelerated;
// здесь записываем в pfd те параметры, которые должен иметь нужный нам pixelformat
// ......
// далее подбирается нужный формат или наиболее похожийif ((pixelformat = ChoosePixelFormat (hDC, &pfd)) == 0)
{
// не смогли подобрать формат, выходимreturn false;
}
// устанавливаем выбранный форматif (SetPixelFormat (hDC, pixelformat, &pfd) == FALSE )
{
// не смогли установить, выходимreturn false;
}
// получаем описание установленного формата
DescribePixelFormat (hDC, pixelformat, sizeof (pfd), &pfd );
// проверяем состояние флага PFD_GENERIC_ACCELERATEDif (!(pfd.dwFlags & PFD_GENERIC_ACCELERATED))
{
// аппаратное ускорение используется
bHardwareAccelerated = true;
}
else
{
// аппаратное ускорение неиспользуется
bHardwareAccelerated = false;
}
В общем-то ничего хитрого. Согласен, что в DX немного проще, но я не люблю DX, потому что еще пока не особо дружу с COM
Здравствуйте, HeaveN, Вы писали:
A>>Вообще я так и не понял как определить есть ли аппаратное ускорение на OpenGL программно. С DX гораздо проще в этом смысле.
HN>
HN>
HN>В общем-то ничего хитрого. Согласен, что в DX немного проще, но я не люблю DX, потому что еще пока не особо дружу с COM
У DX другое преимущество. Я могу ЯВНО отказатся от использования ускорения. На глюкавых драйверах незаменимая вешь. Правда вот все более или менее сложные/новые механизмы надо использовать на свой страх и риск. Сколько раз уже переключал на OGL рендеринг игрушки for GeForce only.
Здравствуйте, Vandalf, Вы писали:
V>В моей программе выводится очень много 2D графики с альфа-составляющей, т.е. 10-20 картинок накладываются друг на друга. Все это дико тормозит (на GeForce2 fps падает до 10). Существует ли механизм, позволяющий решить подобную задачу с меньшими тормозами? Отказаться от подобного я не могу (ну специфическое приложение, где приходится поступать именно так)...
Попробуй использовать ALPHA TEST (проверка альфы перед реальным ALPHA BLENDING'ом т.е. если f(альфа)=false, то блендинга не будет и скорость возрастет).
Существенное замечание. Некоторые драйверы не выставляют флаг PFD_GENERIC_ACCELERATED. Вместо этого используется флаг PFD_GENERIC_FORMAT, который говорит о том, что используется софтварная поддержка OpenGL.