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

Windows mobile Windows Mobile-在CF.NET中按大小创建与设备无关的位图,windows-mobile,compact-framework,Windows Mobile,Compact Framework,我已经和渲染()斗争了一段时间,我仍然在寻找一种解决问题的好方法 我的引擎创建一个大位图(比屏幕大小大2倍或3倍),并将所有内容绘制到该表面。然后,我在屏幕上以偏移量绘制该图像,允许用户非常平滑地滚动 这在大多数情况下都很有效,但有些用户在创建大位图时会遇到OutOfMemoryExecutions。我已经完成了我的家庭作业,这似乎是因为我正在创建一个依赖于设备的位图(DDB),并且在Windows Mobile上,所有DDB都被分配到gwes.exe进程,以及所有其他应用程序位图。如果gwes

我已经和渲染()斗争了一段时间,我仍然在寻找一种解决问题的好方法

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

这在大多数情况下都很有效,但有些用户在创建大位图时会遇到OutOfMemoryExecutions。我已经完成了我的家庭作业,这似乎是因为我正在创建一个依赖于设备的位图(DDB),并且在Windows Mobile上,所有DDB都被分配到gwes.exe进程,以及所有其他应用程序位图。如果gwes.exe进程占用的空间超过3200万,则会出现此异常

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

但我能找到的创建DIB的唯一方法是从流创建位图,就像现有文件一样。我想不出任何方法从头开始创建一个,并指定它为1280x240,256色

有人知道如何做到这一点吗?

Chris Tacke可能会给你很多帮助,尤其是这一部分:

  • 使用流构造函数创建位图将构造DIB(设备独立位图)
  • 使用宽度/高度构造函数创建位图将构造DDB(设备相关位图)
  • DIB的分配超出了应用程序的虚拟地址空间
  • DDB由驱动程序分配。这通常意味着它们是在gwes.exe的虚拟地址空间中分配的。或者,驱动程序可以在专用视频ram中分配这些
  • 使用流构造函数创建位图会产生大量垃圾,因为它会将数据从一个缓冲区复制到另一个缓冲区

  • 编辑:可能更有用:)

    不久前,当我创建从Pocket PC打印到bluetootch打印机的自定义报告时,我不得不做类似的事情。我必须生成一张纸大小的位图,然后将其传输到打印机,所有使用托管对象执行此操作的尝试都会遇到内存问题,如您所见

    我所做的(很抱歉,我无法向您提供这方面的直接来源):

    • 定义并创建一个结构
    • 去那个波黑
    • 召唤
    • 召唤
    你现在有了一个HDC,你可以从中调用


    这样,您就可以在自己的进程中拥有所有这些信息(事实上,如果您将其设置得足够大,它将来自共享内存,并完全避免32MB的进程空间)。

    这篇文章基本上解决了整个问题。我理解它为什么要创建DDB。从一个流创建一个位图似乎只有在该流包含一个现有文件时才有效。这正是我一直在寻找的,谢谢!您能告诉我更多关于如何避免使用32MB进程空间的信息吗?