我必须在irrlight中渲染大量的彩色广告牌,但是它真的很慢。我使用了许多BillboardSceneNodes:
List<BillboardSceneNode> voxels = new List<BillboardSceneNode>();
for (int x = 0; x < 32; x++)
for (int y = 0; y < 32; y++)
for (int z = 0; z < 32; z++)
{
Color c = new Color(r.Next(255), r.Next(255), r.Next(255));
BillboardSceneNode b = device.SceneManager.AddBillboardSceneNode(null, new Dimension2Df(1), new Vector3Df(x, y, z), -1, c);
b.SetMaterialFlag(MaterialFlag.Lighting, false);
voxels.Add(b);
}
我如何优化它?如何对广告牌进行遮挡剔除或截锥体剔除?
每个渲染调用都有一个设置和拆除成本,你在每个广告牌之间支付这个费用,这将花费你很多时间在几百个广告牌之后。如果许多广告牌共享相同的纹理和材料,那么你可以将它们分组到相同的表面,并以与粒子系统场景节点相同的方式在单个调用中渲染它们,如果你这样做,那么你将获得几个数量级的改进(因此数万而不是数百),并将瓶颈转移到花费在上传顶点到显卡上的时间。
如果你需要100k+广告牌,那么你可以进一步优化这一点,而不是发送每个广告牌的每个三角形的每个边和顶点到每一帧的卡,你可以发送一个位置列表,而不是使用特定于视频驱动程序的着色器来渲染它们。如果你这样做,你会失去一些irlight的优点,比如软件驱动程序支持。
如果这还不够好,你需要进入数百万,那么你需要卸载所有的工作到GPU和决定顶点着色器的位置。这在您的用例中可能是不可能的,但是如果您可以这样做,那么您只受限于图形卡的计算能力。