Перед 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. Старайтесь только касаться каждого пикселя один раз, а не отображать перекрывающиеся объекты, и использовать недопустимую область только для рисования частей экрана, которые требуют перекраски (используйте или 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 должна быть немного уменьшена. До сих пор нет дозаций.
Спасибо и очень полезно. Как только я знаю, что с пропорциональной точки зрения Win32 и WinCE, по крайней мере, похожи, я могу эффективно профилировать с рабочего стола. Моя забота заключалась в том, что графические карты на ПК могут исказить результаты в той мере, в какой я буду оптимизировать неправильно. –