Интерфейс на DirectX, OpenGL или GDI+ ??? ...

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

DarkMachine
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 24.02.2012 (Пт) 15:58

Интерфейс на DirectX, OpenGL или GDI+ ??? ...

Сообщение DarkMachine » 22.10.2013 (Вт) 9:54

Нужен совет!

Имеется програмная система, которая выводит численную информацию в сетку (грид): 8 строк, 12 столбцов. Для отрисовки используются элемент управления Label, на каждую строку по одному Label-у. Соотв-но, численная информация формируется в строке и выравнивается, а затем рисуется.
Помимо этого, есть ещё и управляющие кнопки по 2 на каждую строку и пара других кнопок.
Основной цикл уходит на вычисления и сетевую связь (данные поступают очень быстро) - всё делается в отдельных потоках.
Заметил, что реакция на нажатия кнопок замедлено, когда идут вычисления и рисуются числа. В программе рисование этих вот чисел одна из ресурсоёмких.
Я вот подумал, увеличиться ли производительность, если интерфейс перенести полностью на графику: то бишь, кнопки и числа рисовать, а не использовать элементы. Элементы статичны в своих положения, так что абсолютные координаты постоянны.
Есть варианты:
1. Рисовать на полном экране используя DirectX и выгрузить GDI от прорисовки элементов
2. Рисовать всё в буффер битмат, а потом все выводить в окно используя GDI+
3. Вместо DirectX использовать OpenGL

Стоит ли овчинка выделки? Насколько быстро прорисовывается текск в DirectX?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3819
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Интерфейс на DirectX, OpenGL или GDI+ ??? ...

Сообщение Mikle » 22.10.2013 (Вт) 11:19

В DirectX есть d3dx.DrawText, но этот метод тоже тормозной. Обычно для скорости предварительно рендерят шрифт в текстуру и выводят символы с помощью квадов с этой текстурой.
Но нужно ли это? Если 8 Label-ов тормозят, то, видимо, информация в них меняется слишком часто, всё равно это невозможно успеть прочитать. Не проще ли ограничить частоту перерисовки Label-ов?

DarkMachine
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Интерфейс на DirectX, OpenGL или GDI+ ??? ...

Сообщение DarkMachine » 22.10.2013 (Вт) 12:39

Спасибо за совет. Думал об этом тоже. Частоту перерисовки могу уменьшить в два раза, но это может повлиять на мониторинг.
Частота информации макс. 10 изменений в секунду.
Я вот ещё думал все перенести на плечи Listview, но его перерисовка оказалось ещё медленнеё.
Там есть ещё и момент раскрасти ячеек. Всего три цвета, меняются в зависимости от вычислений. 96 ячеек могут перекрашиваться в разные цвета одновременно. Пробовал также использовать двойной буффер для вывода всей информации - тоже медлить стало, но не так сильно.

И всё таки, что будет быстрее: рисовать текст стандартными средствами или подготовить свой шрифт и рисовать в памяти и потом выводить?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3819
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Интерфейс на DirectX, OpenGL или GDI+ ??? ...

Сообщение Mikle » 22.10.2013 (Вт) 14:09

DarkMachine писал(а):И всё таки, что будет быстрее: рисовать текст стандартными средствами или подготовить свой шрифт и рисовать в памяти и потом выводить?

Конечно второе, только зачем "рисовать в памяти", можно прямо на форму?
Но у меня есть подозрения, что в программе есть, что оптимизировать.
В каком виде данные приходят по сетке? Single, Integer, или может уже String?
А происходит ли перезапись значения Label.Caption, если записываемое совпадает с тем, что там есть уже? Или проверяется?
Если проверяется, то два значения Single между собой, или как-то так:"If Label(1).Caption = Format(Value(1), "00.00") Then..."?
BackStyle у Label, надеюсь, не Transparent?

DarkMachine
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Интерфейс на DirectX, OpenGL или GDI+ ??? ...

Сообщение DarkMachine » 22.10.2013 (Вт) 14:32

Данные сырые, преобразyю в формат Single, всё собирается в буффер, затем в отдельном потоке формируется строки со значениями и по завершению вызывается другой поток для рисования. Проверка на совпадения непроверяются - т.к. рисуются всего 8 строк. Я организовал так,что столбцы виртуальны, есть только строки, а столбцы формируются внутри строк:
L1(1).caption=FORMAT(v(1), fmt1$) & spacer1$ & FORMAT(v(2), fmt1$) & spacer2$ & и т.д.
BackStyle у Label - не Transparent


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList