Windows Mobile - 在CF.NET中按大小创建与设备无关的位图

时间:2009-02-05 21:52:00

标签: windows-mobile compact-framework

我一直在与我的渲染(OutOfMemoryException When Creating a Large Bitmap in CF.NET)作斗争一段时间,我仍在寻找解决问题的好办法。

我的引擎会创建一个大的位图(比屏幕大小大2倍或3倍),并将所有内容绘制到该表面。然后我以偏移的方式将该图像绘制到屏幕上,允许用户平滑地滚动。

这在大多数情况下都很有用,但有些用户在创建大型位图时会遇到OutOfMemoryExecptions。我完成了我的作业,看来这是因为我正在创建设备相关位图(DDB),而在Windows Mobile上,所有DDB都会分配给gwes.exe进程以及其他所有应用程序位图。如果gwes.exe进程占用超过32M,则会出现此异常。

我确实看到设备独立位图(DIB)实际上是在您自己的进程空间中创建的,而不是分配给gwes.exe。由于在我的过程中达到32M之前我有更多的空间,我想我会探索这种可能性。

但我能找到创建DIB的唯一方法是通过从流创建位图,就像现有文件一样。我无法想办法从头开始创建一个并指定我希望它是1280x240,256色。

有谁知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

当我创建从Pocket PC打印到bluetootch打印机的自定义报告时,我不得不做类似的事情。我必须生成一张纸大小的位图,然后将其流式传输到打印机,所有使用托管对象的尝试都会像你看到的那样一直遇到内存问题。

我做了什么(对不起,我不能给你这个的直接来源):

您现在拥有了一个HDC,您可以通过它呼叫Graphics.FromHdc

通过这种方式,您可以在自己的进程中完成所有这些操作(实际上,如果您将其设置得足够大,它将来自共享内存并完全避免32MB进程空间。)

答案 1 :(得分:0)

This article可能对Chris Tacke有很多帮助,尤其是这一部分:

  1. 使用流构造函数创建位图将构造DIB(设备无关位图)。
  2. 使用width / height构造函数创建位图将构造DDB(设备相关位图)。
  3. DIB是从应用程序的虚拟地址空间分配的。
  4. DDB由驱动程序分配。这通常意味着它们被分配在gwes.exe的虚拟地址空间中。或者,驱动程序可以在专用视频RAM中分配这些内容。
  5. 使用流构造函数创建位图会在将数据从一个缓冲区复制到另一个缓冲区时产生大量垃圾。
  6. 修改nerdkill application甚至可以提供更多帮助:)