Видимость по дистанции: ближняя и дальняя модели
Переключать представления по расстоянию и понимать границы LOD: обработка, физика и ресурсы продолжают существовать.
Когда использовать
VisibilityRangeBegin и VisibilityRangeEnd позволяют показать сложную модель вблизи и более простую вдали. Пример использует белую сферу и синий куб, чтобы переключение было очевидно. Это выбор разных заранее подготовленных мешей, а не автоматическое уменьшение числа треугольников одного меша.
Запустить переключение
Возьмите все три файла из примера камеры, выполните dotnet build и назначьте ViewLab3D.cs корневой Entity3D уровня .rscene. Нужны SDK 1.0.0 и net10.0. Оставьте UseWall=false до запуска, иначе стена приблизит камеру и дальняя модель может не появиться.
| Объект | Начало | Конец | Результат |
|---|---|---|---|
| NearModel: белая сфера | 0 | 12 | Видна вблизи; ноль отключает нижний предел |
| FarModel: синий куб | 12 | 0 | Видна вдали; ноль отключает верхний предел |
Нажимайте ↓ для отдаления и ↑ для приближения. На дистанции 6 видна сфера, на 18 — куб. Дистанция считается до преобразованного центра AABB геометрии, не обязательно до origin Entity. Здесь оба меша симметричны и стоят в одной точке, поэтому сравнение предсказуемо.
Оба кадра получены в актуальном локальном движке, Compatibility/OpenGL, viewport 512×384. Это демонстрация переключения, не замер FPS или масштаба мира.
Настроить границу без ложных ожиданий
У примера отключён прозрачный fade, margin равны нулю. На точной общей границе 12 обе модели могут быть видимы: не рассчитывайте на правило «всегда ровно один меш». У несовпадающих AABB границы также окажутся в разных местах. Проверяйте переход при реальном движении камеры; перекрытие одинаковых поверхностей может дать z-fighting.
VisibilityRangeBeginMargin и VisibilityRangeEndMargin при отключённом fade дают гистерезис: порог зависит от предыдущего состояния, чтобы колебание камеры не вызывало частое переключение. Они не включают прозрачность сами по себе. Согласуйте диапазоны соседних представлений и проверьте отсутствие заметных дыр и скачков.
Прозрачные режимы Self/Dependencies по исходникам требуют Forward+. Они не подтверждены этим примером и не должны обещаться для Compatibility или Mobile. Плавный переход, освещение и тени проверяйте отдельно в целевом renderer.
Что остаётся работать
В тесте невидимая по диапазону NearModel продолжила _Process, а Visible и IsVisibleInTree остались true. Проверялся этот полный класс:
LodVisual3D.cs
using Reckfell;
public partial class LodVisual3D : MeshInstance3D
{
public int ProcessTicks { get; private set; }
public override void _Process(double delta) => ProcessTicks++;
}Диапазоны геометрии не выключают отдельное StaticBody3D: луч продолжил попадать в тело цели при показе дальней модели. Они также не удаляют Entity, не освобождают меши из памяти и не выгружают уровень.
| Нужно | Дополнительное решение |
|---|---|
| Снизить стоимость отрисовки далёкого объекта | Более простой дальний меш, подходящие материалы и диапазоны |
| Остановить дорогую игровую логику | Явное управление обработкой с учётом требований игры |
| Уменьшить стоимость физики | Отдельная политика активности и детализации физических тел |
| Выгружать части мира | Загрузка, владение ресурсами и сохранение состояния чанков |
| Упростить один меш автоматически | Отдельный механизм mesh LOD и поддерживаемый импорт |
Не выключайте симуляцию только потому, что игрок не видит объект: мир игры может требовать продолжающегося движения, таймеров или сетевого состояния.
Диагностика
- Обе модели постоянно видны: проверьте назначение диапазонов именно GeometryInstance3D и расстояние от активной камеры.
- Дальний меш не появляется: проверьте фактическую позицию камеры, ограничения пружины и расположение центров AABB.
- Объект исчезает на промежутке: диапазоны не покрывают нужную дистанцию либо центры моделей различаются.
- FPS почти не изменился: стоимость может приходиться на скрипты, физику, материалы или число вызовов, а не треугольники. Нужен профиль целевого уровня.
Проверены жёсткое переключение, реальные пиксели и сохранение обработки/физики. Стриминг, прозрачный fade и выигрыш производительности не проверены.