Re[2]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.10.22 15:33
Оценка:
Здравствуйте, xma, Вы писали:

xma>GDI всегда был тормозом


GDI всегда был весьма шустр для тех задач, которые он решает
Маньяк Робокряк колесит по городу
Re[14]: GDI+ - супер тормоз?
От: Философ Ад http://vk.com/id10256428
Дата: 28.10.22 16:20
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>https://learn.microsoft.com/en-us/windows-hardware/drivers/display/gdi-from-the-driver-s-perspective


Посмотри в каком разделе ты это читаешь:

The Windows 2000 Display Driver Model (XDDM) is the legacy display/graphics driver architecture that was used for Windows 2000 through Windows Vista and Windows 7.


Сейчас картина выглядит иначе:

Graphics hardware vendors must write user-mode display drivers for their display adapters. The user-mode display driver is a dynamic-link library (DLL) that is loaded by the Microsoft Direct3D runtime. A user-mode display driver must at least support the Direct3D version 9 DDI. User-mode display drivers can also support the Direct3D version 10 DDI. The user-mode display driver can consist of one DLL that supports both Direct3D version 9 DDI and Direct3D version 10 DDI or it can consist of two separate DLLs, one for version 9 and the other for version 10 of Direct3D DDI. The following topics discuss various aspects of the user-mode display driver:

https://learn.microsoft.com/en-us/windows-hardware/drivers/display/user-mode-display-drivers
В общем и целом картина сейчас выглядит так:

Если смотреть что из себя представляет Win32k.sys то обнаруживается, что его функции не так просто найти, но таки можно, и там полностью отсутствует что-либо связанное с регионами, полигонами, брашами, карандашами и тем более шрифтами. Это говорит о том, что всё это теперь за пределами ядра.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[15]: GDI+ - супер тормоз?
От: Pavel Dvorkin Россия  
Дата: 29.10.22 03:35
Оценка: +1
Здравствуйте, Философ, Вы писали:

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


PD>>https://learn.microsoft.com/en-us/windows-hardware/drivers/display/gdi-from-the-driver-s-perspective


Ф>Посмотри в каком разделе ты это читаешь:

The Windows 2000 Display Driver Model (XDDM) is the legacy display/graphics driver architecture that was used for Windows 2000 through Windows Vista and Windows 7.


Да, тут ты прав.

Ф>Сейчас картина выглядит иначе:


А вот это для меня не новость. То, что есть user mode драйверы Direct3D и OpenGL — это я знаю. Но мы не о них говорим, а о GDI.

Ф>Если смотреть что из себя представляет Win32k.sys то обнаруживается, что его функции не так просто найти, но таки можно, и там полностью отсутствует что-либо связанное с регионами, полигонами, брашами, карандашами и тем более шрифтами. Это говорит о том, что всё это теперь за пределами ядра.


Ох, что-то не то.

То, что ты дал по ссылке — это результат какой-то grep для какой-то drsyscall. Естественно, там не все.

Ищем в Windows win32k.sys. У меня их FAR нашел 12 штук , в разных подкаталогах C:\Windows\WinSxS. Некоторые из них имеют размер в 300-400 байт, но есть и иного размера.

Честно говоря, не в курсе, какой из них действующий

Но вот, например

Содержимое папки C:\Windows\WinSxS\amd64_microsoft-windows-win32k_31bf3856ad364e35_10.0.19041.2006_none_2dc8ed424fad4d24

<skipped>
14.09.2022 10:12 596 992 win32k.sys
14.09.2022 10:12 3 813 376 win32kfull.sys
14.09.2022 10:12 133 784 win32u.dll


Получить его экспорты совсем не проблема

dumpbin.exe win32k.sys /EXPORTS >l

Вот кусочки оттуда

371 172 000138E0 __win32kstub_NtGdiBRUSHOBJ_DeleteRbrush
372 173 000138F0 __win32kstub_NtGdiBRUSHOBJ_hGetColorTransform
373 174 00013900 __win32kstub_NtGdiBRUSHOBJ_pvAllocRbrush
374 175 00013910 __win32kstub_NtGdiBRUSHOBJ_pvGetRbrush
375 176 00013920 __win32kstub_NtGdiBRUSHOBJ_ulGetBrushColor

