Я создаю игру XNA, которая требует огромного пространства для игроков. В настоящее время я использую тестовую карту высот 4096x4096 и сохраняется как 4-битный BMP.
Я пытаюсь взять этот огромный файл карты высот и отобразить его в игре. Проблема, с которой я сталкиваюсь, заключается в том, что неэффективно загружать всю местность в память одновременно, поскольку она будет использовать большую часть доступной памяти.
Другая проблема, с которой я столкнулся, заключается в том, что я не могу отобразить все ландшафты в одном примитиве из-за жесткого ограничения, установленного в XNA.
С учетом сказанного я натолкнулся на ряд решений, все из которых я перечислил ниже:
- Рендеринг основан на текущем местоположении пользователя - в основном рисование квадрата вокруг пользователя независимо от его ориентации в мире. Это не совсем то, что я хотел, потому что вы по-прежнему отображаете пространство, которое пользователь не видит.
- Рендеринг основан на ориентации и положении пользователя - я нашел формулу для получения треугольника, который должен иметь то, какие пиксели карты высот должны быть отрисованы, но это оказалось очень трудным.
- Разделение ландшафта на несколько фрагментов и рендеринг, какие из них ближе всего к пользователю - Все еще не очень эффективно, поскольку вы по-прежнему визуализируете фрагменты, которые люди не увидят. И это трудоемко, потому что тогда мне нужно разбить карту высот на несколько частей, и масштабируемость становится большой проблемой.
Попробовав эти решения, я не знаю, что делать. Я получил несколько ответов, где люди говорят мне, чтобы я делал эти сложные алгоритмы, но я просто понятия не имею, как к ним подойти.
Поэтому, в основном, я прошу простой, прямой способ рендеринга огромных ландшафтов в XNA с максимальной эффективностью.
Я довольно новичок в разработке игр в целом, но я готов исследовать, если это кажется многообещающим.
Обновление 1: после исследования метода геоклипмаппинга я начал кодировать его. Я сделал всю математику, и игра запускается. Тем не менее, это крайне неэффективно - что, вероятно, плохое кодирование с моей стороны. Он работает на 2FPS и использует все ядро моего процессора. Я собираюсь попробовать и улучшить код, но я думаю, что мне понадобится дополнительная помощь, поэтому вот Pastebin кода для класса Terrain Manager. Я опубликую результаты с большим количеством результатов позже, если когда-нибудь получу более эффективный.