由于您似乎遇到了设备限制,限制了您可以创建的位图空间的总大小(这些显然是在视频 RAM 中而不是一般程序内存中创建的),一种替代方法是将此处使用的大位图对象替换为一块普通的 Windows 内存块,通过调用 BitBlt API 函数来访问它以进行读取和写入。
最初创建内存块很棘手,您可能想问另一个关于此的 SO 问题(GCHandle.Alloc 可用于创建“固定”对象,这意味着 .NET 不允许在其中移动它内存,这在这里很重要)。我知道该怎么做,但我不确定我做对了,我宁愿有专家的意见。
一旦您创建了大块,您将遍历您的项目,将每个项目渲染为一个您不断重复使用的小位图(使用您现有的 .NET 代码),然后将其 BitBlt 到您的内存块中的适当位置。
创建整个缓存后,您的渲染代码应该像以前一样工作,不同之处在于您不是从大位图复制到渲染表面,而是从缓存块中进行 BitBlt。BitBlt 的参数与 DrawImage 的参数基本相同(目标、源、坐标和大小等)。
由于您是以这种方式使用常规内存而不是专门的视频 RAM 创建缓存,因此我认为您不会遇到同样的问题。但是,我肯定会让块创建代码首先工作并测试以确保它每次都能创建足够大的块。
更新:实际上,理想的方法是拥有一组较小的内存块而不是一个大的内存块(就像我认为是位图方法的问题),但你已经有足够的事情要做了。我使用过处理 5MB 和 10MB 对象的 CF 应用程序,无论如何这不是一个大问题(尽管当该块被固定时它可能是一个更大的问题 - 我不知道)。顺便说一句,我一直对创建位图的 OOME 感到惊讶,因为我知道位图比可用内存小得多,你也是 - 现在我知道为什么了。抱歉,起初我认为这是一个简单的解决方案。