0

내 응용 프로그램은 건물 바닥 평면을로드 한 다음 바닥 평면에 객체 (가구)를 그려야합니다. floorplan 이미지는 2500 x 1500 240Kb PNG이지만 BitmapFactory를 사용하면 비트 맵을 만드는 데 12MB 이상의 힙이 필요하므로 대부분의 장치가 충돌하여 OutOfMemory 오류가 발생합니다. 여기서 분명히하자. 이것은 처음으로 이미지를 생성하는 동안 충돌이 발생하기 때문에, 내가 알 수있는 한 메모리 누수와 bitmap.recycle()은 아무 것도하지 않습니다. inSampleSize로 이미지를 읽는 것은 이미지를 인식 할 수없는 샘플 크기를 사용하지 않는 한 도움이되지 않습니다. 이 모든 상황은 미친 짓이다. 나는 Droid 3, HTC Inspire 및 두 개의 2.3 에뮬레이터를 테스트 중입니다. HTC는 맵을로드 할 것이고 에뮬레이터는 128MB의 (우스운) 힙 크기를 갖습니다. 이 앱의 배포는 다양한 Android 기기 사용자에게 적용되므로 2.3 대가 넘는 기기는 타겟팅 할 수 없습니다.android - Bitmapfactory oom을 피하기 위해 Canvas 대신 GLSurfaceView를 사용해야합니까?

BitmapFactory.Options o=new BitmapFactory.Options(); 
     o.inJustDecodeBounds=true; 
     BitmapFactory.decodeResource(getResources(), resourceId, o); 


     //Find the correct scale value. It should be the power of 2. 
     int scale=16; 
     while((o.outWidth/scale)>=REQUIRED_SIZE || (o.outHeight/scale)>=REQUIRED_SIZE) 
      scale*=2; 

     BitmapFactory.Options options=new BitmapFactory.Options(); 
     options.inSampleSize = scale; 

     Bitmap base_image; 
     try { 
      base_image = BitmapFactory.decodeResource(getResources(), resourceId); 
     } catch (Error e1) { 
      base_image = BitmapFactory.decodeResource(getResources(), resourceId, options); 
     } 

GLSurfaceView 여기 내 문제를 해결할 :

여기 (미안 해요 링크를 잃은 또 다른 SO 게시물에서) 나에게 사용할 수없는 이미지를 제공 내 현재 코드를입니까? 1) 평면도 이미지로드, 2) 프로그래밍 방식으로 객체 및 텍스트 레이블 그리기, 3) 평면도 좌표에 따라 확대/축소 및 반응을 지원할 수 있습니다. 이것이 답이라면 누구나 이런 기본적인 2D 작업을위한 좋은 자습서를 추천 할 수 있습니까?

+0

힌트 : PNG의 파일 크기는 압축 될 때 아무 것도 의미하지 않습니다. 메모리에서 사용되는 경우 각 픽셀에 대해 32 비트 또는 16 비트 (4 또는 3 바이트)가 있습니다. 즉, 2500 x 1500 이미지는 15 메가 바이트의 메모리를 사용합니다. – Jave

+0

맞아요, 나는 다른 질문에서 그것을 발견했습니다. 상황을 어떻게 해결할 것을 권하는거야? – cschryer

답변

0

비트 맵의 ​​메모리 사용량을 줄일 수있는 방법은 여러 가지가 있습니다. OpenGL을 사용하기로 선택한 경우 비디오 메모리로 직접 보낼 수있는 미리 압축 된 텍스처를 사용할 수 있습니다. 안드로이드는 기본적으로 ETC1 텍스처를 지원합니다. 정확하게 ETC가 25 %의 크기 감소를 기억한다면. 그러나 OpenGL에 대한 경험이 없으므로 그림 텍스트와 같이 약간 더 복잡한 작업을 수행해야하므로 (이 방법을 사용하면 구형 장치에서 최상의 성능을 얻을 수 있습니다.). 거기서 엔진을 사용하는 것을 고려해 볼 수 있습니다 (AndEngine 또는 Box2d가 인기가 있습니다).

더 빠르고 더 좋은 옵션은 평면도의 벡터 표현 (예 : SVG 파일)을 만드는 것일 수 있습니다 (배경색과 벽으로 구성된 간단한 계획이있는 경우 가능해야 함). 그런 다음 고급 이미지가 필요한 경우 Path 클래스 또는 외부 라이브러리를 사용하여 그립니다.

+0

제 3 자의 평면도 파일을 얻고 있는데 PNG가 아닌 다른 파일을 얻을 수 있다고 생각하지 않습니다. 나는 내가 이해할 수 있는지/사용 하는지를 알아보기 위해 기타를 살펴볼 것이다. 감사. – cschryer

관련 문제