Qt+OpenGL benchmarking Q

А вот, я извиняюсь, такой вопрос.

Есть QGrahicsScene (унаследованное от нее) в которой я в drawBackround вывожу OpenGL-ем нечто.

В процессе разбирательств с OpenGL я это нечто имплементировал десятком разных способов и хочу теперь померять, какой из них быстрее.

Но как?

Ну то есть я сделал бенчмарковый вызов, который зумит (еще панорамирует, переключает нужные мне битмепы и т.п., не суть) в таком вот духе:

for(.....){
myview->setZoom(...);
QApplication::processEvents();
}

Но получается вот что:

  • FPS-ов ровно 60 (2000 итераций за 34 секунды), OGLFormat::setSwapInterval(0) не помог.
  • Одно ядро процессора полностью загружено.
  • По профайлеру, загружено оно QWindowsWindow::raise() (~70% по профайлеру), вообще весь прочий код занимает остальные 30% CPU, моего кода вовсе не видно.

Так слона не продать.

Ну то есть понятно, можно в OpenGL-рисовалке рисовать одно и то же 10 (100,1000) раз подряд, но вопрос заключается в том, нет ли более прямого пути, который позволяет Qt-GUI программы побенчмаркать попроще?

Update: если вдруг кому интересно, то проблема решилась глобальным выключением VSync в настройках драйвера (NVidia). FPS-ы сразу сильно выросли, а профайл исполнения стал похож на настоящий.

Про Qt и OpenGL

С помощью профайлера и отладчика узнал прекрасное.

Прекрасное, конечно же, описано в мануале, но кто же их читает:

QGLContext::DefaultBindOption LinearFilteringBindOption | InvertedYBindOption | MipmapBindOption In Qt 4.5 and earlier, bindTexture() would mirror the image and automatically generate mipmaps. This option helps preserve this default behavior.
А я все удивлялся, отчего у меня bindTexture для ~мегапиксельной картинки выполняется миллисекунд 20. Ну конечно, оно переворачивает изображение.

Оторвал. Стало быстрее раз в 10 минимум (на глазок, по профайлеру).

Из другого прекрасного:

  • Если использовать QOpenGLBuffer::bind() и потом, после рисования или заполнения, не сказать ему QOpenGLBuffer::release(), то в QGraphicsView/Scene отваливается отображение элементов, нарисованных стандартным путем (через addItem).
  • Если генерировать структуры руками (glBindTexture/glTexImage2D), но забыть про установку фильтрации, то текстура вовсе не отображается.
Как я уже писал, сколько же есть вещей, которые я предпочел бы не знать.

День прошел не зря.

OpenGL Qs

Сразу предупреждаю: с OpenGL я пытаюсь работать всего неделю (был еще подход к снаряду, но началось лето и я переключился на МонголиеКарелии), поэтому вопросы у меня, вероятно, глупые и вообще про разное.

Вопросов, собственно, три:

1. Допустим, у меня очень простая сцена, два треугольника, образуют прямоугольник, на них натягиваю текстуру (собственно, картинку, которую хочу показать).

Вопрос: есть ли смысл связываться с VBO или 6 пар вызовов glTexCoord2f()/glVertex2f() не будут заметно медленнее? А если прямоугольник не один, а, к примеру, 64 (картинка 8000x8000, а на предельный размер текстуры я заложусь как 1024x1024), будет ли заметный выигрыш, если загнать все в буфер(ы) и дергать рисование меняя только индексы?

Это мне больше для понимания, понятно что как только захочется что-то нарисовать шейдером, так сразу VBO понадобятся.

2. В Qt5 есть (старые) QGL*-объекты, есть новые QOpenGL*.

Кто бы рассказал, в чем разница....

3. Ну и вообще, Qt-шные примеры, что из комплекта, что найденные в сети, какие-то частично безумные. То слишком простые, то вроде простой - а шейдеры там внезапно "#version 330", то - очень хороший пример boxes из поставки - но переусложненный, начинаешь от него куски отпиливать и все разваливается.

Нет ли каких-то Qt-OpenGL tutorials, которые бы с одной стороны были бы "современными" (в смысле используемых Qt-интерфейсов), интересными (не банальный QGLWidget::paintGL()), но и не слишком сложными.

