Я работаю над чем-то похожим, и я могу поделиться некоторым опытом для подобных задач со многими вершинами или сетками.Я пытаюсь визуализировать облака точек в Unity, и это очень сложная задача.В моем случае я сам создаю облака точек и не триангулирую их.Это помогает, но мне все еще приходится применять оптимизации.
По моему опыту, если у вас есть вершины более 10 миллионов визуализированных в кадре, у вас начнутся проблемы с fps.Это может варьироваться в зависимости от вашего оборудования, конечно.Также я уверен, что это будет еще хуже с триангулированными сетками.Для оптимизации я сделал следующее:
Сначала я начал рендеринг объектов, которые находятся в Camera Frustum Для этого я использовал функцию под названием IsVisibleFrom
который является расширением до Renderer
следующим образом:
с использованием UnityEngine;
public static class RendererExtensions
{
public static bool IsVisibleFrom(this Renderer renderer, Camera camera)
{
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera);
return GeometryUtility.TestPlanesAABB(planes, renderer.bounds);
}
}
Тогда вы можете использовать его следующим образомперебрав все имеющиеся у вас меши:
Renderer grid;
IEnumerator RenderVisibleGameObject()
{
for (int i = 0; i < PointCloud.transform.childCount; i++)
{
grid = PointCloud.transform.GetChild(i).GetComponent<Renderer>();
if (!grid.IsVisibleFrom(cam))
{
grid.gameObject.SetActive(false);
}
else
{
grid.gameObject.SetActive(true);
}
if (i == (PointCloud.transform.childCount - 1))
yield return null;
}
StartCoroutine(RenderVisibleGameObject());
}
Второй вариант будет, если это возможно, и если вы сможете создавать сетки с более низкой детализацией, используя
Уровень детализации .По сути, он рендерит меши с низкой детализацией, которые находятся дальше от камеры. Последний вариант, который я могу порекомендовать, - это использование
Occlusion Culling .Это похоже на первый вариант, но он также учитывает окклюзии, что было не так для меня, потому что у меня были только очки.