2014-03-01 35 views
-1

我创建了一个小应用程序(游戏),它可以多次重复使用同一组图像。所以我认为我应该创建一个负责加载所有不同图像的类,然后我可以从其他类静态访问它们。但是,我相信这可能会导致垃圾收集器出现问题,这会导致我的应用在GC运行时滞后。这里是什么ImgLoader类的样子:加载位图并将它们存储为静态替代?

public class ImgLoader extends View { 
public static Bitmap tree1; 

public ImgLoader(Context context) { 
    super(context); 
    loadImgs(); 
} 

public void loadImgs() { 
    System.gc(); // Manually Call GC 

    // TREES 
    tree1 = BitmapFactory.decodeResource(getResources(), R.drawable.tree); 
    tree1 = getResizedBitmap(tree1, MainActivity.height/2, 
      MainActivity.width/10); 
} 

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // CREATE A MATRIX FOR THE MANIPULATION 
    Matrix matrix = new Matrix(); 
    // RESIZE THE BIT MAP 
    matrix.postScale(scaleWidth, scaleHeight); 
    // "RECREATE" THE NEW BITMAP 
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, 
      matrix, false); 
    return resizedBitmap; 
} 

public static Bitmap RotateBitmap(Bitmap source, float angle) { 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(angle); 
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), 
      source.getHeight(), matrix, true); 
} 

} 

注意,我只用一个位图的问题。从本质上讲,当我想在我的应用程序中使用的图像,我说:

object.image = ImgLoader.tree1; 

什么是做这个的替代,事实并非如此内存密集型?

谢谢!

回答

2

这似乎是非常不好的做法对我来说,尤其是因为您加载多个Bitmaps,并保持他们的静态引用。

因为即使很小的Bitmaps消耗大量的内存,你很快会遇到OutOfMemoryErrors

A Bitmap 512x512已经消耗RAM(32位)颜色的1兆字节。您可以将您的位图加载到RGB_565(16位)以减少内存消耗。

为什么不在您需要时从Resources加载Bitmap

+0

我会这样做,但我需要每次调整它们以适合屏幕。 – TastyLemons

+0

我仍然不明白为什么调整位图大小需要静态引用它? –

+0

我只是说,所以每次我加载它,我将不得不调用重新调整大小的方法。这不是没有效率吗? – TastyLemons

0

尝试让它们处于InputStream格式......它们将以字节为单位..但是personnaly(我真的很个人)我更喜欢在需要时加载每个图像而不是将它们留在内存中..对于未来使用,图像的数量可以增加,加上,正如你提到的,我注意到在你的代码中,图像是本地存储的(不是doenloaded),所以它很难回绝它们的大问题..但它的我自己的意见

0

不要认为它与gc有任何关系;您在手动调用gc时正在加载图像。

我相信这是导致您的应用程序滞后的图像加载。您可以异步加载位图。

+0

我只在开始时加载它们。这些应用程序运行良好,然后每次GC运行时都会滞后。 – TastyLemons

+0

你用什么来监控垃圾收集?从上面的代码中,只有在加载图像时才会手动触发它。 – NameSpace

相关问题