413 19C 000125F0 __win32kstub_NtGdiCreatePen
414 19D 000128A0 __win32kstub_NtGdiCreateRectRgn
415 19E 00013A70 __win32kstub_NtGdiCreateRoundRectRgn
673 2A0 00012AC0 __win32kstub_NtGdiExtCreatePen


732 2DB 00012D30 __win32kstub_NtGdiGetFontData
733 2DC 00014C60 __win32kstub_NtGdiGetFontFileData
734 2DD 00014C70 __win32kstub_NtGdiGetFontFileInfo
735 2DE 00014C80 __win32kstub_NtGdiGetFontResourceInfoInternalW
736 2DF 00014C90 __win32kstub_NtGdiGetFontUnicodeRanges

Да, судя по именам, это стабы какие-то


Но там еще есть win32kfull.sys, и у него , например

1289 508 0014F5C0 NtGdiCreateDIBBrush
1290 509 00022FA0 NtGdiCreateDIBSection
1291 50A 00022B40 NtGdiCreateDIBitmapInternal
1292 50B 0029ED10 NtGdiCreateEllipticRgn
1293 50C 00120270 NtGdiCreateHalftonePalette
1294 50D 002B67C0 NtGdiCreateHatchBrushInternal
1295 50E 001573E0 NtGdiCreateMetafileDC
1296 50F 00116A90 NtGdiCreatePaletteInternal
1297 510 00126EC0 NtGdiCreatePatternBrushInternal
1298 511 000A7770 NtGdiCreatePen
1299 512 0007E440 NtGdiCreateRoundRectRgn


1250 4E1 0027C710 NtGdiAddEmbFontToDC
1251 4E2 002AD7A0 NtGdiAddFontMemResourceEx
1252 4E3 00105620 NtGdiAddFontResourceW
1253 4E4 00088790 NtGdiAddInitialFonts
1254 4E5 00289E40 NtGdiAddRemoteFontToDC

1299 512 0007E440 NtGdiCreateRoundRectRgn
1397 574 000EE8F0 NtGdiGetBoundsRect


Правда, есть там еще win32u.dll, и в ней тоже полно аналогичных экспортов. Увы, непонятно, для какого она режима — user mode или kernel mode — импорты ее dumpbin не показывает.

Но вот здесь сказано

win32u.dll is a link for System calls between User mode (Ring 3) and Kernel mode (Ring 0) : Ring 3 => Ring 0

https://learn.microsoft.com/en-us/answers/questions/213495/win32udll-vs-user32dll.html

Так что все же GDI работает в ядре.
With best regards
Pavel Dvorkin
Отредактировано 29.10.2022 7:16 Pavel Dvorkin . Предыдущая версия . Еще …
Отредактировано 29.10.2022 4:03 Pavel Dvorkin . Предыдущая версия .
Re: GDI+ - супер тормоз?
От: CEMb  
Дата: 31.10.22 08:46
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


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


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


У тебя вообще какая задача стоит, что ты взялся такие тесты делать?

btw, уроки по opengl от Neon Hlium: http://pmg.org.ru/nehe/ там есть и про шрифты. Я когда тестовые задания по opengl делал, текст выводил, проблем не было, сделал быстро, даже не помню, как.
Re[2]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 31.10.22 11:27
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>У тебя вообще какая задача стоит, что ты взялся такие тесты делать?


Я не тесты делаю, я прогу делаю, а тут такое...
Маньяк Робокряк колесит по городу
Re[3]: GDI+ - супер тормоз?
От: CEMb  
Дата: 01.11.22 10:58
Оценка:
Здравствуйте, Marty, Вы писали:

CEM>>У тебя вообще какая задача стоит, что ты взялся такие тесты делать?


M>Я не тесты делаю, я прогу делаю, а тут такое...


Ты там замеры делал, это тесты производительности

Вообще, если ты в GDI рисуешь, с двойной буферизацией, то оно работает довольно быстро, я на этом realtime игры делал.

Я про задачу почему спрашивал: если тебе прям надо плотно с 2D-графикой работать — лучше взять что-то более близкое к железу. SDL, может? Это оконный движок с openGL-ной графикой в основе. MS WPF — тоже на основе DirectX сделано. А GDI+ — медленный всегда был, он больше подходит, когда надо быстро(закодить) что-то небольшое нарисовать и лень разбираться. Я его использовал для закачки каких-то графических форматов, типа jpeg/tiff/png.
Re[4]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.11.22 11:39
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Вообще, если ты в GDI рисуешь, с двойной буферизацией, то оно работает довольно быстро, я на этом realtime игры делал.


