GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 05:28
Оценка:
Здравствуйте!

У меня через GDI+ рисуется порядка сотни прямоугольников с закругленными углами. Вот просто на глаз видно, как они медленно и печально появляются на экране. Произвел замер — время отрисовки колеблется от 50 мс до 250 мс. Это чудовищно долго. И не понятно, почему время отрисовки так скачет.

Кто виноват и что делать?
Маньяк Робокряк колесит по городу
Re: GDI+ - супер тормоз?
От: Pavel Dvorkin Россия  
Дата: 28.10.22 05:49
Оценка:
Здравствуйте, Marty, Вы писали:

M>У меня через GDI+ рисуется порядка сотни прямоугольников с закругленными углами. Вот просто на глаз видно, как они медленно и печально появляются на экране. Произвел замер — время отрисовки колеблется от 50 мс до 250 мс. Это чудовищно долго. И не понятно, почему время отрисовки так скачет.


M>Кто виноват и что делать?


Для начала отрисовать их без GDI+, просто через RoundRect. Может, дело не в GDI+
With best regards
Pavel Dvorkin
Re[2]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 06:29
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

M>>Кто виноват и что делать?


PD>Для начала отрисовать их без GDI+, просто через RoundRect. Может, дело не в GDI+


На самом деле, у меня там не RoundRect'ы, а пути, которые я потом заполняю. Потому, что у меня фигуры могут быть не обязательно прямоугольники, а произвольные их слияния (буквой Г, например).
Интерфейс у меня написан для GDI и для GDI+, но простой GDI дуги закруглений неряшливо присует. Вот так выглядят тайминги отрисовки:

  С закруглениями
GDI+
DoPaint: 141ms
DoPaint: 172ms
DoPaint: 125ms
DoPaint: 125ms
DoPaint: 140ms
DoPaint: 125ms
DoPaint: 94ms
DoPaint: 125ms
DoPaint: 125ms
DoPaint: 125ms
DoPaint: 141ms
DoPaint: 125ms
DoPaint: 157ms
DoPaint: 140ms
DoPaint: 156ms
DoPaint: 93ms
DoPaint: 125ms
DoPaint: 141ms
DoPaint: 109ms

GDI
DoPaint: 16ms
DoPaint: 15ms
DoPaint: 16ms
DoPaint: 16ms
DoPaint: 16ms
DoPaint: 16ms
DoPaint: 16ms
DoPaint: 0ms
DoPaint: 0ms
DoPaint: 16ms
DoPaint: 15ms
DoPaint: 0ms
DoPaint: 16ms
DoPaint: 0ms
DoPaint: 16ms
DoPaint: 0ms



ЗЫ Хотел еще без закруглений тайминги померять, померял — для GDI — картина точно такая же — что есть дуги, что их нет, а GDI+ — так просто не проверить уже, потому что версия без закруглений всегда через GDI рисуется, надо уже в глубине ковыряться


ЗЫЫ SetSmoothingMode в GDI+ с различными режимами что-то никак не влияет ни на скорость, ни на качество отрисовки
Маньяк Робокряк колесит по городу
Отредактировано 28.10.2022 6:56 Marty . Предыдущая версия . Еще …
Отредактировано 28.10.2022 6:43 Marty . Предыдущая версия .
Отредактировано 28.10.2022 6:38 Marty . Предыдущая версия .
Re[3]: GDI+ - супер тормоз?
От: Pavel Dvorkin Россия  
Дата: 28.10.22 07:20
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>На самом деле, у меня там не RoundRect'ы, а пути, которые я потом заполняю. Потому, что у меня фигуры могут быть не обязательно прямоугольники, а произвольные их слияния (буквой Г, например).

M>Интерфейс у меня написан для GDI и для GDI+, но простой GDI дуги закруглений неряшливо присует. Вот так выглядят тайминги отрисовки:

Тайминги отрисовки желательно получить более детально, то есть не просто DoPaint, а сколько времени на что внутри него уходит.
With best regards
Pavel Dvorkin
Re[4]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 07:32
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

