位图瓦片的Android滚动背景

标签 android

我试图确定在 Android SurfaceView 上滚动由平铺位图组成的背景的“最佳”方式。我实际上已经成功地做到了这一点,但想确定是否有更有效的技术,或者我的技术是否可能不适用于所有 Android 手机。

基本上,我创建了一个新的可变位图,它比我的 SurfaceView 的尺寸稍大。具体来说,我的位图在顶部、底部、左侧和右侧容纳了一行额外的图 block 。我围绕我的新位图创建了一个 Canvas ,并将我的位图图 block 绘制到它上面。然后,只需将我的背景位图的“Surfaceview 大小”子集绘制到 SurfaceHolder 的 Canvas 上,我就可以向上滚动到任何方向的图 block 。

我的问题是:

  1. 有没有比在 SurfaceHolder 的 Canvas 上绘制背景位图更好的位 block 传输技术?

  2. 当我滚动到背景位图的边缘并希望将 map 移动一个图 block 长度时,最好的做法是什么? 在我看来,我的选择是:

一个。单独重绘我背景中的所有瓷砖,在一个方向上移动一个瓷砖长度。 (这让我觉得效率低下,因为它需要绘制许多小的位图)。

只需将背景位图制作得如此之大,以至于它将包含整个滚动世界。 (这可能需要一个非常大的位图,但它只需要创建一次。)

复制背景位图,将其绘制到自身上,但在我们滚动的方向上移动一个图 block 长度,并使用一些单独的位图绘制来绘制新显示的图 block 行或列。 (这里我假设一个大位图绘制比覆盖相同区域的多个小位图更有效。)

感谢您阅读所有这些内容,如果您有任何建议,我将不胜感激。

最佳答案

我最初在我的“Box Fox”平台游戏和 RTS 中使用了与您类似的技术,但发现如果滚动到需要重绘位图的程度,它会导致相当明显的延迟。

我目前使用这些游戏的方法与您的选项 C 类似。我将我的平铺 map 层绘制到大位图网格(大约 7x7)上,占用的区域大于屏幕。当用户滚动到该网格的边缘时,我将网格中的所有位图移到上方(将结束位图移到前面),更改网格的偏移量,然后重新绘制新边缘。

我不太确定软件渲染哪个更快(您的选项 C 或我当前的方法)。我认为如果您更改为 OpenGL 渲染,我的方法可能会更快,因为您不必在用户滚动时将尽可能多的纹理数据上传到显卡。

我不推荐选项 A,因为正如您所建议的那样,为平铺 map 绘制的数百个小位图会降低性能,并且在较大的屏幕上会变得非常糟糕。许多设备甚至可能无法使用选项 B,因为很容易出现“位图大小超出 VM 预算”错误,因为许多手机上的堆空间限制设置得非常低。

此外,如果您不需要 map /背景的透明度,请尝试使用 RGB_565 位图,因为在软件中绘制速度要快得多,并且占用的内存更少。

顺便说一下,我的手机和 10"平板电脑在我的 RTS 中都以 60fps 为上限,使用上面的方法,在软件中渲染,并且可以平滑地滚动 map 。所以你绝对可以获得一些不错的速度android 软件渲染器。我有一个为我的游戏构建的 2D OpenGL 包装器,但还不需要切换到它。

关于位图瓦片的Android滚动背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2905931/

相关文章:

android - Xam.Geolocation.Plugin 不适用于我的 Android 应用程序

java - 如何修改/适配 API 库中的方法?

java - 在 libgdx 游戏中显示分数

android - 通过 Titanium 中的 ID 更改 View 的背景颜色

android - 无法使用安卓 :xlargeScreens ="true"?

java - Android框架修改后的不匹配Dep签名

java - Android - fragment View 在 onCreateView 之外获取 NULL

android - 在 Android 应用程序中使用 OSM 而不是 Google map

android - NestedScrollview 替代方案中的 RecyclerView

android - 如何在 Unity3d 中指定 Android SDK 版本?