Ну да, я как-то так и полагал. Но дуги корявые не понравились, решил попробовать GDI+, благо он весьма похож на GDI, а он тормозит.


CEM>Я про задачу почему спрашивал: если тебе прям надо плотно с 2D-графикой работать — лучше взять что-то более близкое к железу. SDL, может? Это оконный движок с openGL-ной графикой в основе. MS WPF — тоже на основе DirectX сделано. А GDI+ — медленный всегда был, он больше подходит, когда надо быстро(закодить) что-то небольшое нарисовать и лень разбираться. Я его использовал для закачки каких-то графических форматов, типа jpeg/tiff/png.


Плотно возможно потом понадобится, но пока это не в приоритете. Я GDI/GDI+ потому и взял, что оно мне знакомо и можно побыстрому закодить отрисовку. Иначе так бы и застрял на этапе осваивания нового графического API

Потом может переделаю, а пока просто буду замерять скорость отрисовки, и если что, говорить пользователю, что система у него медленная, и надо настройки графики поурезать
Маньяк Робокряк колесит по городу
Re: GDI+ - супер тормоз?
От: uuuser  
Дата: 03.11.22 23:13
Оценка:
Здравствуйте, Marty, Вы писали:

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


GDI начиная с win7 для основных вещей имеет hw acceleration
GDI+ не имеет hw acceleration вообще.
D2D нужно юзать, или D3D

M>Кто виноват


программист.

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


читать доки и использовать правильные api.
Re[2]: GDI+ - супер тормоз?
От: rudzuk  
Дата: 03.11.22 23:46
Оценка:
Здравствуйте, uuuser, Вы писали:

u> GDI начиная с win7 для основных вещей имеет hw acceleration


GDI далеко не с семерки аппаратно ускоренный, а сильно-сильно раньше.
avalon/3.0.1
Re[3]: GDI+ - супер тормоз?
От: uuuser  
Дата: 04.11.22 01:42
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>GDI далеко не с семерки аппаратно ускоренный, а сильно-сильно раньше.


только в висте его убили, а в вин7 частично вернули, поэтому GDI hw acceleration на XP и Win7 как бы отличаются,
так что юзать GDI для отрисовки сложных вещей начиная с висты противопоказано.
Re: GDI+ - супер тормоз?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.11.22 13:20
Оценка:
Здравствуйте, Marty, Вы писали:

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


За такое время можно скачать картинку по хттп и нарисовать её жээсом.

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


10 лет назад у меня .net. system.drawing который под капотом GDI+ уверенно рисовал порядка 10..15тыс примитивов в секунду.
Это если без шрифтов. Со шрифтами намного меньше.

Покажи, что именно ты рисуешь.

Проблемы с гди+ возможны, и в странных местах — например, если логические координаты слишком большие или когда часть рендеринга идет мимо видимой области. Лучше отключить всё такое, включая клиппинг, и делать это самому. Тогда сюрпризов меньше будет.

Для примера — если логическую область сделать в логических единицах от -50млн до +50млн, и попытаться нарисовать линию стилем dash от одного края, до другого не прямо, а наискосок, то рисование такой линии занимает секунды и линия может оказаться изогнутой на экране, т.е. пройдет совсем не там, куда бы она попала если стиль solid
Отредактировано 25.11.2022 9:20 Pauel . Предыдущая версия .
Re[2]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.11.22 03:03
Оценка:
Здравствуйте, Pauel, Вы писали:

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


P>За такое время можно скачать картинку по хттп и нарисовать её жээсом.


Можно


P>10 лет назад у меня .net. system.drawing который под капотом GDI+ уверенно рисовал порядка 10..15тыс примитивов в секунду.

P>Это если без шрифтов. Со шрифтами намного меньше.

P>Покажи, что именно ты рисуешь.


Вот такие штуки:




P>Проблемы с гди+ возможны, и в странных местах — например, если логические координаты слишком большие или когда часть рендеринга идет мимо видимой области. Лучше отключить всё такое, включая клиппинг, и делать это самому. Тогда сюрпризов меньше будет.


Всё только в пределах экрана


P>Для примера — если логическую область сделать в логических единицах от -50млн до +50млн, и попытаться нарисовать линию стилем dash от одного края, до другого не прямо, а наискосок, то рисование такой линии занимает секунды и линия может оказаться изогнутой на экране, т.е. пройдет совсем не там, куда бы она попала если стиль solid



