В ситуациях когда есть большой ландшафт и тормоза, то можно использывать несколько способов их устранения. Например блоки, geo-mipmapping или другие LODы. Но реализация этих методов не всегда проста и понятна. Плюс некоторые методы могут не подходить вообще. Например в игре об уменьшении детализации не может быть и речи.
Метод (даже не метод, а хитрость) об котором я хочу рассказать прост, правда имеет свои недостатки. Метод предназначен только для равномерной, последовательной сетки. Суть метода в том, что все ячейки сетки одинаковы, то есть разница индексов треугольников ячейки равна - 3 * faceNumberPerCell. Теперь вспомним что вторым ( третим и пятым ) параметром метода GraphicesDevice.DrawIndexedPrimitives и есть смещение. Поняли в чем дело? Правильно, мы будем смещать вертексы. Вот видете как все просто. Дальше немного кода.
privatevoid DrawTerrain(int x, int y, int size, int viewSize){int index = x + y * size;int length = size * viewSize; m_effect.Begin();foreach(EffectPass pass in m_effect.CurrentTechnique.Passes){ pass.Begin();this.GraphicsDevice.Indices= m_indices;this.GraphicsDevice.Vertices[0].SetSource(m_vertices, 0, m_stride);this.GraphicsDevice.VertexDeclaration= m_vDeclaration;this.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, index, 0, length, 0, m_facesCount); pass.End();} m_effect.End();}
В результате мы отрисовываем только маленький квадратик сетки по позиции первой ячейки. Здесь я не делал проверки на правильность индексов, а ее надо делать иначе будет вам “exception”. Еще надо учитывать пересечение видимой области (квадратика) с краями.
P.S. Данный метод можно попробовать совместить с LODами.