Windows Mobile - Создание независимого от устройства растрового изображения по размеру в CF.NET - PullRequest
0 голосов
/ 06 февраля 2009

Я боролся с моим рендерингом ( OutOfMemoryException при создании большого растрового изображения в CF.NET ) некоторое время, и я все еще ищу хороший способ исправить мои проблемы.

Мой движок создает одно большое растровое изображение (в 2 или 3 раза больше размера экрана) и рисует все на этой поверхности. Затем я рисую это изображение на экране со смещением, позволяя пользователю ОЧЕНЬ плавно прокручивать.

Это прекрасно работает большую часть времени, но некоторые пользователи сталкиваются с исключениями OutOfMemoryException при создании этого большого растрового изображения. Я сделал свою домашнюю работу, и кажется, что это потому, что я создаю зависимую от устройства битовую карту (DDB), а в Windows Mobile все DDB назначаются процессу gwes.exe, как и все другие битмапы других приложений. Если этот процесс gwes.exe занимает более 32M, вы получите это исключение.

Я вижу, что независимые от устройства растровые изображения (DIB) фактически создаются в вашем собственном пространстве процессов, а не назначаются gwes.exe. Так как в моем процессе осталось гораздо больше места, я решил изучить эту возможность.

Но единственный способ найти DIB - это создать растровое изображение из потока, как существующий файл. Я не могу придумать способ создать его с нуля и указать, что я хочу, чтобы он был 1280x240 с 256 цветами.

Кто-нибудь знает, как это можно сделать?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2009

Некоторое время назад мне приходилось делать что-то похожее на это, когда я создавал пользовательские отчеты, напечатанные с Pocket PC на принтер bluetootch. Мне пришлось генерировать растровые изображения размером с лист бумаги, затем передавать их на принтер, и все попытки сделать это с помощью управляемого объекта продолжали вызывать проблемы с памятью, как вы видите.

Что я сделал (извините, я не могу дать вам прямого источника по этому вопросу):

Теперь у вас есть HDC, и с этого вы можете позвонить Graphics.FromHdc .

Таким образом, у вас есть все это в вашем собственном процессе (и на самом деле, если вы сделаете его достаточно большим, он будет поступать из общей памяти и вообще избегать пространства процесса 32 МБ).

0 голосов
/ 06 февраля 2009

Эта статья может сильно помочь вам от Криса Таке, особенно эта часть:

  1. Создание растрового изображения с использованием конструктора потока создаст DIB (независимое от устройства растровое изображение).
  2. Создание растрового изображения с помощью конструктора ширины / высоты создаст DDB (зависимое от устройства растровое изображение).
  3. DIB выделяются из виртуального адресного пространства приложения.
  4. DDB распределяются драйвером. Обычно это означает, что они размещены в виртуальном адресном пространстве gwes.exe. В качестве альтернативы, драйвер может выделить их в выделенном видеопамяти.
  5. Создание растрового изображения с помощью конструктора потока создаст изрядное количество мусора при копировании данных из одного буфера в другой.

Редактировать : Приложение nerdkill может даже помочь больше:)

...