我正在使用 opengl 在 android 上开发游戏,但遇到了一点性能问题。
例如,假设我想绘制一个部分填充草“灌木”的背景。灌木有不同的 x、y、z、不同的大小等等(每个灌木都是 2D 精灵),并且可能会部分地相互隐藏(我使用透视相机)。如果这些精灵很大(即四边形大小,而不是纹理大小/分辨率),我会遇到很大的性能问题:
如果我使用经典的从前到后绘制(以避免过度绘制),我发现自己因为(我认为)alpha 测试而遇到问题。即使灌木丛只有不透明和完全透明的像素(没有部分透明),并且如果我使用正确的 alpha 测试比较(GL_EQUAL 1),性能也很差,因为很多像素必须经过 alpha 测试(如果我理解正确的话) .
如果我使用禁用 alpha 测试的后到前显示器,我也会失去很多性能(但这次是因为过度绘制问题),即使禁用深度缓冲区写入(如果深度测试被禁用,不确定它是否会做任何事情)方法)。
如果在没有 alpha 测试的情况下从前到后使用,我会有很好的表现,但当然精灵切割完全消失了,这真的很糟糕。
所有灌木都具有相同的纹理,我使用 16 位颜色、mip 映射、几何批处理、剔除面、无着色器等。所有我能想到的提高性能(在其他情况下也不错),除了纹理压缩. 我什至过滤精灵以避免“显示”屏幕之外的精灵。为了测试目的,我还尝试了一些“暴力优化”,例如使纹理完全不透明、大大降低纹理分辨率、禁用混合等,但除了 alpha 测试删除之外,没有什么是出色的性能方面的。
我想知道我是否在这里忘记了一些有助于表演的东西。从前到后会产生透支,由于 alpha 测试,从前到后很慢(而且我不希望我的灌木丛是“方形”图像,所以我不能禁用 alpha 测试)。如果我创建更小的精灵,性能会好得多(即使有更多的精灵),但这只是一种解决方法。
总而言之,如何在不损失性能的情况下显示重叠的需要剪切的大四边形?
PS:我正在测试一个nexus。
PS2:一些优化建议不要创建四边形,而是创建更“适合”纹理的几何图形,但这似乎是一个非常乏味的过程,我认为对我没有多大帮助。