Blit () Производительность зависит от поворота экрана - PullRequest
5 голосов
/ 26 ноября 2011

Я разрабатываю приложение для устройства WinCE 6.0, в котором необходимо поворачивать экран, поэтому мы используем типичный ChangeDisplaySettingsEx() API.а также я рисую что-то на виде.

При перетаскивании от memDC к основному постоянному току требуется 700 мс для 700x300 пикселей в ландшафтном режиме, но в портретном режиме для перелистывания блока 450x450 требуется 50 мс.

Я не могу определить, почему это происходит.Вот конфигурация устройства: - разрешение 800х480.Я использую Normal Blt() API для этого.

Любое предложение будет полезно

Ответы [ 3 ]

2 голосов
/ 26 ноября 2011

Я ничего не знаю о WinCE, но разница в производительности логична, если алгоритм копирования работает построчно.

В одном режиме расположение пикселей на экране и в ОЗУ видео идентичны. В таком случае строка на экране соответствует количеству последовательных адресов памяти.

В портретном режиме алгоритму необходим доступ к новой ячейке памяти для каждого нового пикселя. Несмотря на то, что пиксели расположены рядом друг с другом, память обращается к нет.

0 голосов
/ 23 декабря 2011

Я столкнулся с той же самой проблемой, и мое решение состояло в том, чтобы развернуть мою собственную повернутую подпрограмму растрового изображения непосредственно в буфер отображения. BitBlt и StretchBlt плохо написаны и не менялись с середины 1980-х годов (я видел исходный код Windows GDI). Он все еще будет медленнее битблитовать в «неправильном» направлении, но он не должен быть таким медленным. Проблема в том, что кэш-память небольшого процессора перезаписывается из-за непоследовательной записи в память.

0 голосов
/ 28 ноября 2011

Насколько я знаю, последовательность рисования на экране устройства является построчно вертикальной.В ландшафтном режиме 480 линий для рисования.А в портретном режиме 800 линий для рисования.Там, где сканирование одной строки потребует больше времени.

...