Производительность GDI на устройстве Windows mobile или CE

StackOverflow https://stackoverflow.com/questions/610185

Вопрос

У меня есть приложение для Windows CE, которое использует много векторной графики и местами работает довольно медленно.В настоящее время я использую GDI для рендеринга с помощью растрового изображения для обновления без мерцания.Как правило, я открываю окно на части большой 3D-карты.На некоторых устройствах (например,166 МГц SH4), это замедляется с 3-5-секундным временем обновления для больших наборов данных.Мой вопрос заключается в следующем;

  • Кто-нибудь проводил какие-либо сравнения относительной скорости графических операций в Windows mobile по сравнению с Win32.Другими словами, применимы ли результаты профилирования из Win32-версии программного обеспечения к версии WinCE, предполагая, что мы просматриваем только вызовы GDI.

  • Кто-нибудь пробовал профилирование на платформе WinCE (приложение C ++), если да, то с помощью каких инструментов.

  • Кто-нибудь знает о каких-либо методах повышения скорости рисования в Windows CE?В настоящее время я просматриваю FastGraph, следуя отзывам от предыдущий вопрос, но это немного более долгосрочное решение.Плохо и все такое, я ищу что-то более быстрое для реализации в предстоящем выпуске.

Это было полезно?

Решение

До Windows CE 6.0 - следовательно, включая все версии Windows Mobile / Windows Embedded Handheld - графический код был реализован в другом процессе (GWES.EXE), требующем межпроцессного вызова каждый раз, когда вы выполняете вызов GDI.Межпроцессные вызовы CE 5.x намного дешевле, чем на рабочем столе, но все же дороже, чем обычный вызов функции или вызов в режиме ядра.

На рабочем столе GDI реализован в режиме ядра начиная с NT 4.0.В оригинальной версии NT 3.1 это было похоже на модель CE - межпроцессные вызовы.Чтобы уменьшить накладные расходы на межпроцессные вызовы или переключение режимов пользователя / ядра, desktop GDI выполняет пакетные операции на стороне пользовательского режима до тех пор, пока вы не выполните что-либо, требующее очистки очереди, например, выбора другого пера или кисти или использования одной из устаревших функций, которая возвращает что-то отличное от BOOL - или буфер заполнен, или вы явно очищаете его, вызывая GdiFlush.

Windows CE не имеет такой возможности пакетной обработки - все вызовы приводят к прямому вызову процесса GWES, что делает его намного медленнее.Вы можете смягчить это, выполняя как можно больше работы в каждом вызове.Если вам нужна сложная линия, рассмотрите Полилинию, а не отдельные вызовы MoveToEx / lineTo.Попробуйте коснуться каждого пикселя только один раз, а не отображать перекрывающиеся объекты, и используйте недопустимую область для рисования только тех частей экрана, которые нуждаются в перерисовке (используйте GetUpdateRgn или GetUpdateRect но сделайте это перед звонком BeginPaint, который помечает регион действительным).

Модель ускорения графики CE довольно проста и основана на бит-блицах.Он не поддерживает более широкий набор возможностей, которые поддерживают драйверы настольных устройств модели Windows 2000.Доступно ли какое-либо ускорение, зависит от того, есть ли в аппаратном обеспечении вообще микросхема ускорителя - многие устройства будут использовать ЖК-контроллер, встроенный в процессор приложений, который обычно не выполняет никакого ускорения.

Вы можете имитировать поведение CE на рабочем столе, отключив пакетную обработку, используя GdiSetBatchLimit чтобы установить ограничение на 1.Также рассмотрите возможность использования графического драйвера SVGA для отключения ускорения.В Windows Vista или Windows 7 GDI не ускоряется, если вы используете среду Aero, все операции выполняются программно, хотя Windows 7 вернула некоторые новые возможности аппаратного ускорения bit-blit.

Windows CE 6.0 имеет новую модель ядра и процессов, которая переводит GDI в режим ядра, как в настольной Windows (до Vista), поэтому стоимость вызова функции GDI должна быть немного снижена.Пакетирования по-прежнему нет.

Другие советы

Я не очень разбираюсь в графической стороне вещей, но по опыту могу сказать, что если вы хотите быть быстрым в каких-то конкретных вещах, связанных с аппаратным обеспечением, то чем ближе к "металлу", тем быстрее вы можете двигаться (и тем сложнее это становится!).Таким образом, вы могли бы рассмотреть возможность использования Прямая ничья или Прямое 3D (хотя я думаю, что они отбрасывают D3D и переходят на OpenGL ES для WM7).Возможно, вам захочется ознакомиться с тем, как разработчики игр используют.

Что касается профилей, я не нашел ни одного, но я создаю свой собственный.

Я много раз проводил такого рода сравнительный анализ, и операции GDI в WinCE выполняются медленнее, чем в обычном Win32, но только медленнее пропорционально более медленным процессорам на устройствах WinCE.Другими словами, похоже, что использование GDI в WinCE не приводит к какому-либо дополнительному снижению производительности.

Извините, у меня нет ответов на ваши последние два вопроса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top