android - OpenGL/Android 大 Sprite 四边形表现不佳

标签 android performance opengl-es alpha sprite

我正在使用 opengl 在 android 上开发游戏,但遇到了一点性能问题。

例如,我想绘制一个部分填充有草“灌木丛”的背景。灌木有不同的 x、y、z、不同的大小等等(每个灌木都是一个 2D Sprite ),并且可能会部分隐藏彼此(我使用透视相机)。如果这些 Sprite 很大(即四边形尺寸,而不是纹理尺寸/分辨率),我会遇到很大的性能问题:

  • 如果我使用经典的从前到后绘制(以避免过度绘制),我发现自己因为(我认为)alpha 测试而遇到问题。即使灌木丛只有不透明和完全透明的像素(没有部分透明度),并且如果我使用适当的 alpha 测试比较(GL_EQUAL 1),性能也会很差,因为很多像素必须经过 alpha 测试(如果我理解正确的话) .

  • 如果我在禁用 alpha 测试的情况下使用从后到前的显示,我也会损失很多性能(但这次是因为 overdraw 问题),即使在禁用深度缓冲区写入时也是如此(不确定它是否会执行任何操作)顺便说一句,深度测试被禁用了)。

如果在没有 alpha 测试的情况下从前到后使用,我会有很好的表现,但当然 sprite cutout 完全消失了,这真的很糟糕。

所有的灌木都有相同的纹理,我使用 16 位颜色、mip 映射、几何批处理、剔除面、无着色器等。所有我能想到的提高性能的方法(在其他情况下都不错),除了纹理压缩。我什至过滤 Sprite 以避免将它们“显示”在屏幕之外。我还尝试了一些出于测试目的的“剧烈优化”,例如使纹理完全不透明、大幅降低纹理分辨率、禁用混合等,但除了 alpha 测试删除之外,没有什么是很棒的性能。

我想知道我是否忘记了一些有助于提高性能的东西。从后到前会造成 overdraw ,从前到后由于 alpha 测试很慢(而且我不希望我的灌木丛是“方形”图像,所以我不能禁用 alpha 测试)。如果我创建更小的 Sprite ,性能会好得多(即使有更多的 Sprite ),但这只是一种解决方法。

总而言之,如何在不损失性能的情况下显示需要剪切的重叠大四边形?

附言:我正在测试 nexus one。

PS2:一些优化建议不要创建四边形,而是创建更“适合”纹理的几何体,但这似乎是一个非常乏味的过程,而且我认为对我帮助不大。

最佳答案

由于 early-z,从前到后绘制通常是一个好处:硬件可以在光栅化之后立即进行深度测试,然后再进行纹理获取或着色。使用从前到后的排序,大多数 fragment 都无法通过深度测试,并且您可以节省大量的纹理带宽、着色吞吐量和 zbuffer 写入带宽。

但是 alpha 测试打破了这一点。如果一个 fragment 通过了深度测试,它可能仍然会被 alpha 测试杀死,所以 zwrite 在纹理/着色之前不会发生。大多数可以执行 early-z 的硬件仍然必须在管​​道中与 zwrite 相同的点进行深度测试,因此对于 alpha 测试,您最终会在纹理和着色之后执行 ztest + zwrite。因此,从前到后的排序只会节省您的 zwrite 带宽,没有别的。

如果你真的想要明显重叠的大 Sprite ,我认为你有两个选择:

(a) 只为您的 Sprite 使用两个或三个不同的 Z 值。通过混合(和 alpha 测试,如果有帮助的话)从后到前绘制它们。层内无重叠:您可以在原始 Assets 中或在运行时预渲染每个层,然后左右移动它。

(b) 如果您的 sprite 具有被半透明边框包围的大不透明区域,您可以在不进行 alpha 测试的第一遍中绘制不透明区域,然后单独绘制边框。这将减少经过 alpha 测试的 fragment 的数量。

关于android - OpenGL/Android 大 Sprite 四边形表现不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572254/

相关文章:

android - quickblox + setComplexProperty

android - 没有 Firebase 云消息传递的推送通知

java - Android 注释处理器从不同模块访问带注释的类

java - 在java中用公钥加密,在C#中用私钥RSA解密

c++ - 我应该将 const 用于局部变量以进行更好的代码优化吗?

三星 Galaxy 变体上的 Android opengl 白色纹理

java - 如何编写一个函数来并行查找大于 N 的值

mysql - MYSQL(innoDB)中产品特性的电子商务数据库结构

javascript - 从深度重建片段位置

android - 法线贴图与法线坐标