我正在SurfaceView
开发游戏。它涉及大约15-20张图像,其中一些图像的平均分辨率为320X400。我有两个问题 -
我使用Drawable
图像并使用draw(canvas)
drawable方法在屏幕上绘制图像。我在一些游戏中看到人们使用Bitmap
代替Drawable在屏幕上绘制图像,在Android游戏中使用图像Drawable
或Bitmap
之间有什么区别。哪种内存效率更高,并且在画布上绘制时具有良好的性能?
现在我正在创建Drawable
数组并创建游戏中使用的所有图像的Drawable对象,并将它们放入各自的数组中,因为游戏时需要所有图像。我想知道哪个更好 - 在开始时加载Drawable中的所有图像或在我们需要时创建可绘制对象,并在每次显示图像或从屏幕上移除图像时使其他未显示的图像重复此过程。重复创建和归零对象的过程会产生什么不良影响,还是比一次加载所有图像更好?
由于
答案 0 :(得分:3)
根据我的经验,Bitmap比drawable更快。我正在测试一个应用程序,工作速度为40-45 fps,可绘制和位图,我得到57-59 fps。那是因为人们将它们用于游戏。
如果您有足够的内存,我建议您先加载所有图像。如果你开始创建和销毁对象,它将经常调用垃圾收集器,它真的很慢。如果您不需要高性能,创建和销毁对象将减少内存的使用。如果您正在尝试制作游戏,也许此链接可能有所帮助。
Google I/O 2009 - Writing Real-Time Games for Android特别是分钟22:30快速java代码
答案 1 :(得分:2)
根据个人经验,您应该使用Bitmaps而不是Drawables。这将产生更好的结果。
位图最适合您的选择,因为您需要的所有内容(据我所知)是一张要在屏幕上显示的图片。
Drawable具有更广泛的范围(来自Android Dev。网站的文档):
Drawable是“可以绘制的东西”的一般抽象。 大多数情况下,您将处理Drawable作为资源类型 检索到将内容绘制到屏幕上; Drawable类 提供了用于处理底层可视资源的通用API 可能采取各种形式。与View不同,Drawable不是 有任何设施来接收事件或以其他方式与之互动 用户。
在游戏开始前一定要加载所有位图;这是一种干净的方法。如果不这样做,由于GC,您的游戏可能会滞后。
您可以创建一个包含所有静态位图字段的类。
public static Bitmap foo;
然后在您的活动类中,您可以加载这些位图(我通常将我的位图放在Assets文件夹中):
注意:最好创建一个名为LoadScreen或SplashScreen的类来处理所有初始化。如果你这样做,你必须将你的活动类的引用传递给那个类。
Assets.foo = readAssetsBitmap("foo.png");
public Bitmap readBitmapFromMemory(String filename) {
Bitmap defautBitmap = null;
File filePath = getFileStreamPath(filename);
FileInputStream fi;
try {
fi = new FileInputStream(filePath);
defautBitmap = BitmapFactory.decodeStream(fi);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
return defautBitmap;
}
当用户决定退出游戏时,您应该卸载所有位图,如下所示:
disposeBitmap(Assets.foo);
public void disposeBitmap(Bitmap bitmap) {
bitmap.recycle();
bitmap = null;
}
我希望这会有所帮助。