首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制5个小图像时的内存问题

绘制5个小图像时的内存问题
EN

Stack Overflow用户
提问于 2017-03-01 05:39:23
回答 1查看 41关注 0票数 1

我的应用程序使用了太多的内存,我不太确定为什么。我在做一个纸牌游戏。我使用10个等宽RelativeLayouts的链式ConstraintLayout (每叠卡片1个)。我知道我可以使用其他视图组。

我的应用程序使用了大约15MB内存,直到我这样做;

代码语言:javascript
复制
public void DrawCardsMat0()
{
    RelativeLayout mat = (RelativeLayout) findViewById(R.id.PLAY_Mat0);
    mat.removeAllViews();
    RelativeLayout rl = new RelativeLayout(this);

    for (PlayingCard playingCard : Stack0.Cards)
    {
        ImageView myImg = GetCardImage(playingCard);
        RelativeLayout.LayoutParams lay = new RelativeLayout.LayoutParams(CardWidth, CardHeight);
        lay.setMargins(0, playingCard.UI_MarginTop, 0, 0);
        mat.addView(myImg, lay);
    }
}

代码语言:javascript
复制
public ImageView GetCardImage(PlayingCard playingCard)
{
    ImageView myImg = new ImageView(this);
    // a simple switch is used to here to pick the drawable. Removed as there's 52 cards)
    myImg.setImageResource(R.drawable.s1); 
    return myImg;
}

CardWidth和CardHeight是整型的(大概是150和210。像素)。

这将抽出五张牌,每个.jpg大小约为60KB(是的,KB)。这将导致60MB的内存使用。10个cols == 600mb内存(我假设,因为在此之前它是面向对象的)。

这些图像位于RelativeLayout中,并且一张一张地放置。MarginTop被用来“堆叠”它们。

提前感谢

-更新1

我现在使用的是46KB的bmp图像。在XML中创建5 ImageViews (一个堆栈的值)(并且不要在代码中调用任何东西)使用大约50MB的内存。已使用LinearLayout测试。在代码中创建相同的图像使用相同数量的内存。

-更新2-如果我创建一个新的活动,只有一个简单的LinearLayout和5个ImageViews,没有java代码,它仍然使用大约50MB的内存。

EN

回答 1

Stack Overflow用户

发布于 2017-03-01 06:19:01

在使用位图时,您应该始终小心。我将描述最重要的几点,并考虑到它们,您可以改变组织卡片图像的方式。

内存中的

  1. 位图始终以未压缩格式存在,因此其大小将与.jpg/.png/.webp/.[whatever compressed format].的大小不同实际大小取决于Bitmap.Config,但默认情况下,安卓将使用ARGB_8888 (1字节用于alpha通道,1字节用于R/G/B通道)。你可以通过以.bmp格式保存图像来粗略估计内存的大小。
  2. 当你使用带有drawable的<bitmap>标签时,这意味着在运行时位图将被包装在BitmapDrawable中。
  3. 当你调用myImg.setImageResource(R.drawable.s1)时,它意味着位图将具有和以前在内存中相同的大小,它将只是通过使用矩阵来缩放,这取决于你specified.
  4. Considering的ImageViewscaleType的大小,可能你想加载缩小的位图到内存,这取决于视图的大小。您可以通过使用BitmapFactory类来完成此操作。我建议你阅读这两篇文章,以了解安卓是如何处理位图的:Loading Large Bitmaps Efficiently.
  5. You和Managing Bitmap Memory可能也会考虑使用一些图像库,比如PicassoGlide,它们可以根据ImageView的大小加载缩小的位图。你也可以尝试使用Fresco,它将位图保存在JVM堆之外。
  6. 如果你有这样的可能性,最好有SVG格式的卡片。然后,您可以使用矢量而不是位图,后者对内存更友好(因为SVG只是一组关于如何绘制的指令)。然而,在真正复杂的SVG文件的情况下,你可能遇到另一个问题-它将花费大量的时间来绘制它。有关如何在ImageView.

中使用它,请查看this文章

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42519237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档