Никаких дашей, и только горизонтальные/вертикальные прямые, дуги и заливка. Правда, рисую не как RoundRect'ы, а как Path'ы
Маньяк Робокряк колесит по городу
Re[3]: GDI+ - супер тормоз?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.11.22 12:45
Оценка:
Здравствуйте, Marty, Вы писали:

M>Никаких дашей, и только горизонтальные/вертикальные прямые, дуги и заливка. Правда, рисую не как RoundRect'ы, а как Path'ы


А RoundRect насколько быстрый?
Re[4]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.11.22 12:49
Оценка:
Здравствуйте, Pauel, Вы писали:

M>>Никаких дашей, и только горизонтальные/вертикальные прямые, дуги и заливка. Правда, рисую не как RoundRect'ы, а как Path'ы


P>А RoundRect насколько быстрый?


Я наврал. Просто прямоугольники с закругленными углами я как RoundRect'ы и рисую, посложнее фигуры — через Path'ы. Но таких у меня несколько штук от силы

UPD Опять наврал. Я использую RoundRect своего интерфейса, а он сам тоже через рисование Path работает. Решил переделать, погуглил — а вроде как пишут, что для GDI+ надо самому делать — https://stackoverflow.com/questions/67052759/c-gdi-how-to-draw-rectangle-with-border-radius.

А если про GDI — то оно супер быстро работает
Маньяк Робокряк колесит по городу
Отредактировано 28.11.2022 13:00 Marty . Предыдущая версия .
Re[5]: GDI+ - супер тормоз?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.11.22 07:46
Оценка:
Здравствуйте, Marty, Вы писали:

M>UPD Опять наврал. Я использую RoundRect своего интерфейса, а он сам тоже через рисование Path работает. Решил переделать, погуглил — а вроде как пишут, что для GDI+ надо самому делать — https://stackoverflow.com/questions/67052759/c-gdi-how-to-draw-rectangle-with-border-radius.


А что именно тормозит — создание path, или его отрисовка в графический контекст?
Re[6]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.11.22 07:55
Оценка:
Здравствуйте, Pauel, Вы писали:

P>А что именно тормозит — создание path, или его отрисовка в графический контекст?


Отрисовка
Маньяк Робокряк колесит по городу
Re[7]: GDI+ - супер тормоз?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.11.22 07:57
Оценка:
Здравствуйте, Marty, Вы писали:

P>>А что именно тормозит — создание path, или его отрисовка в графический контекст?


M>Отрисовка


А если все это вручную отрисовать, безо всякого path, как изменится перформанс?
Re[8]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.11.22 08:02
Оценка:
Здравствуйте, Pauel, Вы писали:

P>>>А что именно тормозит — создание path, или его отрисовка в графический контекст?


M>>Отрисовка


P>А если все это вручную отрисовать, безо всякого path, как изменится перформанс?


А как быть с заливкой? Или ты предлагаешь самому попиксельно вообще все рисовать?
Маньяк Робокряк колесит по городу
Re[9]: GDI+ - супер тормоз?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.11.22 08:10
Оценка:
Здравствуйте, Marty, Вы писали:

P>>А если все это вручную отрисовать, безо всякого path, как изменится перформанс?


M>А как быть с заливкой? Или ты предлагаешь самому попиксельно вообще все рисовать?


Однако, про заливку я не знал. Кстати говоря, как изменится перформанс если отключить заливку ?

А ты не мог бы фрагмент картинки показать? Есть ли вариант, скажем, нарисовать несколько типовых картинок в битмап и уже потом шпокать этот битмап?
Re[10]: GDI+ - супер тормоз?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.11.22 08:11
Оценка:
Здравствуйте, Pauel, Вы писали:


P>Однако, про заливку я не знал. Кстати говоря, как изменится перформанс если отключить заливку ?


P>А ты не мог бы фрагмент картинки показать?


Я ж вроде показывал — http://rsdn.org/forum/winapi/8417035.1
Автор: Marty
Дата: 28.11.22



P>Есть ли вариант, скажем, нарисовать несколько типовых картинок в битмап и уже потом шпокать этот битмап?


Пока — есть. Но потом хочется динамики добавить. И наверное с GDI+ придётся переползать куда-то
Маньяк Робокряк колесит по городу
Отредактировано 29.11.2022 8:12 Marty . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.