2012-02-02 1 views
0

드로어 블 폴더 대신에 assets 폴더를 사용하고 싶습니다 (9 패치가 아닌 경우). 여기에 여러 폴더를 사용할 수 있기 때문에 사용하고 싶습니다. 그러나 drawable을 얻기 위해 내가 사용하는 방법은 CPU가 많은 것을 조용하게 할 것을 요구했습니다. 예를 들어, 10 개의 ImageView를 추가 한 후 10 % CPU가 필요합니다 (Android Assistant 및 Samsung TouchWiz TaskManager 사용). 내가 게임을 쓰는 동안 나는 그것을 알아 채지 못했다. 그리고 전경에 있지 않더라도이 게임은 40-100 %의 CPU를 필요로합니다. 내가 만드는 데 사용하는 방법입니다자산 폴더에서 드로어 블을 드로잉하는 사용자 정의 방법은 CPU 사용량이 많습니다.

당김 :

public BitmapDrawable readAsset(path){ 
    try{ 

     inputStream = assetManager.open(path); 
     //get the Bitmap 
     desiredImg = BitmapFactory.decodeStream(inputStream, null, opts); 
     //resize for other screen sizes (scale is calculated beforehand) 
     scaleX =(int)(desiredImg.getWidth()/scale); 
     scaleY = (int)(desiredImg.getHeight()/scale); 

     //Bitmap to get config ARGB_8888 (createScaledBitmap returns RGB_565 => bad quality especially in gradients) 
     //create empty bitmap with Config.ARGB_8888 with the needed size for drawable 
     Bitmap temp = Bitmap.createBitmap(scaleX, scaleY, Config.ARGB_8888); 
     //Canvas to draw desiredImg on temp 
     Canvas canvas = new Canvas(temp); 
     canvas.drawBitmap(convert, null, new Rect(0, 0, scaleX, scaleY), paint); 

     //Convert to BitmapDrawable 
     BitmapDrawable bitmapDrawable=new BitmapDrawable(temp); 
     bitmapDrawable.setTargetDensity(metrics); 

     inputStream.close(); 
     return bitmapDrawable; 
    }catch (Exception e) { 
     Log.d(TAG, "InputStream failed: "+e.getMessage()); 
    } 
    return null; 
} 

나는이 방법으로 RelativeLayout의 일부 ImageViews을 추가하고 응용 프로그램에서 할 수있는 유일한 방법 : 아마 최고의

private void addImageToContainer(int paddingLeft, int paddingTop) { 
    ImageView imageView = new ImageView(this); 
    imageView.setImageDrawable(assetReader.readAsset("test.jpg")); 
    imageView.setPadding(paddingLeft, paddingTop, 0, 0); 
    container.addView(imageView); 
} 

답변

1

당신이 할 일은 profile the execution with traceview이 될 것입니다. 이것은 앱이 실행 시간의 대부분을 보내는 곳을 완전히 이해할 수있게 해주기 때문입니다. 그런 다음 특정 코드를 최적화하는 데 집중할 수 있습니다.

그냥 교육받은 추측이지만 자원 대신에 assets/에서 이미지를 가져 오기 때문에 대부분의 낭비되는 실행이 아니라는 느낌이 들지만 모든 축소 작업은 이후에 수행됩니다. 이 모든 것은 메인 쓰레드에서 수행되고 있으므로 동시성은 없다.)

애셋을 디코딩 할 때 사용할 수있는 BitmapFactory.Options (Docs link)을 활용하는 것이 좋습니다. 특히 inScaled, inDensityinTargetDensity 옵션을 함께 사용하여 필요한 모든 크기 조정을 수행 할 수 있어야합니다. 이 값을 decodeStream() 메서드에 전달하면 반환하기 전에 이미지의 크기를 조정하는 데 사용되는 모든 후속 코드가 제거 될 수 있습니다.

+0

CPU 사용량이 그만큼 높았던 이유는이 방법으로 인해 발생하지 않았습니다. 하지만 당신이 언급 한 traceview 덕분에 나는 진짜 이유를 매우 빨리 발견했고이 방법의 최적화는 훌륭하게 작동합니다. 문제는 실수로 자주 호출되는 실행 파일 때문입니다. 고마워요! – Xazen

관련 문제