2013-03-21 3 views
1

사용자가 확대 및 축소 할 수있는 세계지도를 구현하려고합니다. 프로그램에서 메모리가 부족한 문제가 발생합니다. 내가 19 메가는 세계의 상세한 이미지와 웹 떨어져 JPG 이미지를 다운로드 나는 C# 및 OpenGL을OpenGL 텍스처를 텍스처로 바둑판 식으로 배열하고 메모리가 부족한 경우

1) 내 프로그램을 쓰고 있어요

0) : 여기

내 상황입니다 크기. 각 픽셀은 24 비트 길이입니다.

2) 프로그램을 초기화 할 때 런타임에이 이미지를 타일로 잘라냅니다. glGenTexture, glBindTexture 및 glTexImage2d를 사용하여 각 타일을 OpenGL로 공급합니다.

3) 내 드로잉 루틴에서 타일을 하나씩 그려서 화면에 있는지 여부에 관계없이 모두 그려 봅니다 (다른 문제입니다).

작은 이미지의 경우 모든 것이 올바르게 작동합니다. 그러나 큰 이미지의 경우 JPG를 비트 맵으로 디코딩하여 조각을 만들면 프로그램의 메모리 공간이 기가 바이트 이상으로 폭발합니다. JPG가 압축되어 있고 .NET JpegBitmapDecoder 객체가 문제를 일으키는 거대한 이미지의 압축을 풀고 있다는 것을 알고 있습니다.

제 질문은 이런 종류의 상황에서 정확히 무엇을 할 수 있습니까? C# 디코딩 코드가 메모리를 날려 버릴 수있는 첫 번째 책임자이기 때문에 타일을 만들고 OpenGL에 대신 넣어야 할 방법이 있습니까 (빼기 비트 맵)?

+1

JPEG 대신 이미 비디오 카드가 압축 된 텍스처에 사용하는 것과 동일한 압축 형식을 사용하십시오. –

답변

0

jpg를 비트 맵 파일로 디코딩하고 비트 맵의 ​​스트림을 사용하여보기에서 관련 타일 데이터를 비동기 적으로로드 할 수 있습니다 (또는 메모리가 처리 할 수있는만큼). Android의 Google지도.

은 또한 이것을보고 있지만, "OOM from a Bitmap is very suspect. This class will throw the memory exception for just about anything that goes wrong, including bad parameters etc."

+0

스트림이했습니다. 원래는 전체 이미지를 스트림에서 바이트 배열로 복사 한 다음 스트림 대신 바이트 배열을 사용했습니다. 나는 그것을 단지 스트림을 사용하도록 바꾸었고 그것은 큰 차이를 만들었다. –

1

는 분명히 더 많은 RAM을 구입해야한다고 확신 할 수 없습니다!

텍스처를 압축 형식으로 GPU에 저장할 수 있습니다. this page (SC3T/DXT 섹션 참조)을 참조하십시오. 필요에 따라 비디오 메모리에서 텍스처를 교환 할 수도 있습니다. 필요하지 않은 경우 비 압축 데이터를 보관하지 마십시오.

관련 문제