До Windows CE 6.0 - следовательно, включая все версии Windows Mobile / Windows Embedded Handheld - графический код был реализован в другом процессе (GWES.EXE), требуя межпроцессного вызова каждый раз, когда вы выполняете вызов GDI. Межпроцессные вызовы CE 5.x намного дешевле, чем на рабочем столе, но все же дороже, чем простой вызов функции или вызов в режиме ядра.
На рабочем столе GDI реализован в режиме ядра начиная с NT 4.0. В оригинальной NT 3.1 это было похоже на модель CE, межпроцессные вызовы. Чтобы уменьшить накладные расходы на межпроцессные вызовы или переключатели режима пользователь / ядро, рабочий стол GDI объединяет операции на стороне пользовательского режима до тех пор, пока вы не сделаете что-то, требующее очистки очереди - например, выбрав другое перо или кисть или используя один устаревших функций, которые возвращают что-то отличное от BOOL
- или буфер заполнен, или вы явно очищаете его, вызывая GdiFlush
.
В Windows CE такой пакетной функции нет - все вызовы приводят к прямому вызову процесса GWES, что делает его намного медленнее. Вы можете уменьшить его, выполняя как можно больше работы в каждом вызове. Если вам нужна сложная линия, рассмотрите Polyline, а не отдельные вызовы MoveToEx / LineTo. Старайтесь касаться каждого пикселя только один раз, а не визуализировать перекрывающиеся объекты, и использовать недопустимую область, чтобы рисовать только те части экрана, которые требуют перекраски (используйте GetUpdateRgn
или GetUpdateRect
, но делайте это перед вызовом BeginPaint
, что означает регион действителен).
Модель графического ускорения CE довольно проста и основана на бит-битах. Он не поддерживает расширенный набор возможностей, поддерживаемых драйверами настольных устройств модели Windows 2000. Доступно ли какое-либо ускорение, зависит от того, есть ли на оборудовании даже чип-ускоритель - многие устройства будут использовать контроллер ЖК-дисплея, встроенный в процессор приложения, который обычно не ускоряется.
Вы можете смоделировать поведение CE на рабочем столе, отключив пакетирование, используя GdiSetBatchLimit
, чтобы установить ограничение на 1. Также рассмотрите возможность использования графического драйвера SVGA для отключения ускорения. В Windows Vista или Windows 7 GDI не ускоряется, если вы используете среду Aero, все операции реализованы в программном обеспечении, хотя в Windows 7 добавлены некоторые новые возможности аппаратного ускорения.
Windows CE 6.0 имеет новое ядро и модель процесса, которая переводит GDI в режим ядра, как в настольной Windows (до Vista), поэтому стоимость вызова функции GDI должна быть немного снижена. Там еще нет дозирования.