Здравствуйте, Skorodum, Вы писали:
Pzz>>Насколько я понимаю, оно там не вокруг програмного event loop крутится, а вокруг OpenGL-ного. S>OpenGL же нет никакого event loop. OpenGL точно также используется и Qt, просто абстракция потольще, но это не значит, что менее эффективная.
OpenGL — это абстракция про то, как рисовать с помощью видеокарты (GPU). Qt может использовать OpenGL для отрисовки, а может и не использовать (например, он может использовать примитивы Win32 или Xlib). А еще Qt может менеджить OpenQL-ное окошко, в котором будет своя собственная, ему неведомая жизнь, а он только место на экране выделит и рамочку к нему пририсует.
Здравствуйте, Pzz, Вы писали:
Pzz>В Qt ты нарисовал в окошко, и если ничего не происходит, оно так и висит в видеопамяти, отрисованным. До следующего изменения никто ничего с ним не делает.
Речь про цикл, он есть в обоих фреймворках.
Pzz>В immediate mode GUI окошко натурально перерисовывается на каждом кадре.
При желании в Qt можно делать и так. Тут
Здравствуйте, Pzz, Вы писали:
Pzz>OpenGL — это абстракция про то, как рисовать с помощью видеокарты (GPU). Qt может использовать OpenGL для отрисовки, а может и не использовать (например, он может использовать примитивы Win32 или Xlib). А еще Qt может менеджить OpenQL-ное окошко, в котором будет своя собственная, ему неведомая жизнь, а он только место на экране выделит и рамочку к нему пририсует.
Какое это имеет отношение к вопросу про эффективность Qt vs ImGUI и введеному вами термину "OpenGL-ный event loop"?
Здравствуйте, Skorodum, Вы писали:
S>>В этом не уверен. Если у вас 20 контролов типа QLabel и вы по очереди в каждом из них меняете текст, то я не уверен, что Qt отрисует все это за один раз. Вроде бы он будет отдельно перерисовывать каждый из них. Т.е. вызвали setText и контрол пошел меняться не зная ничего о том, что следом будет меняться и другой контрол. S>Конечно же, это не так.
Это отрадно, конечно, но ничего не говорит о том, что Qt узнает, что следом должен быть отрисован другой QLabel. Да, Qt не будет перерисовывать текст прямо внутри вызова setText, но где гарантии, что после 20 вызовов setText для 20 разных QLabel отрисовка будет сделана в один общий заход?
S>>В immediate mode вы будете создавать эти 10 кнопок и 15 однострочных редакторов каждый раз, при каждом отображении. И каждый раз вы будете в них устанавливать то, что вы хотите отобразить. S>Ок, это делает Diar ImGUI менее эффектитвной.
Busy waiting на spin-lock-е тоже менее эффективна в каком-то смысле. Тем не менее за скорость готовы платить.
S>>Потому что вы управляете моментом когда нужные вам вещи перерисовываются. Тогда как в Qt вы вызываете какой-то метод у виджета, типа смены текста или заморозки/разморозки, а когда и как это случится вам уже неподвласно. S>Конечно же, это не так.
Что-то я вижу в примере вообще не то, о чем я говорил. Вы вызываете у QLabel метод setText и вы не знаете когда именно перерисовка случится. Если после вызова setText нужно еще и вручную repaint вызывать, да еще и для 20 таких объектов, то это такое себе.
S>TLDR: Qt можно использовать точно так же, как и Dear ImGUI
Мне кажется, вам нужно попробовать что-то запрограммировать на Dear ImGUI. Потому что лично у меня не возникло ощущения, что Qt можно использовать точно так же, как Dear ImGUI.
Здравствуйте, so5team, Вы писали:
S>Это отрадно, конечно, но ничего не говорит о том, что Qt узнает, что следом должен быть отрисован другой QLabel. Да, Qt не будет перерисовывать текст прямо внутри вызова setText, но где гарантии, что после 20 вызовов slot does not cause an immediate repaintдля 20 разных QLabel отрисовка будет сделана в один общий заход? Документация прямо об этом говорит.
The QWidget::update() slot does not cause an immediate repaint; instead it schedules a paint event for processing when Qt returns to the main event loop.
Все последовательные обновления виджетов будут перерисованы один раз при возвращении в цикл событий.
label1->setText("Hello world 1");
...
label20->setText("Hello world 20");
Это одна перерисовка.
S>Что-то я вижу в примере вообще не то, о чем я говорил.
Он делает ровно то, что вы говорили: синхронно обновляет виджет 60 раз в секунду. Рисуйте стрелки.
S>Вы вызываете у QLabel метод setText и вы не знаете когда именно перерисовка случится.
1. Те, кто читают документацию знают — при возврате в цикл событий.
2. Можно вывзать обработчик событий явно
3. Можно и ручками синхронно рисовать как показано выше (зачем — вопрос к вам).
S>Если после вызова setText нужно еще и вручную repaint вызывать, да еще и для 20 таких объектов, то это такое себе.
И действительно, зачем вам такое?
S>Мне кажется, вам нужно попробовать что-то запрограммировать на Dear ImGUI. Потому что лично у меня не возникло ощущения, что Qt можно использовать точно так же, как Dear ImGUI.
У вас какое-то очень странное представление о Qt. Я, честно говоря, очень удивлен.
Здравствуйте, K13, Вы писали:
K13>Будет вызван метод "пометить виджет как грязный", и в конец очереди событий запрос на перерисовку. K13>Те области, которые попадают в видимую часть экрана/окна, пойдут запросом через paintEvent к конкретным QLabel в пределах одного обновления
Причем это так как минимум со времен Qt 4, т.е. 20+ лет. Откуда у людей альтернативные версии Наверное, это травмы от работы с MFC, ImGUI.
Здравствуйте, Skorodum, Вы писали:
S>Все последовательные обновления виджетов будут перерисованы один раз при возвращении в цикл событий.
Кто вам сказал? Вашу GUI-нить могут прервать между 10-м и 11-ым вызовом, а за время пока она спит, в цикл событий может нападать еще чего-нибудь.
S>>Что-то я вижу в примере вообще не то, о чем я говорил. S>Он делает ровно то, что вы говорили: синхронно обновляет виджет 60 раз в секунду. Рисуйте стрелки.
Вот мои слова: "Тогда как в Qt вы вызываете какой-то метод у виджета, типа смены текста или заморозки/разморозки, а когда и как это случится вам уже неподвласно." Здесь нет ничего про синхронное обновление виджета 60 раз в секунду.
S>1. Те, кто читают документацию знают — при возврате в цикл событий.
И когда же этот возврат произойдет?
S>>Если после вызова setText нужно еще и вручную repaint вызывать, да еще и для 20 таких объектов, то это такое себе. S>И действительно, зачем вам такое?
Например, при отображении одного кадра из видео потока нужно изменить 20 показателей, связанных с видеопотоком.
S>>Мне кажется, вам нужно попробовать что-то запрограммировать на Dear ImGUI. Потому что лично у меня не возникло ощущения, что Qt можно использовать точно так же, как Dear ImGUI. S>У вас какое-то очень странное представление о Qt. Я, честно говоря, очень удивлен.
У меня был в далеком прошлом опыт работы с Qt (Qt3/Qt4). Остались впечатления как об очень удобном, но тормознутом инструменте. Т.е. заниматься формошлепством в Qt одно удовольствие. Делать что-то шустрое (в моем случае нужно было отображать телеметрию по мере ее съема, в том числе кусочки получаеммых из контролируемых приложений логов) -- да ну нафиг, там чуть ли не половину времени съедали преобразования между QString и внешним миром.
А в недалеком прошлом небольшой опыт работы с ImGUI.
И да, я понимаю, как в Qt сделать отображение информации с заданным темпом.
Но это будет ну вот сильно не так, как в ImGUI. Поэтому я и говорю, что нет у меня ощущения, что Qt можно использовать точно так же, как ImGUI.