0

我喜欢使用 assets 文件夹而不是 drawable 文件夹(如果它不是九个补丁),因为我可以在那里使用多个文件夹。然而,我用来获取可绘制对象的方法需要 cpu 做很多安静的事情。例如:添加 10 个 ImageViews 后需要 10% CPU(我使用的是 Android Assistent 和 Samsung TouchWiz TaskManager)。我在写游戏时没有注意到它。现在这个游戏即使不在前台也需要 40-100% 的 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 中添加一些 ImageView:

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

1 回答 1

1

对您来说最好的办法可能是使用 traceview 分析执行情况,因为这将使您全面了解您的应用程序在哪里花费了大部分执行时间。然后你可以专注于优化那段特定的代码。

只是一个有根据的猜测,但我感觉大部分浪费的执行不是因为您将图像assets/而不是资源拉出来,而是因为之后完成的所有缩放工作(从它的外观来看,这就是全部在主线程上完成,所以没有并发可言)。

我可能会建议您在解码资产时尝试利用一些可用的BitmapFactory.Options文档链接)。特别是,您应该能够使用 、 和 选项的组合来完成您需要的inScaled所有inDensity缩放inTargetDensity。如果您将这些传递给您的decodeStream()方法,您可能会在返回之前删除所有用于调整图像大小的后续代码。

于 2012-02-02T20:17:23.920 回答