【问题标题】:Large scrolling background in OpenGL ESOpenGL ES 中的大滚动背景
【发布时间】:2010-09-18 02:01:40
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: iphone performance opengl-es scroll 2d


    【解决方案1】:

    快速解决方案:

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

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

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

    • 使用瓦片宽度和瓦片高度的模数作为位置移动瓦片(以便瓦片在其长度恰好移动一个瓦片时将自身重新定位在其起始位置)。还要记住在该操作期间重新映射纹理。这允许您在任何给定时间加载非常小的网格/非常少的纹理内存。我想这在 GL ES 中尤为重要。

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

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

    【讨论】:

    • 我真的不认为瓷砖渲染库是原始海报所追求的。该库用于将场景渲染为巨大的像素分辨率,超过 OpenGL 一次支持的分辨率。
    • 是的,库的功能与我需要的不同,但是将背景分割成更小的图块可能是个好主意。 (谢谢。)
    【解决方案2】:

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

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

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

    编辑:糟糕。在仔细阅读了您的问题后,我必须提供另一条建议:在模拟器上进行的计时毫无价值。

    【讨论】:

    • 谢谢你,我或多或少认为会是这样。今天我终于拿到了一个 iPod 来测试,我会在实际的硬件上运行代码,看看会发生什么。
    • 在设备上尝试代码后:是的,模拟器上的计时一文不值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多