Допустим, что мы рисуем с помощью Visual какую-нибудь “хитрую” графику. А вывод осуществляем одним из способов:
1) Простым способом отображаем в окне WPF
2) Создаем BitmapSource и передаем его на отрисовку графики OpenGL (адрес неуправляемой памяти для картинки задается на этапе инициализации и далее не меняется)
Вот у меня вопрос: Какой из вариантов будет работать быстрее, если не учитывать время выполнения CopyPixels? Будет ли первый вариант быстрее, т.к. он использует ускорение DirectX нежели второй или они оба его используют?
Здравствуйте, adontz, Вы писали:
A>Лучше не смешивайте в одном приложении DirectX (который используется неявно WPF) и OpenGL.
Да вот проблема. Вся 3D-графика(куплена) рисуется на OpenGL. Нужно наложить 2D слой, который поддерживает векторную графику. руководство решило использовать WPF. Я решил просто создать окно с прозрачным фоном и положить его по верх всех окон — в результате пошли мигания, т.к. видеопамять делилась на DirectX и OpenGL. Если отправлять картинку, то проблема решиться. Вот меня интересует как отразится на производительность?
Здравствуйте, SanyaVB, Вы писали:
SVB>Вот у меня вопрос: Какой из вариантов будет работать быстрее, если не учитывать время выполнения CopyPixels? Будет ли первый вариант быстрее, т.к. он использует ускорение DirectX нежели второй или они оба его используют?
На машинах с дровами из win update не аппаратного ускорения OpenGL. Если у вас действительно проблемы с производительностью — может, стоит использовать D3DImage?
Здравствуйте, SanyaVB, Вы писали:
SVB>Да вот проблема. Вся 3D-графика(куплена) рисуется на OpenGL. Нужно наложить 2D слой, который поддерживает векторную графику. руководство решило использовать WPF. Я решил просто создать окно с прозрачным фоном и положить его по верх всех окон — в результате пошли мигания, т.к. видеопамять делилась на DirectX и OpenGL. Если отправлять картинку, то проблема решиться. Вот меня интересует как отразится на производительность?
Дело не в производительности, от ваших фокусов многие драйвера видеокарт просто заглючат. Либо вам надо иметь просто огромный (десятки) парк физических (виртуалки тут бесполезны) машин для тестирования.
Здравствуйте, Sinix, Вы писали:
S>На машинах с дровами из win update не аппаратного ускорения OpenGL. Если у вас действительно проблемы с производительностью — может, стоит использовать D3DImage?
Да там и DirectX как правило так себе. Хотя да, OpenGL совсем не ускоряется. Кстати видеокарты AMD/ATI обладают существенно худшими (программно ограниченными в функциональности) драйверами OpenGL. То есть одна и та же функция доступна в DirectX и не доступна в OpenGL.
Здравствуйте, adontz, Вы писали:
A>Дело не в производительности, от ваших фокусов многие драйвера видеокарт просто заглючат. Либо вам надо иметь просто огромный (десятки) парк физических (виртуалки тут бесполезны) машин для тестирования.
А это уже интересно. если можно, поподробнее. Я же просто создаю Visul, а далее:
RenderTargetBitmap bitmap = new RenderTargetBitmap(xxx, xx, 96, 96, PixelFormats.Pbgra32);
bitmap.Render(visual);
без отрисовки на окне, контроле, панели. Или в этом случае видеокарта будет напрягаться?
PS: разрешение картинки 800х600
Здравствуйте, Sinix, Вы писали:
S>На машинах с дровами из win update не аппаратного ускорения OpenGL. Если у вас действительно проблемы с производительностью — может, стоит использовать D3DImage?
Я рисую 2D слой и он не накладывается на 3D поверхность. А просто слой выносится на передний план, по типу меню в играх.
SVB>без отрисовки на окне, контроле, панели. Или в этом случае видеокарта будет напрягаться? SVB>PS: разрешение картинки 800х600
Дело не в нагрузке, а в том что вы используете сразу два API в рамках одного приложения. Никто не обещал что это будет работать и это таки время от времени не работает. Причём глюки могут быть на конкретной версии драйверов и могут исчезать и появляться с обновлением версии драйвера. Дело ваше, но я бы себе таких приключений не искал.
Здравствуйте, adontz, Вы писали:
A>Дело не в нагрузке, а в том что вы используете сразу два API в рамках одного приложения. Никто не обещал что это будет работать и это таки время от времени не работает. Причём глюки могут быть на конкретной версии драйверов и могут исчезать и появляться с обновлением версии драйвера. Дело ваше, но я бы себе таких приключений не искал.
А что посоветуешь? А если развести это на две машины и передавать через сеть картинку?
Здравствуйте, SanyaVB, Вы писали:
SVB>А отдельный поток сойдет?
Нет.
SVB>И все же. как в этом случае отразиться генерация изображения? ну так на скидку в 2-3 раза?
Копирование памяти видеокарта умеет делать сама, так что разницы между вариантом с буфером и без вы вообще не должны заметить. Правда буфер должен находится в видеопамяти, это должен быть frame buffer. Для вас это, скорее всего будет выглядеть как рисование напрямую, но с буферизацией OpenGL.
Да, по поводу обмена данными. Я как-то измерял, по named pipes между двумя процессами на одной машине удалось прогнать 750Мб/сек. Это к вопросу об IPC.
ИМХО проще отказаться от WPF, раз уж OpenGL часть куплена.
Здравствуйте, SanyaVB, Вы писали:
SVB>Допустим, что мы рисуем с помощью Visual какую-нибудь “хитрую” графику. А вывод осуществляем одним из способов: SVB>1) Простым способом отображаем в окне WPF SVB>2) Создаем BitmapSource и передаем его на отрисовку графики OpenGL (адрес неуправляемой памяти для картинки задается на этапе инициализации и далее не меняется) SVB>Вот у меня вопрос: Какой из вариантов будет работать быстрее, если не учитывать время выполнения CopyPixels? Будет ли первый вариант быстрее, т.к. он использует ускорение DirectX нежели второй или они оба его используют?
Может попробовать отключить аппаратное ускорение WPF? http://msdn.microsoft.com/en-us/library/aa970912.aspx