-
Есть визуальный коммпонент лежащий на TPanel исспользует отрисовку с помощью OpenGL.
Когда компонент один то всё рисуется нормально.
Как только появляется второй такой же компонент первый перестаёт нормально рисовать.
Как это можно исправить? Т.е. нужно иметь два компонента выводящих информацию иссползуя OpenGL
-
хм вопервых скорость отрисовки упадёт не в 2 раза а может раза в 4-5 и вовторых наверняка от всех лагов нельзя будет избавится чем ненравится такая система, один экоран разделённый на 2 части??
-
Что за компонент?
Используй wglShareLists для "объединения" контекстов рендера.
-
А можно еще инициализировать графику отдельно для
каждого из компонентов, запомнить соответственно их
DC : HDC;
HRC : HGLRC;
А потом перед отрисовкой на конкретном компоненте
делать вызов нужного
wglMakeCurrent(DC, HRC);
Только вот последняя процедурка иногда жутко тормозит...
видимо, где то там поставили Sleep(). %)
-
Jkot
>чем ненравится такая система, один экоран разделённый на 2 части?
Логически компоненты и данные в них разделены. Поэтому держать данные в двух местах а рисовать их в одном вроде нелогично. Тем более что они могут быть разнесены например один компонент в одном углу второй в другом между ними пространство.
XProger
>Что за компонент?
Самоделка отрисовывающая некторые данные в трехмерном пространстве.
>Используй wglShareLists для "объединения" контекстов рендера.
Где можно почитать про его исспользование?
Rial
>Только вот последняя процедурка иногда жутко тормозит...
Жутко это сколько в цифрах?
Где вообще можно почитать про правильное исспользование OpenGL? У меня данные поступают со скоростью 100 новых значений в секунду. В идеале их нужно отрисовывать с этой же скорость. Т.е. 100fps. Я при приходе новых данных просто вызываю Invalidate. Правилен ли такой подход?
-
> Где можно почитать про его исспользование?
В гугле? :)
На сайте 3dlabs.
ShareList может и не нужен в твоей ситуации.
Что значит не работает?
-
>Что значит не работает?
glMakeCurrent(DC, HRC); у меня вызывалось один раз при создании компонента. И соответственно при создании второго первый переставал отрисовывать :(
>В гугле? :) На сайте 3dlabs.
Это понятно. Просто я думал есть уже проверенные толковые и понятные описания для начинающих.
-
Ааа. ТИпа на сайта разрабов специально описание замороченное? :)))
ShareList расшаривает списки(текстуры, дисплейные, и т.д. и т.п.). Тоесть списки одного РС делает доступными другому РС.
glMakeCurrent(DC, HRC); помог?
-
> Жутко это сколько в цифрах?
Сейчас проверил, все вроде хорошо работает.
Но на некоторых компьютерах бывало, до 2-3мс доходило.
> Где вообще можно почитать про правильное исспользование
> OpenGL?
Краснов, NeHe, RedBook
> У меня данные поступают со скоростью 100 новых значений
> в секунду. В идеале их нужно отрисовывать с этой же скорость.
> Т.е. 100fps.
Думаю, в таком поличестве кадров нет необходимости.
От 25 до максимум 50ти. Больше просто не нужно.
Да и не везде аппаратные возможности позвалят выводить
кадры так часто. Просто обрабатывай данные так часто,
как тебе нужно, а выводи на экран, например, по таймеру.
> Я при приходе новых данных просто вызываю Invalidate.
Да правильный, почему б и нет. Я обычно WM_Paint посылаю,
потому что это можно делать асинхронно (PostMessage):
просто и со вкусом. %) Но и так можно тоже.
-
> glMakeCurrent(DC, HRC); у меня вызывалось один раз при создании
> компонента. И соответственно при создании второго первый
> переставал отрисовывать :(
Нужно при каждой отрисовке вызывать.
-
@!!ex_
>glMakeCurrent(DC, HRC); помог?
Вечером буду проверять. На работе пока не до этого :(
>Ааа. ТИпа на сайта разрабов специально описание замороченное? :)))
Ну оно на английском. И мне не совсем по OpenGL интересно а по тому как организовать нормальное взаимодействие со сценой, данными и дельфи. Как таковую сцену я уже нарисовал и она меня полностью устраивает. Но вот опрос мыши от OnMouseMove при 100 вызовах Invalidate в секунду идёт с явной задержкой :(
Rial
>Краснов, NeHe, RedBook
Красную книгу читаю. Но там больше про то как нарисовать сцену а не про то как с ней работать. Т.е. как правильно организовывать вывод на экран или как правильно организовывать анимацию там нет (хотя я мог и не заметить).
А остальные книги есть в электронном виде?
>Думаю, в таком поличестве кадров нет необходимости.
>От 25 до максимум 50ти. Больше просто не нужно.
>Да и не везде аппаратные возможности позвалят выводить кадры так часто.
Сцена черезвычайно проста. Что то около 1000 линий и парочка простейших многоугольников. Так что вроде должна тянуть. Да и учитывая что я вызываю Invalidate система их вроде длжна объединять и отрисовывать с той скоростью которую может позволить. Или всё же нужно именно Invalidate вызывать реже?
>Просто обрабатывай данные так часто, как тебе нужно, а выводи на экран, например, по таймеру.
Так у меня данные и так по таймеру вводятся так что нужно просто прореживание добавить :) Хотя вроде Invalidate автоматом объединяет все вызовы в очереди сообщений.
>Нужно при каждой отрисовке вызывать.
Ну пока у меня был один компонент это было вроде как ненужно. Или другая прога могла бы у моей перехватить вывод?
-
Да. Другое ОГл приложение может забрать себе контроль.
-
@!!ex_, обычное огл приложение вывод никогда не перехватит )
-
> [11] @!!ex_ (18.06.07 17:58)
> Да. Другое ОГл приложение может забрать себе контроль.
Странно, никогда не слышал о таком.
Это конечно можно специально сделать...
Попробуй запусти 10 приложений OpenGL: они
очень даже мило будут жить бок о бок.
-
> [12] XProger © (18.06.07 18:41)> , [13] Rial © (18.06.07 19:00)
Хм. Ну да. ЛОгично. протупил. Ведь РС ставится для конкретного ДС.....