2014-09-25 2 views
0

그래서 저는 여기서 정말로 혼란스러워집니다. 내가 작업하는 디자이너는 Android 태블릿 용 고품질 이미지 (png 파일)를 원하지만이 게임은 덜 강력한 장치를위한 더 작은 이미지도 가지고 있습니다. 힙에있는 메모리 양은 Runtime.getRuntime().maxMemory() - Runtime.getRuntime().totalMemory()을 사용하여 사용할 이미지 세트를 결정하는 기준이 될 것이라고 생각했습니다. 그래도 그럴 것 같지 않습니다. BlueStacks에서는 고화질 이미지를 잘로드 할 수 있으며 약 4,000,000 바이트가 있습니다. 디자이너의 Galaxy Nexus에는 큰 이미지 (일부는 이미지 로딩을위한 메모리 부족으로 인한 것임)에 대한 검은 색 상자가 있지만 Galaxy Nexus에는 BlueStacks보다 많은 약 50,000,000 바이트의 사용 가능한 바이트가 있습니다.Android에서 이미지로드의 제한 요소는 무엇입니까?

제한 요인은 무엇입니까? 이와 관련하여 인상적인 화질의 모바일 게임이있는 이유는 무엇입니까? 그렇지만 몇 가지 이미지를로드 할 수는 없습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

참고로 AndEngine을 사용하고 있으며 아래 이미지의로드 예제가 나와 있습니다. 갤럭시 넥서스에로드되지 않은 이미지의

BuildableBitmapTextureAtlas resetTA = new BuildableBitmapTextureAtlas(this.getTextureManager(), 310/d, 190/d, 
      TextureOptions.BILINEAR); 
    resetTR = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(resetTA, this, "gfx/" + lowres + "reset.png", 1, 1); 

    try 
    { 
     resetTA.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(0, 0, 0)); 
     resetTA.load(); 
    } 
    catch (TextureAtlasBuilderException e) 
    { 
     Debug.e(e); 
    } 

하나는 2320x464의 스프라이트 시트 PNG 파일입니다.

+1

원하는 파일의 힙 공간은 약 4MB이며, 아마도 4MB의 단일 블록 공간은 없습니다 (http://commonsware.com/blog/2014/06/16/art-garbage-collection). html – CommonsWare

+0

일반적으로 메모리가 극도로 제한되어 있다고 생각하고 코드를 그렇게 작성해야합니다. 대부분의 장치는 중형 PC에 포함될 수있는 메모리를 가지고 있지 않습니다. 각 앱은 다른 앱 및 Android와 메모리를 공유합니다. 나는 런타임 메모리를 모니터링하는 것이 많은 도움을주지 않을 것이라고 생각한다. 로드 할 때 좋은 샘플 크기가 있어야합니다. 엄지 손톱 크기로만 이동하는 경우 4MB 이미지를 읽는 것이 좋습니다. 실질적인 정보를 얻으려면 안드로이드 가이드의 효율적인 비트 맵 읽기 - http://developer.android.com/training/displaying-bitmaps/index.html – Martin

+1

과거에는 큰 이미지에 2^AndEngine의 n 차원. Andrew가 몇 달 동안 AndEngine을 사용하지 않았으므로 그 빌드가 나중 빌드에서 여전히 문제인지 확실하지 않습니다. – dharms

답변

1

여기에는 두 가지 제한 요소가 있습니다. 먼저 힙 메모리입니다. 앱에 사용 가능한 힙을 찾으려면 Runtime 클래스의 메서드를 사용할 수 있지만 앱이 완전히 중단되기 전에 사용할 수있는 최대 메모리를 알려줍니다. 앱이 안드로이드에 존중해야 한계가이 방법을 찾을 수 있습니다

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
int memoryClass = am.getMemoryClass(); 
Log.d("MyTag", "Heap: + Integer.toString(memoryClass)); 

두 번째는 주어진 장치에 대한 평방 텍스처의 최대 크기를 제한 GL_MAX_TEXTURE_SIZE 값입니다. 이것은 다를 수 있지만 요즘은 2048 개로 보이므로 텍스처가 2048x2048 픽셀만큼 커질 수 있습니다. 그러나 유일한 권장 사항은 크기가 화면 크기보다 커야하며 실제 크기는 휴대 전화 제조업체에 달려 있다는 것입니다. 그들은 작은 부하 만 무엇을 필요로 재사용되는 큰 텍스처를 분할하기 전에

int[] maxTextureSize = new int[1]; 
GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0); 
Log.d("MyTag", "GL_MAX_TEXTURE_SIZE: " + Integer.toString(int[0])); 

게임이 인상적인 그래픽을 가질 수 있습니다

난 당신이 크기를 찾으려면 다음 코드를 사용할 수 있다고 생각 가능한 한 많이. 나는 256x256 조각으로 조립하여 풀 HD 태블릿에서도 게임을 날카롭게 만드는 게임을 만들었습니다. 조각은 여러 2048x2048 텍스처에 분산되었습니다.