2009-03-04 5 views
2

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

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

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

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

ответ

5

Перед 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 должна быть немного уменьшена. До сих пор нет дозаций.

1

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

К сожалению, у меня нет ответов на ваши последние два вопроса.

+0

Спасибо и очень полезно. Как только я знаю, что с пропорциональной точки зрения Win32 и WinCE, по крайней мере, похожи, я могу эффективно профилировать с рабочего стола. Моя забота заключалась в том, что графические карты на ПК могут исказить результаты в той мере, в какой я буду оптимизировать неправильно. –

2

У меня нет много знаний о графической стороне вещей, но из опыта, если вы хотите быть быстрыми в отношении некоторых связанных с аппаратными средствами вещей, чем ближе к «металу», тем быстрее вы можете получить (и это сложнее!). Таким образом, вы можете изучить использование Direct Draw или Direct 3D (altho, я думаю, что они бросают D3D и переходят на OpenGL ES для WM7). Возможно, вам понравится, как работают разработчики игр.

На вопрос «Профили» я ничего не нашел, но я создаю свой own.

+0

На современных устройствах вы можете использовать OpenVG вместо OpenGL, который обеспечивает аппаратную ускоренную векторную графику и относительно быстрое резервное копирование программного обеспечения, хотя я думаю, что последний по умолчанию недоступен (т. Е. В худшем случае, вы должны его купить) , – OregonGhost

Смежные вопросы