2011-12-28 107 views
4

我正在开发一款游戏SurfaceView。它涉及大约15-20个图像,其中一些大,平均分辨率为320X400。我有两个问题 -使用surfaceview,canvas的Android游戏 - 可绘制或位图

  1. 我使用的图像作为Drawable和使用可绘制的draw(canvas)方法在屏幕上绘制图像。我发现在某些游戏中,人们使用Bitmap代替Drawable在屏幕上绘制图像,在Android游戏中使用图像DrawableBitmap有什么区别。哪种内存效率更高,在画布上绘制时性能更好?

  2. 现在我正在创建Drawable的数组,并创建游戏中使用的所有图像的Drawable对象,并将它们放入各自的数组中,因为在玩游戏时需要所有图像。我想知道哪个更好 - 在开始时将所有图像加载到Drawable中,或者在我们需要时创建Drawable对象,并将其他空的图像设置为null,并在每次显示或从屏幕上移除图像时重复此过程。重复创建和清零对象的过程是否会产生任何不良影响,还是比一次加载所有图像更好?

感谢

回答

3
  1. 根据我的经验位图比绘制更快。我测试的应用程序工作在40-45 fps与drawable和位图我得到57-59 fps。那是因为人们用它们来玩游戏。

  2. 如果你有足够的内存,我建议你先加载所有的图像。如果你开始创建和销毁对象,它会经常调用垃圾收集器,而且速度很慢。如果你不需要高性能,创建和销毁对象将减少对内存的使用。如果你想制作一款游戏,那么这个链接可能会有所帮助。

Google I/O 2009 - Writing Real-Time Games for Android尤其分钟22点半快的Java代码

2

从个人的经验谈你应该Bitmaps而非Drawables去。这会产生更好的结果。

位图将最适合您的选项,因为您需要的所有东西(如我所知道的)是要显示在屏幕上的图片。

可拉伸具有较宽的范围(文件从Android开发网站。):

可拉伸性是一般的抽象“的东西,可以得出。” 大多数情况下,您将处理Drawable作为资源的类型 检索绘制的东西到屏幕上;可绘制类 提供了一种通用API,用于处理可能采用多种形式的基础可视资源 。与视图不同,Drawable不具有接收事件或与其他用户交互的任何设施。

在游戏开始之前将所有Bitmaps绝对加载;这是一个干净的方法。如果你不这样做,由于GC,你的游戏可能会滞后。

您可以创建一个包含所有静态位图字段的类。

public static Bitmap foo; 

然后在您的活动类,你可以加载这些位图(我通常把我的位图中的资产文件夹):

注:这可能是最好创建一个名为LoadScreen或闪屏,将照顾类所有的初始化。如果你这样做,你必须将一个对你的活动类的引用传递给这个类。

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; 

    } 

我希望这有助于。