【问题标题】:OpenGL-ES iOS DrawText on screen drops FPS dramastically屏幕上的 OpenGL-ES iOS DrawText 大幅降低 FPS
【发布时间】:2013-07-10 01:51:34
【问题描述】:

我们的团队开发了一个 OpenGL 应用程序,可以在屏幕上绘制不同的多边形。此外,我们希望创建大约 1000 个不同的字符串以在屏幕上打印。如果我们使用 Texture2D 类执行此操作,则 FPS 会下降到 3 以下。

我已经测试过 Bitmap 字体,但并没有提高性能。

在 OpenGL iOS 中,在不损失性能和质量的情况下绘制大量文本的最佳方法是什么(文本应该是可扩展的)?

【问题讨论】:

    标签: ios performance text opengl-es drawing


    【解决方案1】:

    分配 1000 个纹理会占用大量内存,并且会降低您的应用程序的速度,尤其是当它们具有足够高的分辨率以供阅读文本时。您应该根据需要生成这些纹理,并在它们不再显示时释放它们。确保您不是在每一帧都生成和释放纹理,而是仅在需要时生成和释放纹理。

    如果您在同一场景中绘制所有 1000 个字符串,则应将尽可能多的字符串组合成相似的纹理。这将允许您利用 Cocos2D 的 TrueType 渲染系统来保持文本的高质量。另一方面,如果这不是一个选项,并且所有 1000 个字符串都需要相互区分,请考虑构建一个字体渲染系统,将每个字符渲染为一个字形图像。这会将用于表示所有标准英文字符和标点符号的纹理数量从 1000 个减少到大约 100 个。我必须为在 OpenGL 环境中具有大量动态文本的视频游戏做类似的事情,并从中获得良好的性能。但是,除非绝对必要,否则我不推荐它,因为它会将您的文本限制为您定义的字形,并且您必须自己编程格式。

    【讨论】:

    • 我已经实现了,只有屏幕可用的纹理被创建并在使用后释放它们。正如你所描述的,我认为我的问题是我在每个新的渲染过程中绘制和创建它们,这是瓶颈。你知道我怎样才能避免它吗?感谢您的回答。
    • 是的,为您计划使用的所有字形(大小写、数字、标点符号等)创建纹理,并将这些纹理存储在自定义文本处理类中。然后将成员函数添加到以字符串和模型视图矩阵作为参数的类中。该函数应该查找字符串中每个字形的纹理并从模型视图开始绘制它们,在绘制后将模型视图转换为每个字形的宽度。这会将内存使用量从 1000 个大纹理减少到大约 100 个小纹理。
    • 如果您不想制作这样的字体系统并且可以节省内存,我只需在启动时创建字符串的所有纹理,然后根据需要调用它们,仅在程序关闭时删除它们。事实上,我会先这样做,如果你不喜欢它给你的性能,只考虑做我上面的评论。
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多