О переходниках Hasselblad - Mamiya 645

Вдруг кому интересно.

  1. Если вы используете, к примеру, мирексовский адаптер а на нем бутерброд из хасселевской оптики и переходника с хасселя на 645-ю мамию
  2. И если у вас, как и у меня, в этом бутерброде нет бесконечности (не безумная проблема на тилт-переходнике, можно наклонить на градус-другой, но неаккуратненько).
  3. То: на ebay появились переходники другой конструкции (не Fotodiox и полные аналоги), которые оную бесконечность дают.
Отличаются конструкцией, у них не два кольца вставляющиеся друг в друга (как у Fotodiox), а выточено из одного кольца и байонетная часть сделана накладной пластиной.

Вот такие вот:

Но есть ньюанс, о котором ниже.

На следующей картинке, под катом, те, которые бесконечности не дают, все черные:

Про Nvidia

Если кто вдруг не видел. На Supercomputers 2012 у Nvidia был свой уголок, NVidia Technology Theater. Где выступали всякие интересные люди со всякими интересными презентациями.

Если кто не видел, рекомендую пойти на архив записей и повтыкать. Там дурацкий интерфейс, надо в правом блоке (где "чат") ткнуть в закладку "видео" и пораскрывать ее. Скажем, про CARMA мне было весьма интересно.

Чтобы два раза не вставать: утро понедельника - время для общефилософских рассуждений

Мне ужасно не нравится, то что сейчас происходит в GPGPU-мире:

  • Есть Nvidia с CUDA и с аккуратно спрятанным под ковер OpenCL. То есть OpenCL 1.1 в драйверах есть, но компания делает вид, что никакого OpenCL в природе не существует. Где, к примеру, OpenCL 1.2? При этом, в HPC-области NVidia очевидный лидер, если кто-то делает HPC-софт, то делает он его в первую очередь под CUDA (ну, насколько я вижу).
  • Есть OpenCL, в который кинулся весь остальной мир. И на CPU и на GPU и на x86 и на ARM и на прочих архитектурах. Если писать что-то для более-менее массового юзера, то очевидно что на OpenCL, ибо рынок куда шире.
Душераздирающее зрелище.

О надежности RAID

Я был уверен, что читал про это в известной гугловой бумаге про надежность дисков, однако быстрым просмотром этого не нашел. Значит ветром надуло.

"Это" - такой практический факт, что если у вас вылетел диск в RAID, то шансов словить проблемы с еще одним диском в том же массиве в процессе ребилда - много. Настолько много, что мы в АиП с этим несколько раз сталкивались вживую, несмотря на то что парк серверов у нас - маленький.

Материалистическое объяснение понятно - в процессе ребилда нагрузка на диск(и) максимальна, если кто-то из них уже дышит на ладан, то тут оно и настанет.

Я умный, поэтому для рабочих данных использую RAID6. Все-таки вероятность того, что при ребилде вылетит два диска - она сильно меньше. Ну, к примеру, если RAID5 окончательно портятся в 5% случаев ребилда (что явно завышенная оценка), то значит RAID6 так убить получится в 1/400 = 0.25% ребилдов. С учетом бэкапов и всего такого (и реальной частоты ребилдов - ну пусть даже раз в месяц, реально много меньше) - меня это устраивает (а 5% - не устраивает).

Но вчера - чуть не налетел и с RAID6. Естественно, ровно по собственной глупости: у меня в рабочем массиве стоят (стояли) 6 штук старых 1Tb Seagate Barraсuda ES.2. Они греются заметно больше, чем WD RE4, медленнее, да и вообще им уже по 4 года, пора менять (на WD RE4, которых в этом массиве еще два). Ну вот я пару WD RE4 вчера и принес из лабаза, пару сигейтов вытащил, заменил, поставил ребилдиться.

И что вы думаете? Первый - перестроился (Adaptec 5805 их по одному перестраивает), а в процессе перестройки второго - вылетел один из старых сигейтов. На час раньше - и прощай данные. Ну то есть вернуть старый диск - не дали бы, если такой возвращаешь он все едино считается новым, таймстампы то разошлись.

