![]() |
Страницы (3): [1] 2 3 » Показать все 31 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- OpenGL (https://hlfx.ru/forum/forumdisplay.php?forumid=7)
-- OpenGL vs Direct3D (https://hlfx.ru/forum/showthread.php?threadid=4400)
OpenGL vs Direct3D
Т.к. ни для кого уже не секрет, что я занимаюсь мультирендером в волатиле, решил создать тему, где буду делиться впечатлениями от обоих API (OpenGL, D3D9) при решении одних и тех же задач.
Если у вас есть собственные наблюдения - пожалуйста, давайте делиться ими в этой теме.
Пока могу сказать, что D3D нравится всё больше и больше.
Назову два интересных момента.
1) Сглаживание (multisample)
Для включения MSAA в OpenGL под виндой требуется пересоздавать окно программы! Почему? Оч. просто. Сначала нужно создать контекст и получить кои-какие функции WGL, т.к. в винде имеются только функции GL 1.1, и остальные надо получать через расширения. Без контекста их получить нельзя. А заодно надо проверить, поддерживается ли MSAA драйвером. Но чтобы создать контекст, надо установить пиксельформат. А изменить его для одного и того же окна уже никак нельзя.
В D3D есть функция CheckDeviceMultisampleType, её можно вызвать до создания девайса. Ничего пересоздавать не требуется.
Справедливости ради отметим, что в Linux окно тоже пересоздавать не нужно, GLX реализован грамотнее, чем WGL.
2) Многопоточный рендеринг
Контекст OpenGL может быть current только для одного потока в каждый момент времени. Поэтому, если мы желаем рисовать в отдельном потоке, надо вызывать в нём wglMakeCurrent. Но что если нам надо, вернувшись в основной поток, тоже выполнить какую-нибудь GL-команду, да хотя бы glReadPixels для скриншута? Мы должны вызвать wglMakeCurrent в основном потоке. Но он уже вызван в потоке рисования! Значит, после рендеринга надо освободить контекст в потоке рисования. Т.е. мы вызываем wglMakeCurrent( hdc, hglrc ) два раза за кадр - в потоке рисования и в основном, а также wglMakeCurrent( hdc, NULL ) тоже два раза. Можно, конечно, слегка оптимизировать, вызывая wglMakeCurrent в основном потоке только тогда, когда мы собираемся выполнять команды OpenGL. Но это сильно усложняет логику - ведь команда снятия скриншута может поступить, вообще говоря, на любом кадре, или, скажем, игрок захочет подгрузить доп. текстурку (скин модели игрока). Но в любом случае как минимум один раз пара вызовов wglMakeCurrent будет вызвана. А эта команда, вообще говоря, довольно затратная - это мы знаем ещё по использованию pbuffer (одна из причин его замены на FBO - именно этот wglMakeCurrent).
В D3D, согласно документации, есть "внутренние механизмы синхронизации", поэтому никакие функции вызывать не надо, можно смело дёргать команды отрисовки из любого потока. В итоге выигрыш от многопоточности становится ощутимее.
__________________
Первый пункт... Ну, в общем-то мне плевать на сглаживание. А если учесть разрешения современных дисплеев, то без него вполне можно обойтись при 1920х1080 и даже при более низком кол-ве пикселей. А вот второй... Если D3D менее затратен, это даёт ему хорошее преимущество. Как человек, ничего толком не смыслящий в кодинге графики, в очередной раз напишу: D3D рано или поздно изломается с новой версией винды. А OpenGL будет соместим. Ну или по-любому будет враппер OpenGL-D3D, исправляющий несовместимость. А вот обратно навряд ли. Уж больно они говённые, врапперы из D3D в OpenGL.
Добавлено 17-05-2014 в 03:33:
У проектов на d3d есть одно маленькое но довольно интересное преимущество (по моим наблюдениям) - они не так капризны к драйверам. Ну т.е. таже халфа спойкойно работает на любом офисном древнющем компутере в д3д, а огл не робит и всё тут - иди ищи дрова .
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
__________________
Тема интересная, жаль что её опять свели к драйверам и осям.
__________________
ㅤ
XaeroX про мантл расскажи что-нибудь. Мне интересно, за ним ли будущее?
Вообще преимущества Д3Д очень сомнительные. Т.е. скорее для программера, чем для юзера (т.к. последнему важнее что его игра запускается везде где надо).
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
Дядя Миша
Ещё раз повторю. Если ты не понимаешь, как что-то можно сделать, это не означает, что это сделать нельзя. И незачем пытаться сводить всё к абсурду, все давно в курсе про твоё искромъотное чувство юмора.
__________________
Я не про то, что нельзя. Я про то, что смысла не имеет.
Даже с мультипоточным рендерером маленькая комнатка с мягкими партиклами выдаёт 30 фпс на 9800GT. Я полагаю в однопоточном рендере будет даже быстрее, из-за отсутствия потерь времени на синхронизацию потоков.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Забавно
Тестирую волатилу, карта с кучей полигонов (арканос), оптимизации нет, все сурфасы рисуются скопом, даже без сортировки. Вертексный буфер, но в системной памяти.
OpenGL: 400 fps
Direct3D9: 800 fps
SMP, 4xFSAA, 16xAA.
Крутил и так, и эдак - D3D9 упорно выдаёт более высокий фпс.
Такие дела...
__________________
XaeroX Это GTX275? Если что-то слабее взять, то как с FPS дела?
__________________
Base Defense on Steam, ModDB
На других пока не тестировал. Это, так сказать, первичные замеры.
Буду делиться наблюдениями и дальше.
__________________
Временная зона GMT. Текущее время 01:04. | Страницы (3): [1] 2 3 » Показать все 31 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024