1

我正在尝试实现用户可以缩放和平移的世界地图。我遇到了程序内存不足的问题。

这是我的情况:

0) 我正在用 C# 和 OpenGL 编写程序

1) 我从网上下载了一张 JPG 图片,它是世界的详细图片,大小为 19 兆。每个像素长 24 位。

2)当我的程序初始化时,我在运行时将此图像切成小块。我使用 glGenTexture、glBindTexture 和 glTexImage2d 将每个图块输入 OpenGL。

3)在我的绘图程序中,我一个一个地绘制瓷砖并尝试绘制所有瓷砖,无论它们是否在屏幕上(这是另一个问题,我知道)。

对于小图像,一切正常。但是,对于大图像,当我将 JPG 解码为位图以便将其切碎时,我的程序的内存占用量会激增至超过 1 GB。我知道 JPG 是压缩的,而 .NET JpegBitmapDecoder 对象正在解压缩一个巨大的图像,这可能是让我遇到麻烦的原因。

我的问题是,在这种情况下究竟能做什么?由于 C# 解码代码是炸毁内存的第一责任方,是否有另一种创建图块并将它们提供给 OpenGL 的替代方法,而我应该采用这种方法(减去位图)?

4

2 回答 2

1

显然你应该购买更多的内存!

您可以在 GPU 上以压缩格式存储纹理。请参阅此页面(也是 SC3T/DXT 部分。)您可能还希望根据需要在显存中交换纹理。如果不需要,请不要保留未压缩的数据。

于 2013-03-21T19:07:20.697 回答
0

我会考虑将 jpg 解码为位图文件并使用位图上的流来异步加载视图中的相关图块数据(或尽可能多的内存可以处理) - 类似于 Android 上的谷歌地图。

我也看到了这一点,但无法确认“来自位图的 OOM 非常可疑。此类将抛出内存异常,因为几乎所有出现问题,包括错误的参数等。”

于 2013-03-21T19:00:10.447 回答