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