У меня через GDI+ рисуется порядка сотни прямоугольников с закругленными углами. Вот просто на глаз видно, как они медленно и печально появляются на экране. Произвел замер — время отрисовки колеблется от 50 мс до 250 мс. Это чудовищно долго. И не понятно, почему время отрисовки так скачет.
Здравствуйте, Marty, Вы писали:
M>У меня через GDI+ рисуется порядка сотни прямоугольников с закругленными углами. Вот просто на глаз видно, как они медленно и печально появляются на экране. Произвел замер — время отрисовки колеблется от 50 мс до 250 мс. Это чудовищно долго. И не понятно, почему время отрисовки так скачет.
M>Кто виноват и что делать?
Для начала отрисовать их без GDI+, просто через RoundRect. Может, дело не в GDI+
Здравствуйте, Pavel Dvorkin, Вы писали: M>>Кто виноват и что делать? PD>Для начала отрисовать их без GDI+, просто через RoundRect. Может, дело не в GDI+
На самом деле, у меня там не RoundRect'ы, а пути, которые я потом заполняю. Потому, что у меня фигуры могут быть не обязательно прямоугольники, а произвольные их слияния (буквой Г, например).
Интерфейс у меня написан для GDI и для GDI+, но простой GDI дуги закруглений неряшливо присует. Вот так выглядят тайминги отрисовки:
ЗЫ Хотел еще без закруглений тайминги померять, померял — для GDI — картина точно такая же — что есть дуги, что их нет, а GDI+ — так просто не проверить уже, потому что версия без закруглений всегда через GDI рисуется, надо уже в глубине ковыряться
ЗЫЫ SetSmoothingMode в GDI+ с различными режимами что-то никак не влияет ни на скорость, ни на качество отрисовки
Здравствуйте, Marty, Вы писали:
M>На самом деле, у меня там не RoundRect'ы, а пути, которые я потом заполняю. Потому, что у меня фигуры могут быть не обязательно прямоугольники, а произвольные их слияния (буквой Г, например). M>Интерфейс у меня написан для GDI и для GDI+, но простой GDI дуги закруглений неряшливо присует. Вот так выглядят тайминги отрисовки:
Тайминги отрисовки желательно получить более детально, то есть не просто DoPaint, а сколько времени на что внутри него уходит.
Здравствуйте, Pavel Dvorkin, Вы писали:
M>>Интерфейс у меня написан для GDI и для GDI+, но простой GDI дуги закруглений неряшливо присует. Вот так выглядят тайминги отрисовки:
PD>Тайминги отрисовки желательно получить более детально, то есть не просто DoPaint, а сколько времени на что внутри него уходит.
Здравствуйте, Marty, Вы писали:
PD>>Тайминги отрисовки желательно получить более детально, то есть не просто DoPaint, а сколько времени на что внутри него уходит.
M>И как же это сделать простыми способами?
DoPaint твой ? Если да — замеряй время каждого обращения к GDI+ внутри него. Только аккуратно — не выводи тут же в файл
Здравствуйте, Pavel Dvorkin, Вы писали: PD>>>Тайминги отрисовки желательно получить более детально, то есть не просто DoPaint, а сколько времени на что внутри него уходит. M>>И как же это сделать простыми способами? PD>DoPaint твой ?
Мой
PD>Если да — замеряй время каждого обращения к GDI+ внутри него. Только аккуратно — не выводи тут же в файл
Здравствуйте, Marty, Вы писали:
PD>>Если да — замеряй время каждого обращения к GDI+ внутри него. Только аккуратно — не выводи тут же в файл
M>Я ж спрашивал про простые способы
А расставить в коде QueryPerfomanceCounter и отправлять в некий list так уж сложно ? Не сотни же там вызовов GDI+.
Суть простая — надо найти, какой именно вызов GDI+ тормозит. И нет ли в DoPaint чего-то помимо GDI+, что тормозит. В общем, кто виноват.
Картинка твоя не подходит. Там непонятно от чего % считается, не только рисование входит.
Здравствуйте, paradok, Вы писали:
P>Все правильно — gdi+ тормоз P>Переделывай на DirectX (OpenGL, Metal)
Тогда уж Direct2D или как его там. Мне помимо рисования буквы надо рисовать, как там с этим?
Изначально я просто на GDI делал, так как он весьма быстрый и неплохо мне знакомый. Но — сразу всё обернул в свой IDeviceContext интерфейс — чтобы потом, при необходимости линупса в кутю переделать только реализацию десятка методов рисования вместо переделки всей проги. Потом заметил, что дуги и сочленения с прямыми в GDI коряво смотряться. Сделать реализацию под GDI+ — было просто, а вот с совсем новыми для меня технологиями — боюсь провожусь долго. Так что пока так оставлю, бо можно обойтись таки простым GDI
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А расставить в коде QueryPerfomanceCounter и отправлять в некий list так уж сложно ? Не сотни же там вызовов GDI+.
Не то, чтобы так уж сложно, но таки и не слишком просто
PD>Суть простая — надо найти, какой именно вызов GDI+ тормозит. И нет ли в DoPaint чего-то помимо GDI+, что тормозит. В общем, кто виноват.
Да ничего такого — с GDI весь тот же код работает весьма шустро
PD>Картинка твоя не подходит. Там непонятно от чего % считается, не только рисование входит.
Я так понимаю, проценты от всего времени работы. То, что именно функции GDI входят в топчик, намекает, что сколько бы я не расставлял QueryPerfomanceCounter'ы, ничего особо хорошего я не поймаю
Здравствуйте, Нomunculus, Вы писали:
M>>Кто виноват и что делать?
Н>А у тебя они каждый кадр динамически меняются? если нет, то почему не отрисуешь статику сначала в битмапу, а потом уже битмапу рисовать?
Да, не каждый кадр, есть куда оптимизировать, но вот как первоначальное отображение происходит — несколько напрягает. Хотя, конечно, можно и при первоначальном отображение в memDC рисовать и перекидывать по быстрому, но я пока с оптимизациями вообще не заморачивался, руки ещё не дошли. Просто думал, может, можно как-то по-быстрому полечить GDI+
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, paradok, Вы писали:
P>>Все правильно — gdi+ тормоз P>>Переделывай на DirectX (OpenGL, Metal)
M>Тогда уж Direct2D или как его там. Мне помимо рисования буквы надо рисовать, как там с этим?
это надо в гейм-деве поспрашивать, так на первый взгляд в играх со шрифтами нет кризиса, надписи в играх все делают...
еще есть на ява скрипт — babylonjs.com
ТАМ WebGL надписи в демках выглядят прилично
Здравствуйте, paradok, Вы писали:
P>это надо в гейм-деве поспрашивать,
Да, это мысль
P>так на первый взгляд в играх со шрифтами нет кризиса, надписи в играх все делают...
Я давно не играл ни во что, кроме танчиков, но, имхо, в играх почти везде шрифты свои рисованные, рисуются как спрайты, и заточены под пару-тройку поддерживаемых языков
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, paradok, Вы писали:
P>>это надо в гейм-деве поспрашивать,
M>Да, это мысль
P>>так на первый взгляд в играх со шрифтами нет кризиса, надписи в играх все делают...
M>Я давно не играл ни во что, кроме танчиков, но, имхо, в играх почти везде шрифты свои рисованные, рисуются как спрайты, и заточены под пару-тройку поддерживаемых языков
вроде сейчас проблема решена, можно использовать масштабируемые шрифты из виндов — truetype
вот из хэлпа юнити
Для добавления шрифта в проект, нужно положить файл со шрифтом в папку Assets.
Unity автоматически определит и импортирует этот файл.
Поддерживаются следующие форматы шрифтов: TrueType Fonts (.ttf) и OpenType Fonts (.otf).
Здравствуйте, paradok, Вы писали:
P>вроде сейчас проблема решена, можно использовать масштабируемые шрифты из виндов — truetype P>вот из хэлпа юнити P>Для добавления шрифта в проект, нужно положить файл со шрифтом в папку Assets. P>Unity автоматически определит и импортирует этот файл. P>Поддерживаются следующие форматы шрифтов: TrueType Fonts (.ttf) и OpenType Fonts (.otf).
Мне такой гемор нафик не нужен, я хочу системные шрифты использовать
Здравствуйте, 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+, потом после второго вызова и т.д. Все остальное пока к делу не относится.
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, paradok, Вы писали:
P>>вроде сейчас проблема решена, можно использовать масштабируемые шрифты из виндов — truetype P>>вот из хэлпа юнити P>>Для добавления шрифта в проект, нужно положить файл со шрифтом в папку Assets. P>>Unity автоматически определит и импортирует этот файл. P>>Поддерживаются следующие форматы шрифтов: TrueType Fonts (.ttf) и OpenType Fonts (.otf).
M>Мне такой гемор нафик не нужен, я хочу системные шрифты использовать
так трутайп это и есть системные шрифты в виндах и они в виндах где-то в папке систем и лежат...
я немного програмил в юнити на C# и мне показалось очень комфортно и удобно да и бонус + кросс платформ просто гигантский на все что сейчас вообще есть.
Там не только 3Д но и 2Д есть. Плюс экспорт в один клик в ява-скрипт и запуск в любом браузере проекта на C# — ну то есть автомат перекомпиляции из C# в ява-скрипт,
работает весьма недурственно.
Вот еще сглаживание шрифтов и кривых из коробки — Swift
замечу еще что если много юзеров то системные шрифты не спасут,
всегда попадутся юзеры у которых системный набор отличается от набора на ПК виндовс у разраба (версия шрифта не та, не хватает начертаний, не хватает символов и тд и тп)
и будут очень странные и непонятные траблы (винда вместо сообщения что нет шрифта подставляет самый похожий по ее мнению молча),
так что встроить шрифт в проект не такая уж и плохая идея когда юзеров десятки тысяч из разных стран
Здравствуйте, Pavel Dvorkin, Вы писали: PD>Сдается мне, что за время, которое ты потратил на переписку здесь, ты вполне бы смог вставить десяток QueryPerfomanceCounter и list.add и один fwrite
Проект компилится, я тут пишу
PD>Проценты от времени работы сейчас не интересны.
Почему?
Для GDI картинка сильно отличается
Скрытый текст
PD>Интересно лишь одно — какое было время при входе в DoPaint, потом после первого вызова чего-то из GDI+, потом после второго вызова и т.д. Все остальное пока к делу не относится.
Это если сравнить не с чем. А если те же алгоритмы отрисовки через GDI работают в 10 раз быстрее, то как бы становится понятно, кто там тормоз, не?