Android - SurfaceView:使用或不使用spritesheet?

时间:2013-01-27 06:21:53

标签: android sprite surfaceview out-of-memory

我目前正在尝试使用SurfaceView为Android平板电脑设备制作游戏。我有精灵,什么不是,但如果我应该使用整个spritesheet(包含每个动画),或者只是将sprite分隔在图像文件上,我就会挣扎。

例如,我的s​​pritesheet名为bear.png,里面包含16个图像。我可以使用Rect为它们制作精美的动画(感谢mybringback):

canvas.drawBitmap(bitmap, rectSrc, rectDest, null);

但是,我担心这样做会最终增长到大于堆大小。

然而,还有另一种方法。通过分离每个图像(bear1.png,bear2.png直到bear16.png),我还可以通过以下方式创建一个带有这些精灵的动画:

Bitmap bitmap = Bitmap.decodeResource(context.getResources(), context.getResources().getIdentifier("bear" + index, "drawable", "com.example.game"));

然后将其调用到画布:

canvas.drawBitmap(bitmap, bitmapX, bitmapY, null);

现在也可以正常使用。当然,它大大减少了我的堆大小,因为我一次只使用1个图像。但是,因为很好..因为,我几乎所有时间都在回忆Bitmap.decodeResource(),我担心一次将多个动画组合在一起时,可能会导致显着的延迟。

简而言之:
- Spritesheets:堆大小增加(最终可能导致OutOfMemory错误),但性能更好
- 不同图像文件上的精灵:减小堆大小,但可能会影响性能 我不完全确定使用哪种方法。如果我使用第二种方法(不同图像文件上的精灵),它真的可以吗?或者只用spritesheets会更好吗?

1 个答案:

答案 0 :(得分:0)

没关系,我只是回答了我自己的问题。似乎每次迭代渲染 Bitmap.decodeResource() 都落后于整个画布,而不是渲染实际的spritesheets并使用Rect。性能方面,如果在画布上遇到太多延迟,除了使用inSampleSize或使用GLSurfaceView缩小图像之外别无他法。