我一直在与我的渲染(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色。
有谁知道如何做到这一点?
答案 0 :(得分:2)
当我创建从Pocket PC打印到bluetootch打印机的自定义报告时,我不得不做类似的事情。我必须生成一张纸大小的位图,然后将其流式传输到打印机,所有使用托管对象的尝试都会像你看到的那样一直遇到内存问题。
我做了什么(对不起,我不能给你这个的直接来源):
您现在拥有了一个HDC,您可以通过它呼叫Graphics.FromHdc。
通过这种方式,您可以在自己的进程中完成所有这些操作(实际上,如果您将其设置得足够大,它将来自共享内存并完全避免32MB进程空间。)
答案 1 :(得分:0)
This article可能对Chris Tacke有很多帮助,尤其是这一部分:
修改:nerdkill application甚至可以提供更多帮助:)