我正在使用opengl在android上开发一个游戏,并且有一些性能问题。
比方说,我想画一个背景,背景部分充满了草“灌木丛”。灌木丛有不同的x,y,z,不同的大小等等(每个灌木是一个2D精灵),潜在的部分隐藏彼此(我使用透视相机)。如果这些精灵很大,我的性能就会有很大问题(即四角体大小,而不是纹理大小/分辨率):
我有很好的表现,如果使用前到后没有阿尔法测试,但当然,雪碧断线是完全没有,这是真的很糟糕。
所有的灌木丛都有相同的纹理,我使用16位颜色,mip映射,几何分批,裁剪面,没有着色器等。所有我能想到的,以提高性能(在其他情况下并不坏),除了纹理压缩。我甚至过滤精灵,以避免“显示”的屏幕外。我还为测试目的尝试了一些“暴力优化”,例如使纹理完全不透明,大量降低纹理分辨率,禁用混合等等,但是除了alpha测试删除之外,没有什么比这更好的性能了。
我想知道我是不是忘了在这里做些什么来帮助演出。背到前创建透支,前面到后面是缓慢的,因为alpha测试(我不希望我的灌木丛是“方形”图像,所以我不能禁用alpha测试)。如果我创造了更小的精灵性能要好得多(即使有更多的精灵),但这只是一个解决办法。
总结一下,如何在不损失性能的情况下,显示需要裁剪的重叠大四角体?
PS :我正在测试一个连体一号。
PS2 :一些优化建议不要创建四边形,而是几何图形更“适合”纹理,但这似乎是一个非常乏味的过程,我认为这对我没有多大帮助。
发布于 2013-05-15 22:40:36
因为早期的z,画正面对背通常是一个好处:硬件可以在光栅化之后,在做纹理提取或阴影之前做深度测试。对于前后排序,大多数片段都无法通过深度测试,您可以节省大量的纹理带宽、阴影吞吐量和z缓冲器写入带宽。
但阿尔法测试打破了这一点。如果一个片段通过了深度测试,它可能仍然会被alpha测试杀死,所以在纹理/阴影处理之后才会发生zwrite。大多数能够实现早期z的硬件仍然必须在管道中的同一点进行深度测试,就像它做zwrite一样,所以使用alpha测试,在纹理和阴影处理之后,您最终会执行ztest + zwrite。因此,前面到后面的排序只会节省zwrite带宽,而不是其他任何东西。
我认为你有两种选择,如果你真的想要大的精灵,并且有很大的重叠:
(a)只对你的精灵使用两个或三个不同的Z值。用混合(和α-测试,如果有帮助的话)把它们拉到前面。层中不存在重叠:您可以在原始资产中或在运行时对每个层进行预呈现,然后向左和向右移动。
(b)如果你的精灵有很大的不透明区域被半透明的边界包围,你可以在没有阿尔法测试的情况下第一次画出不透明区域,然后单独绘制边界。这将减少α测试片段的数量。
https://stackoverflow.com/questions/16572254
复制相似问题