Пойду свечку поставлю. Те 4Tb данных, что на этом массиве лежат, - на 99% дублированы на другой NAS и на 90% в оффлайн, но даже 1% потерять было бы необычайно обидно.

Про Qt5: книжки? примеры? руководства?

По случаю выхода Qt5 Beta2, хочу ею овладеть.

Причем, овладеть по-взрослому, по-мужски!

Ну то есть вот в RawDigger я утомился рисовать собственно GUI на C++, очень хочу делать это декларативно, в грубой форме, на Javascript-е. Особенно это касается всяких форм с большим количеством элементов, но и всего остального гуя - тоже.

Проблема только в том, что я совершенно не представляю себе, как это сделать. Ну то есть этот язык у меня в состоянии "читаю, что-то понимаю, сам написать не могу". При этом, понятно, одним QML+JS у меня никак не обойдется, какие-то core-вещи всяко на C++, а дальше как-то с ними интегрироваться.

Вопрос: а есть ли какие-то систематические источники информации. В свое время пара книжек по Qt4 мне очень помогли. Я их не читал, но пролистал и многое - осознал. Хочу такого же, но для Qt5+QML2. Или не такого же, другого. Каких-то писучих блоггеров, которые про Qt5 пишут, может быть какие-то живые проекты, не знаю. Посоветуйте.

О скайпах

Надо сказать, что сегодняшняя истерика (и еще тут) изрядно позабавила потревожила.

Ну то есть я сделал как там написано - но в скайп никакое уведомление с URL-ом не пришло. Пришло, как и должно быть, на почту. То есть дырки какбэ нет. Может быть быстро отключили, да.

Update: в комментах пишут, что работает! Нотифай приходит именно в новый аккаунт.

Но при этом я обнаружил на своем емейле два каких-то левых неизвестных мне аккаунта (что тоже неудивительно с моим емейлом: предложения что-то кликнуть для подтверждения регистрации мне регулярно приходят). Им будет сюрприз!

RawDigger 0.9.13

Как и предсказывалось, вышли новые "релизные" версии RawDigger:

Русская 0.9.13 от 0.9.13-RC3 отличается только номером версии. Соответственно, RC3 вам должна сказать, что есть версия поновее.

Отличаются языковые версии, как и всегда:

  • языком мануала
  • именем сайта, на который они ходят за апдейтами
Приветствуются анонсы новой версии в русско- и англоязычных фото-сообществах. Текст для анонса можно смело брать по ссылкам выше.

RawDigger 0.9.13 RC3

Попрошенные вчера вечером изменения оказались настолько небольшими, что я их взял и сделал.

Хочется надеяться, что "релиз" 0.9.13 от этой версии будет отличаться только названием версии:

Изменения:
  • Убраны всплывающие информационные окошки (при чтении файла и т.п.), теперь эти тексты выводятся в нижней строке окна.
  • При достижении пределов по "Next file"/"Prev file" - программа (противно) пищит и сообщает о проблеме в нижней статусной строке.
  • Опция 'Multi-core/Multi-CPU processing' - ликвидирована, как и было обещано. Многопоточность включается сама при количестве CPU/ядер более одного.
  • Актуализирован мануал.

RawDigger 0.9.13 - второй релиз-кандидат

Кто скачал "RC1" (т.е. по ссылкам из предыдущего поста до 22:10 10.11.12 время Московское) - возьмите теперь RC2. Исправления:
  • 'Next File' не работала на первом файле каталога (да, я так тестирую :) - у меня в тестовом каталоге, так уж совпало, первый файл лежит неподдерживаемого формата и на него я никогда не попадал).
  • Если Next или Prev - запрещена т.к. мы дошли до одного из краев, то при смене порядка сортировки в Preferences - это запрещение сбрасывается.

RawDigger 0.9.13 (RC3)

Граждане фотографы!

Вашему вниманию предлагается RawDigger 0.9.13 Release Candidate 1 2 3:

Update: В RC2 исправлена бага с "залипанием" на первом файле каталога: на нем не работало "Next file".

Часть из этих изменений уже была показана изумленной публике, а часть - совсем свежая.

Документация пока не обновлена, остается от версии 0.9.12, поэтому привожу

Changelog с комментариями

Pages

Subscribe to blog.lexa.ru: все статьи