【问题标题】:OOM Error when Loading a List of Bitmaps Android加载位图列表时出现 OOM 错误 Android
【发布时间】:2015-03-08 20:29:38
【问题描述】:

我正在尝试在 android 中创建单人纸牌游戏,因此我正在尝试为一副完整的纸牌加载图像(总共 53 张图像,正面 52 张,背面一张)。图像加载得很好,但是当我尝试缩放它们以适应任何设备的屏幕时,通常在第 13 张卡左右出现内存不足错误。这是我缩放卡片的方法:

public ArrayList<Card> mapBitmapToCard(ArrayList<Card> listOfCards, ArrayList<Bitmap> listOfImages, int screenHeight){
        ArrayList<Card> result = new ArrayList<>();
        for (int i = 51 ; i >= 0 ; i--){
            Card card = listOfCards.get(i);
            card.setScaleFactor(screenHeight);
            Bitmap cardFront = listOfImages.get(i);
            listOfImages.remove(i);
            card.image = Bitmap.createScaledBitmap(cardFront, (int) (cardFront.getWidth() * card.scaleFactor), (int) (cardFront.getHeight() * card.scaleFactor), true);
            cardFront.recycle();
            Bitmap back = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.card_back));
            card.back = Bitmap.createScaledBitmap(back, (int) (back.getWidth() * card.scaleFactor), (int) (back.getHeight() * card.scaleFactor), true);
            back.recycle();
            result.add(card);
            System.out.println("" + (52 - i) + " cards completed");
        }
        return result;
    }

有没有什么方法可以更有效地修复这种矿石?

【问题讨论】:

    标签: android bitmap out-of-memory scaling


    【解决方案1】:

    一个直接的想法是不要加载所有它们然后缩放所有它们。加载后立即缩放它们,然后立即回收原始图像。这样一来,您将拥有 1 个未缩放的和 n 个已缩放的图像,而不是在任何时候都有 53 个未缩放的图像和 n 个缩放的图像。

    看起来您正在创建 52 个不同的缩小图像副本。不要那样做。缩放一次并重复使用相同的参考 - 制作 52 个副本是浪费内存并且可能是您的问题。无论如何,所有 52 人的背部都是一样的,不是吗?

    【讨论】:

    • 您可能也不需要预先加载所有 52 个卡面。看看你是否可以足够快地按需加载它们。
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多