M>>Интерфейс у меня написан для GDI и для GDI+, но простой GDI дуги закруглений неряшливо присует. Вот так выглядят тайминги отрисовки:


PD>Тайминги отрисовки желательно получить более детально, то есть не просто DoPaint, а сколько времени на что внутри него уходит.



И как же это сделать простыми способами?
Маньяк Робокряк колесит по городу
Re[5]: GDI+ - супер тормоз?
От: Pavel Dvorkin Россия  
Дата: 28.10.22 07:33
Оценка: +1
Здравствуйте, Marty, Вы писали:

PD>>Тайминги отрисовки желательно получить более детально, то есть не просто DoPaint, а сколько времени на что внутри него уходит.


M>И как же это сделать простыми способами?


DoPaint твой ? Если да — замеряй время каждого обращения к GDI+ внутри него. Только аккуратно — не выводи тут же в файл
With best regards
Pavel Dvorkin
Отредактировано 28.10.2022 7:35 Pavel Dvorkin . Предыдущая версия .
Re[6]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 07:37
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>>>Тайминги отрисовки желательно получить более детально, то есть не просто DoPaint, а сколько времени на что внутри него уходит.


M>>И как же это сделать простыми способами?


PD>DoPaint твой ?


Мой


PD>Если да — замеряй время каждого обращения к GDI+ внутри него. Только аккуратно — не выводи тут же в файл


Я ж спрашивал про простые способы


  Вот так выглядит в студии результат замера
Маньяк Робокряк колесит по городу
Re[7]: GDI+ - супер тормоз?
От: paradok  
Дата: 28.10.22 07:43
Оценка: 1 (1)
Все правильно — gdi+ тормоз
Переделывай на DirectX (OpenGL, Metal)
Re[7]: GDI+ - супер тормоз?
От: Pavel Dvorkin Россия  
Дата: 28.10.22 07:49
Оценка:
Здравствуйте, Marty, Вы писали:

PD>>Если да — замеряй время каждого обращения к GDI+ внутри него. Только аккуратно — не выводи тут же в файл


M>Я ж спрашивал про простые способы


А расставить в коде QueryPerfomanceCounter и отправлять в некий list так уж сложно ? Не сотни же там вызовов GDI+.

Суть простая — надо найти, какой именно вызов GDI+ тормозит. И нет ли в DoPaint чего-то помимо GDI+, что тормозит. В общем, кто виноват.

Картинка твоя не подходит. Там непонятно от чего % считается, не только рисование входит.
With best regards
Pavel Dvorkin
Отредактировано 28.10.2022 7:51 Pavel Dvorkin . Предыдущая версия .
Re[8]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 08:05
Оценка:
Здравствуйте, paradok, Вы писали:

P>Все правильно — gdi+ тормоз

P>Переделывай на DirectX (OpenGL, Metal)


Тогда уж Direct2D или как его там. Мне помимо рисования буквы надо рисовать, как там с этим?

Изначально я просто на GDI делал, так как он весьма быстрый и неплохо мне знакомый. Но — сразу всё обернул в свой IDeviceContext интерфейс — чтобы потом, при необходимости линупса в кутю переделать только реализацию десятка методов рисования вместо переделки всей проги. Потом заметил, что дуги и сочленения с прямыми в GDI коряво смотряться. Сделать реализацию под GDI+ — было просто, а вот с совсем новыми для меня технологиями — боюсь провожусь долго. Так что пока так оставлю, бо можно обойтись таки простым GDI
Маньяк Робокряк колесит по городу
Re[8]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 08:14
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А расставить в коде QueryPerfomanceCounter и отправлять в некий list так уж сложно ? Не сотни же там вызовов GDI+.


Не то, чтобы так уж сложно, но таки и не слишком просто


PD>Суть простая — надо найти, какой именно вызов GDI+ тормозит. И нет ли в DoPaint чего-то помимо GDI+, что тормозит. В общем, кто виноват.


Да ничего такого — с GDI весь тот же код работает весьма шустро


