Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenGL将图像平铺为纹理并耗尽内存_C#_Opengl_Memory_Graphics - Fatal编程技术网

C# OpenGL将图像平铺为纹理并耗尽内存

C# OpenGL将图像平铺为纹理并耗尽内存,c#,opengl,memory,graphics,C#,Opengl,Memory,Graphics,我正在尝试实现一个用户可以在其中缩放和平移的世界地图。我遇到了程序内存不足的问题 我的情况如下: 0)我正在用C#和OpenGL编写程序 1) 我从网上下载了一张JPG图片,这是一张19兆的世界详细图片。每个像素有24位长 2) 当我的程序初始化时,我在运行时将这个图像切碎成块。我使用glGenTexture、glBindTexture和glTexImage2d将每个瓷砖输入OpenGL 3) 在我的绘图程序中,我一个接一个地绘制瓷砖,并尝试绘制所有瓷砖,不管它们是否在屏幕上(我知道这是另一个问

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

我的情况如下:

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

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

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

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

对于小图像,一切正常。然而,对于大型图像,当我将JPG解码成位图以便将其切碎时,我的程序的内存占用量会爆炸到超过1 GB。我知道JPG是经过压缩的,.NET JpegBitmapDecoder对象正在对一幅巨大的图像进行解压缩,这可能会让我陷入麻烦


我的问题是,在这种情况下,人们到底能做些什么?由于C#解码代码是破坏内存的第一责任方,是否有一种替代方法来创建tile并将其提供给OpenGL,而我应该采用这种方法(减去位图)?

我将研究如何将jpg解码为位图文件,并使用位图上的流异步加载视图中的相关tile数据(或尽可能多的内存处理)-类似于Android上的谷歌地图


我也看到了这一点,但无法确认我是否会将jpg解码为位图文件,并使用位图上的流异步加载视图中的相关瓷砖数据(或尽可能多的内存处理)-类似于Android上的Google Maps


我也看到了这一点,但无法确认显然您应该购买更多的RAM


您可以在GPU上以压缩格式存储纹理。请参阅(另请参阅SC3T/DXT部分)。您还可以根据需要在视频内存中交换纹理。如果不需要,请不要保留未压缩的数据。

显然,您应该购买更多RAM


您可以在GPU上以压缩格式存储纹理。请参阅(另请参阅SC3T/DXT部分)您可能还需要根据需要在视频内存中交换纹理。如果不需要,请不要保留未压缩的数据。

使用视频卡已用于压缩纹理的压缩格式,而不是JPEG。使用视频卡已用于压缩纹理的压缩格式,而不是JPEG。请使用视频卡已用于压缩纹理的压缩格式ream做到了。最初我将整个图像从流复制到字节数组中,然后使用字节数组而不是流。我将其更改为仅使用流,这产生了很大的不同。流做到了。最初我将整个图像从流复制到字节数组中,然后使用字节数组而不是st雷姆。我只是为了使用这条小溪而改变了它,这使情况大为不同。