我创建了一个小应用程序(游戏),它可以多次重复使用同一组图像。所以我认为我应该创建一个负责加载所有不同图像的类,然后我可以从中静态地从其他类访问它们。但是,我相信这可能会导致垃圾收集器出现问题,导致我的应用程序在运行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);
}
}
注意,我只使用一个Bitmap来解决问题。基本上,当我想在我的应用程序中使用图像时,我说:
object.image = ImgLoader.tree1;
这样做的替代方法是什么,这不是内存密集型的?
谢谢!
答案 0 :(得分:2)
这对我来说似乎是非常糟糕的做法,特别是因为您要加载多个Bitmaps
并保留静态引用它们
由于即使很小的Bitmaps
会消耗相当多的内存,但很快就会遇到OutOfMemoryErrors
。
Bitmap
512x512已消耗 1兆字节的RAM(32位)颜色。您可以在RGB_565
(16位)中加载位图以减少内存消耗。
为什么不在需要时从Bitmap
加载Resources
?
答案 1 :(得分:0)
尝试以InputStream格式获取它们......它们将是字节...但是人物,(并且它真的是个人)我更喜欢在需要时加载每个图像而不是将它们留在内存中...以备将来使用,图像的数量可以增加,另外,正如你提到的,我在你的代码中注意到,图像存储在本地(而不是负载),所以它很难重新加载它们......但同样是我自己的意见
答案 2 :(得分:0)
不要认为它与gc有任何关系;您手动调用gc时正在加载图像。
我认为这是导致您的应用滞后的图片加载。您可以异步加载位图。