我试图确定在Android SurfaceView上滚动由平铺位图组成的背景的"最佳"方式.我实际上已经成功地这样做了,但想确定是否有更高效的技术,或者我的技术可能不适用于所有Android手机.
基本上,我创建了一个新的,可变的Bitmap,它比SurfaceView的尺寸略大.具体来说,我的Bitmap可以容纳顶部,底部,左侧和右侧的额外线条.我在我的新位图周围创建了一个画布,并绘制了我的位图图块.然后,我可以通过将我的背景位图的"Surfaceview大小"子集绘制到SurfaceHolder的画布,向上滚动到任何方向的图块.
我的问题是:
有没有比将背景位图绘制到SurfaceHolder画布更好的位blit技术?
当我滚动到背景位图的边缘并希望将地图移动一个图块长度时,最佳操作方法是什么?在我看来,我的选择是:
一个.单独重绘我背景中的所有图块,在一个方向上移动图块长度.(这让我觉得效率低下,因为它需要很多小的Bitmap绘制).
湾 只需使背景位图如此之大,以至于它将包含整个滚动世界.(这可能需要一个非常大的位图,但它只需要创建一次.)
C.复制背景位图,将其绘制到自身上,但在我们滚动的方向上移动一个图块长度,并使用几个单独的位图绘制绘制新显示的图块行或列.(这里我假设一个大位图绘制比覆盖相同范围的多个小位图更有效.)
感谢您阅读所有这些,我将非常感谢任何建议.
小智 4
我最初在我的“Box Fox”平台游戏和 RTS 中使用了与您类似的技术,但发现如果您滚动得足够多以至于需要重新绘制位图,它会导致相当明显的延迟。
我目前使用这些游戏的方法与您的选项 C 类似。我将平铺地图图层绘制到大位图网格(大约 7x7)上,占据的区域大于屏幕。当用户滚动到该网格的边缘时,我将网格中的所有位图移动(将末尾位图移动到前面),更改网格的偏移量,然后重新绘制新边缘。
我不太确定软件渲染哪个更快(您的选项 C 或我当前的方法)。我认为如果您更改为 OpenGL 渲染,我的方法可能会更快,因为您不必在用户滚动时将尽可能多的纹理数据上传到显卡。
我不会推荐选项 A,因为正如您所建议的,为平铺地图绘制的数百个小位图会降低性能,并且在较大的屏幕上会变得非常糟糕。选项 B 对于许多设备来说甚至可能是不可能的,因为很容易出现“位图大小超出 VM 预算”错误,因为许多手机上的堆空间限制设置得相当低。
另外,如果您的地图/背景不需要透明度,请尝试使用 RGB_565 位图,因为在软件中绘制速度要快得多,并且占用的内存更少。
顺便说一句,使用上述方法,我在 RTS 中的手机和 10 英寸平板电脑上的帧率都被限制在 60 fps,并在软件中渲染,并且可以平滑地滚动地图。因此,您绝对可以从 Android 软件中获得一些不错的速度我有一个为我的游戏构建的 2D OpenGL 包装器,但尚未需要切换到它。
| 归档时间: |
|
| 查看次数: |
4398 次 |
| 最近记录: |