Детали реализации GDI-отсечения - PullRequest
2 голосов
/ 20 марта 2009

Рассмотрим следующий фрагмент кода:

HRGN clip = ::CreateRectRgn(50, 50, 100, 100);
::SelectClipRgn(context, clip);
::Rectangle(context, 0, 0, 50, 50);

Достаточно ли разумна реализация отсечения Microsoft для немедленного возврата из звонка в Rectangle, не пытаясь что-либо нарисовать? Я подозреваю, что это возможно, но нигде не удалось найти подтверждения. Документация MSDN для отсечения разбросана под деталями капота, и Googling не обнаруживает ничего, кроме как использовать отсечение GDI.

РЕДАКТИРОВАТЬ: Меня осенило, что я не смог указать, что это работает на Windows Mobile, поэтому набор инструментов для анализа ограничен.

Ответы [ 4 ]

2 голосов
/ 20 марта 2009

Я фактически вытащил свой Petzold (2nd Edition) с полки и обнаружил, что неудивительно, что отсечение было важной функцией в ранних версиях Windows SDK. Тогда по соображениям производительности было необходимо не рисовать объекты, которые невидимы. Я бы сказал, что GDI-отсечение достаточно умное и ничего не даст, когда вы рисуете за пределами области отсечения.

1 голос
/ 27 марта 2009

Проверьте это.

Присоедините ваш любимый отладчик (Windbg, CDB) и используйте команду WT для отслеживания статистики пути выполнения. Compare :: Rectangle (context, 0, 0, 50, 50); with :: Rectangle (context, 0, 0, 51, 51);

0 голосов
/ 27 марта 2009

По моим подсчетам, он использует простую линию Коэна-Сазерленда под капотом, хотя я не уверен в этом. Однако, если у вас есть много данных, которые находятся за пределами экрана (и их не следует рисовать), вам лучше использовать алгоритм отбора более высокого уровня, основанный, например, на Quad-дереве, так что вы можете пропустить эти объекты все вместе на более ранней стадии.

0 голосов
/ 20 марта 2009

Вы можете увидеть исходный код SelectClipRgn () (Win32 api Group, много лет назад, 16 или 32 бита)

...