PD>Картинка твоя не подходит. Там непонятно от чего % считается, не только рисование входит.


Я так понимаю, проценты от всего времени работы. То, что именно функции GDI входят в топчик, намекает, что сколько бы я не расставлял QueryPerfomanceCounter'ы, ничего особо хорошего я не поймаю
Маньяк Робокряк колесит по городу
Re: GDI+ - супер тормоз?
От: Нomunculus Россия  
Дата: 28.10.22 08:16
Оценка:
Здравствуйте, Marty, Вы писали:

M>Кто виноват и что делать?


А у тебя они каждый кадр динамически меняются? если нет, то почему не отрисуешь статику сначала в битмапу, а потом уже битмапу рисовать?
Re[2]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 08:20
Оценка:
Здравствуйте, Нomunculus, Вы писали:

M>>Кто виноват и что делать?


Н>А у тебя они каждый кадр динамически меняются? если нет, то почему не отрисуешь статику сначала в битмапу, а потом уже битмапу рисовать?


Да, не каждый кадр, есть куда оптимизировать, но вот как первоначальное отображение происходит — несколько напрягает. Хотя, конечно, можно и при первоначальном отображение в memDC рисовать и перекидывать по быстрому, но я пока с оптимизациями вообще не заморачивался, руки ещё не дошли. Просто думал, может, можно как-то по-быстрому полечить GDI+
Маньяк Робокряк колесит по городу
Re[9]: GDI+ - супер тормоз?
От: paradok  
Дата: 28.10.22 11:17
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, paradok, Вы писали:


P>>Все правильно — gdi+ тормоз

P>>Переделывай на DirectX (OpenGL, Metal)


M>Тогда уж Direct2D или как его там. Мне помимо рисования буквы надо рисовать, как там с этим?


это надо в гейм-деве поспрашивать, так на первый взгляд в играх со шрифтами нет кризиса, надписи в играх все делают...
еще есть на ява скрипт — babylonjs.com
ТАМ WebGL надписи в демках выглядят прилично
Re[10]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 11:25
Оценка:
Здравствуйте, paradok, Вы писали:

P>это надо в гейм-деве поспрашивать,


Да, это мысль


P>так на первый взгляд в играх со шрифтами нет кризиса, надписи в играх все делают...


Я давно не играл ни во что, кроме танчиков, но, имхо, в играх почти везде шрифты свои рисованные, рисуются как спрайты, и заточены под пару-тройку поддерживаемых языков
Маньяк Робокряк колесит по городу
Re[11]: GDI+ - супер тормоз?
От: paradok  
Дата: 28.10.22 12:04
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, paradok, Вы писали:


P>>это надо в гейм-деве поспрашивать,


M>Да, это мысль



P>>так на первый взгляд в играх со шрифтами нет кризиса, надписи в играх все делают...


M>Я давно не играл ни во что, кроме танчиков, но, имхо, в играх почти везде шрифты свои рисованные, рисуются как спрайты, и заточены под пару-тройку поддерживаемых языков


вроде сейчас проблема решена, можно использовать масштабируемые шрифты из виндов — truetype
вот из хэлпа юнити
Для добавления шрифта в проект, нужно положить файл со шрифтом в папку Assets.
Unity автоматически определит и импортирует этот файл.
Поддерживаются следующие форматы шрифтов: TrueType Fonts (.ttf) и OpenType Fonts (.otf).
Re[12]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 12:48
Оценка:
Здравствуйте, paradok, Вы писали:

P>вроде сейчас проблема решена, можно использовать масштабируемые шрифты из виндов — truetype

P>вот из хэлпа юнити
P>Для добавления шрифта в проект, нужно положить файл со шрифтом в папку Assets.
P>Unity автоматически определит и импортирует этот файл.
P>Поддерживаются следующие форматы шрифтов: TrueType Fonts (.ttf) и OpenType Fonts (.otf).

