我必须在Irrlicht中渲染大量彩色广告牌,但它确实很慢。 我使用了很多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);
}
我如何优化?我如何用广告牌进行遮挡剔除或截头剔除?
答案 0 :(得分:2)
每个渲染调用都有一个设置和拆卸成本,你在每个广告牌之间付费,这将花费你几百个广告牌后的大量时间。如果您的许多广告牌共享相同的纹理和材质,那么您可以将它们分组到同一个表面并在一次调用中以与粒子系统场景节点相同的方式渲染它们,如果您这样做,那么您将得到几个数量级的改进(数万甚至数百)并将您的瓶颈转移到将顶点上传到视频卡所花费的时间。
如果您需要100k +广告牌,那么您可以进一步优化它,而不是将每个广告牌中每个三角形的每个边和顶点发送到每个帧的卡,您可以发送一个位置列表并使用特定于着色器渲染它们到您的视频驱动程序。如果你这样做,你将失去一些Irrlicht的细节,比如软件驱动程序支持。
如果这还不够好并且您需要达到数百万,那么您需要将所有工作卸载到GPU并确定顶点着色器中的位置。这在您的用例中可能无法实现,但如果您可以这样做,那么您只受图形卡计算能力的限制。