Пользовательский метод для рисования Drawables из папки активов имеет большое использование процессора - PullRequest
0 голосов
/ 02 февраля 2012

Мне нравится использовать папку активов вместо папки для рисования (если это не патч из девяти), потому что я могу использовать несколько папок там. Однако метод, который я использую для рисования, требовал от процессора много молчать. Например: после добавления 10 ImageViews требуется 10% ЦП (я использую Android Assistant и Samsung TouchWiz TaskManager). Я не заметил этого, когда писал игру. И теперь этой игре требуется процессор на 40-100%, даже если она не на переднем плане.

Это метод, который я использую для создания рисунка:

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;
}

Единственное, что я делаю в приложении, это добавляю несколько ImageViews в RelativeLayout с помощью этого метода:

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 Ответ

1 голос
/ 03 февраля 2012

Вероятно, лучше всего было бы профилировать выполнение с помощью traceview , поскольку это даст вам полное понимание того, где ваше приложение тратит большую часть своего времени выполнения.Тогда вы можете сосредоточиться на оптимизации этого конкретного фрагмента кода.

Просто обоснованное предположение, но у меня есть ощущение, что большая часть потраченного впустую выполнения не потому, что вы вытягиваете изображения из assets/ вместоресурсов, но вся работа по масштабированию выполняется впоследствии (и, судя по всему, все это делается в главном потоке, поэтому нельзя говорить о параллелизме).

Я мог бы рекомендовать попробовать использовать некоторыеBitmapFactory.Options ( Ссылка на документы ), доступная вам при декодировании актива.В частности, вы должны иметь возможность выполнять все необходимое масштабирование с помощью комбинации параметров inScaled, inDensity и inTargetDensity.Если вы передадите их своему decodeStream() методу, вы, вероятно, сможете удалить весь последующий код, использованный для изменения размера изображения, перед возвратом.

...