Мне такой гемор нафик не нужен, я хочу системные шрифты использовать
Маньяк Робокряк колесит по городу
Re[9]: GDI+ - супер тормоз?
От: Pavel Dvorkin Россия  
Дата: 28.10.22 12:57
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>А расставить в коде QueryPerfomanceCounter и отправлять в некий list так уж сложно ? Не сотни же там вызовов GDI+.


M>Не то, чтобы так уж сложно, но таки и не слишком просто


Сдается мне, что за время, которое ты потратил на переписку здесь, ты вполне бы смог вставить десяток QueryPerfomanceCounter и list.add и один fwrite


PD>>Суть простая — надо найти, какой именно вызов GDI+ тормозит. И нет ли в DoPaint чего-то помимо GDI+, что тормозит. В общем, кто виноват.


M>Да ничего такого — с GDI весь тот же код работает весьма шустро


GDI+ во многом просто настройка над GDI, и в этой части не должен тормозить. Реально код GDI выполняется в kernel mode. Однако есть в GDI+ и свой код, и он выполняется в самом GDI+. Он содержит то, чего в GDI нет и делает что-то сам, ну а потом все же вызывает GDI. Вот что-то из этого, может, и тормозит.


M>Я так понимаю, проценты от всего времени работы. То, что именно функции GDI входят в топчик, намекает, что сколько бы я не расставлял QueryPerfomanceCounter'ы, ничего особо хорошего я не поймаю


Проценты от времени работы сейчас не интересны. Интересно лишь одно — какое было время при входе в DoPaint, потом после первого вызова чего-то из GDI+, потом после второго вызова и т.д. Все остальное пока к делу не относится.
With best regards
Pavel Dvorkin
Re[13]: GDI+ - супер тормоз?
От: paradok  
Дата: 28.10.22 13:05
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, paradok, Вы писали:


P>>вроде сейчас проблема решена, можно использовать масштабируемые шрифты из виндов — truetype

P>>вот из хэлпа юнити
P>>Для добавления шрифта в проект, нужно положить файл со шрифтом в папку Assets.
P>>Unity автоматически определит и импортирует этот файл.
P>>Поддерживаются следующие форматы шрифтов: TrueType Fonts (.ttf) и OpenType Fonts (.otf).

M>Мне такой гемор нафик не нужен, я хочу системные шрифты использовать


так трутайп это и есть системные шрифты в виндах и они в виндах где-то в папке систем и лежат...
я немного програмил в юнити на C# и мне показалось очень комфортно и удобно да и бонус + кросс платформ просто гигантский на все что сейчас вообще есть.
Там не только 3Д но и 2Д есть. Плюс экспорт в один клик в ява-скрипт и запуск в любом браузере проекта на C# — ну то есть автомат перекомпиляции из C# в ява-скрипт,
работает весьма недурственно.

Вот еще сглаживание шрифтов и кривых из коробки — Swift

замечу еще что если много юзеров то системные шрифты не спасут,
всегда попадутся юзеры у которых системный набор отличается от набора на ПК виндовс у разраба (версия шрифта не та, не хватает начертаний, не хватает символов и тд и тп)
и будут очень странные и непонятные траблы (винда вместо сообщения что нет шрифта подставляет самый похожий по ее мнению молча),
так что встроить шрифт в проект не такая уж и плохая идея когда юзеров десятки тысяч из разных стран
Отредактировано 28.10.2022 13:13 paradok . Предыдущая версия .
Re[10]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 13:12
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Сдается мне, что за время, которое ты потратил на переписку здесь, ты вполне бы смог вставить десяток QueryPerfomanceCounter и list.add и один fwrite


Проект компилится, я тут пишу


PD>Проценты от времени работы сейчас не интересны.


Почему?
Для GDI картинка сильно отличается
  Скрытый текст



PD>Интересно лишь одно — какое было время при входе в DoPaint, потом после первого вызова чего-то из GDI+, потом после второго вызова и т.д. Все остальное пока к делу не относится.


Это если сравнить не с чем. А если те же алгоритмы отрисовки через GDI работают в 10 раз быстрее, то как бы становится понятно, кто там тормоз, не?
Маньяк Робокряк колесит по городу
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.