我正在为 iPhone 开发一款 2D 卷轴游戏。我有一个大图像背景,比如 480×6000 像素,只有一部分可见(正好一个屏幕的大小,480×320 像素)。在屏幕上获得这样的背景的最佳方法是什么?

目前,我将背景分为多个纹理(以绕过最大纹理大小限制),并将每个帧中的整个背景绘制为纹理三角形条。滚动是通过平移模型视图矩阵来完成的。剪刀框设置为窗口大小,480×320像素。这并不意味着要快,我只是想要在优化之前有一个工作代码。

我认为 OpenGL 实现可能足够聪明,可以丢弃背景的不可见部分,但根据我编写的一些测量代码,背景绘制平均需要 7 毫秒,最多需要 84 毫秒。(这是在模拟器中测量的。)这大约是整个渲染循环的一半,即。对我来说相当慢。

绘制背景应该像将一些 480×320 像素从 VRAM 的一个部分复制到另一部分一样简单,或者换句话说,速度非常快。接近这样的性能的最佳方法是什么?

有帮助吗?

解决方案

这是最快的方法。您可以采取以下措施来提高性能:

  • 尝试不同的纹理格式。SDK 文档大概有关于首选格式的详细信息,并且大概越小越好。
  • 自己完全剔除屏幕外的图块
  • 将图像分割成更小的纹理

我假设您以 1:1 的缩放比例进行绘制;是这样吗?

编辑: 哎呀。仔细阅读你的问题后,我不得不提供另一条建议: 在模拟器上进行的计时毫无价值。

其他提示

快速解决方案:

  • 创建图块的几何矩阵(最好是四边形),以便在可视区域的所有侧面上至少有一行/列的屏幕外图块。

  • 将纹理映射到所有这些图块。

  • 一旦一个图块超出了可视区域,您就可以释放该纹理并绑定一个新的纹理。

  • 使用图块宽度和图块高度的模作为位置来移动图块(这样,当图块移动了恰好一个图块的长度时,它会将自身重新定位在其起始位置)。还要记住在该操作期间重新映射纹理。这允许您在任何给定时间加载非常小的网格/非常小的纹理内存。我认为这一点在 GL ES 中尤其重要。

如果您有空闲内存并且仍然受到加载速度慢的困扰(尽管您不应该使用那么多纹理)。您可以构建一个纹理流引擎,当您到达新区域时,该引擎将纹理预加载到更快的内存中(无论目标设备上是什么)。在这种情况下,纹理映射将在需要时从更快的内存中进行。只需确保您能够在不耗尽所有内存的情况下预加载它,并记住在不需要时动态释放它。

这是 GL(非 ES)图块引擎的链接。我自己没有使用过它,所以我不能保证它的功能,但它可能可以帮助你: http://www.mesa3d.org/brianp/TR.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top