Многопоточная работа с OpenGL (комментарии)
Это сообщение сгенерировано автоматически.
Спасибо за материал.
Было бы неплохо — добавить в начале статьи Введение, где написать, зачем нужно распараллеливание. Простой абзац с мыслями из части «Рендеринг в параллельном потоке».
Спасибо, как раз вовремя.
В статье стоит добавить "Тесты", где бы автор на реальных примерах (числах) показал преимущества такого подхода в сравнении с тем же примером, но без распараллеливания.
Может я не внимательно читал, но с ходу кажется, что "Рендеринг в параллельном потоке" не должен дать никакого прироста, так как видеокарта одна на всех. Можно немного теории по этому вопросу в статье?
/A\
> Часть исходников были взяты из уроков KpeHDeJIb'я.
У меня и имя есть )
Прочитать еще не успел, как прочитаю дам какой-то более осмысленный комментарий.
Согласен с paulS. В чем профит использования разных контекстов в разных потоках?
Асинхронная загрузка ресурсов - это немного другая проблема. Она решается и с одним контекстом.
В случае асинхронности контекстов мы получим дополнительный профит только во время glTexImage2D или glBufferDataARB?
Но в реалтаймовых приложениях интенсивность этих операций вроде не столь высока... Разве что в Rage? =)
И еще вопрос. Что на счет swapBuffers?
Не будет ли проблем с тем, что два потока одновременно вызовут его?
Поидее даже если не будет проблем то прироста производительности это не даст.
paulS
> В статье стоит добавить "Тесты"
добавил замеры времени выполнения функций и тесты распараллеливания, потом напишу еще один тест.
> Может я не внимательно читал, но с ходу кажется, что "Рендеринг в параллельном
> потоке" не должен дать никакого прироста, так как видеокарта одна на всех.
> Можно немного теории по этому вопросу в статье?
В одном потоке видеокарта используется не 100% времени, в возникающие промежутки может рендерится другой поток.
Например так:
|--1--|-2-|-3-|--1--| |-|___|----4----|___|
1 - рендеринг в окно
2 - SwapBuffers + вертикальная синхронизация
3 - обработка сообщений окна
4 - рендеринг в параллельном потоке
false3d
> И еще вопрос. Что на счет swapBuffers?
SwapBuffers вызывается только в одном потоке, остальные рендерят в текстуру
> Не будет ли проблем с тем, что два потока одновременно вызовут его?
вызвать SwapBuffers для первого потока из второго?
даже если не будет проблем, то для этого нужно для второго окна сделать текущим контекст рендеринга из первого и перед этим отключить контекст в первом окне, а после свапа возвращать нужные контексты. wglMakeCurrent работает не так быстро чтобы вызывать его 4 раза за кадр.
/A\
На счет распараллеливания теперь яснее. Впринципе да, пока процессор готовит данные, сортирует, кулит считает AI и физику, мы можем в это время рендерить другой поток.
Но с таким же успехом мы можем сделать распараллеливание и имея один контекст. Ведь после вызова glFinish видеокарта пошла работать а мы можем делать свои дела в другом потоке. Или тут еще чето другое подразумевается?
На счет swapBuffers я скорее имел ввиду glFinish в нем вызываемый.
Допустим такая ситуация - первый поток делает свап баферс и зависает на glFinish (ждем видюху), а в этот момент другой поток отрендерил сцену в текстуру и в момент анбинда FBO (поидее тоже вызывается glFinish). Вот в этом случае проблем не будет?
false3d
> мы можем в это время рендерить другой поток.
Мы это и так можем делать, все команды OpenGL асинхронны - вызвал команду и делай что хочешь, видеокарта в это время работает.
В моем понимании лучше параллелить подготовку данных, а сами данные использовать в основном потоке. Опять же я до сих пор не нашел времени детально ознакомиться с текстом и пока еще не могу судить что, как и почему.
KpeHDeJIb
> все команды OpenGL асинхронны - вызвал команду и делай что хочешь
Т.е., например, glDrawElements с привязанным буферным объектом мгновенно возвращает управление в программу?
Я не нашёл ответ на этот вопрос в интернете. Опять самому надо тестировать.
KpeHDeJIb
> я до сих пор не нашел времени детально ознакомиться с текстом
Действительно, зачем его читать, главное настрочить побольше комментов.
paulS
> Действительно, зачем его читать, главное настрочить побольше комментов.
Я по поводу текста поэтому и не давал никаких комментариев, если вы не заметили. Впрочем может у вас как раз и есть эта болезнь?
KpeHDeJIb
>Мы это и так можем делать, все команды OpenGL асинхронны - вызвал команду и делай что хочешь, видеокарта в это время работает.
Во первых glFinish не асинхронна, во вторых я о ней и говорил, что пока на ней висит первый поток второй делает полезную работу, но что если в этот момент второй поток вызовет glFinish тоже?
paulS
>Т.е., например, glDrawElements с привязанным буферным объектом мгновенно возвращает управление в программу?
типа того. Команды буферизируются и далеко не сразу идут на обработку видеокартой. А вот после вызова glFinish собственно и начинается процесс обработки ранее переданных данных.
false3d
> Во первых glFinish не асинхронна
Простите, а зачем ее звать? Она делает столл, использовать ее нужно только в самых исключительных случаях. То же самое и glFlush, который навязывает драйверу вашу волю, без которой он, скорее всего, смог бы работать эффективней.
ЗЫ. Ну вобщем-то http://www.opengl.org/wiki/Common_Mistakes#glFinish_and_glFlush немного написано про это.
KpeHDeJIb
> Простите, а зачем ее звать? Она делает столл, использовать ее нужно только в
> самых исключительных случаях. То же самое и glFlush, который навязывает
> драйверу вашу волю, без которой он, скорее всего, смог бы работать эффективней.
Как на счет свап бафферс, он ведь внутри себя glFinish и зовет. И анбинд FBO... Разве нет?
Или не стоит свап бафферс звать? =)
Тема в архиве.