我目前正在尝试使用SurfaceView为Android平板电脑设备制作游戏。我有精灵,什么不是,但如果我应该使用整个spritesheet(包含每个动画),或者只是将sprite分隔在图像文件上,我就会挣扎。
例如,我的spritesheet名为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会更好吗?
答案 0 :(得分:0)
没关系,我只是回答了我自己的问题。似乎每次迭代渲染 Bitmap.decodeResource()
都落后于整个画布,而不是渲染实际的spritesheets并使用Rect
。性能方面,如果在画布上遇到太多延迟,除了使用inSampleSize
或使用GLSurfaceView
缩小图像之外别无他法。