
BetterView
Плагин для Paper и мод для Fabric, который увеличивает дальность прорисовки чанков на сервере Minecraft без потери производительности. Асинхронная загрузка, чтение чанков с диска и кэширование.
BetterView
Что это и зачем нужно
BetterView - это высокопроизводительный плагин для Paper и мод для Fabric, который решает вечную проблему серверов Майнкрафт: как дать игрокам большую дальность прорисовки, не убив при этом производительность. В ванилле увеличение view distance ведёт к лагам и просадкам FPS, потому что сервер пытается обработать все чанки синхронно. BetterView делает это асинхронно, читает чанки напрямую с диска (без их полной загрузки в память) и кэширует данные. В итоге - ты видишь дальше, а сервер не страдает.
Особенности
- Асинхронная обработка игроков в сетевых потоках
- Чтение чанков напрямую с диска без их загрузки
- Оптимизированное отслеживание состояния чанков и их итерация
- Настраиваемое кэширование данных чанков для быстрого доступа
- Ограничения на отправку и генерацию чанков (чтобы не перегружать клиент)
- Настройки для каждого измерения отдельно
- Работает как на выделенных серверах, так и на одиночной игре с Fabric
- Лёгкий анти-xray для расширенных чанков
Поддерживаемое ПО
| Версия Minecraft | Paper | Fabric |
|---|---|---|
| 26.2.x | ✅ | ✅ |
| 26.1.x | ✅ | ✅ |
| 1.21.11 | ✅ | ✅ |
| 1.21.10 | ✅ | ✅ |
| 1.21.9 | ✅ | ✅ |
| 1.21.8 | ✅ | ✅ |
| 1.21.7 | ✅ | ✅ |
| 1.21.6 | ✅ | ✅ |
| 1.21.5 | ✅ | ✅ |
| 1.21.4 | ✅ | ✅ |
| 1.21.3 | ✅ | ✅ |
| 1.21.1 | ✅ | ✅ |
На Fabric этот мод зависит от Moonrise и adventure-platform-mod.
Установка и использование
На Paper серверах просто кинь jar-файл в папку plugins и перезапусти сервер. На Fabric серверах/клиентах - в папку mods. По умолчанию BetterView настроит view distance в 32 чанка для каждого измерения.
Настройка конфига
При первом запуске плагин сам создаст конфигурационный файл. На Paper он будет лежать в plugins/BetterView/config.yml, на Fabric - betterview.yml внутри папки мира (например, world). Вот что там можно покрутить:
config-version: лучше не трогатьintegrated-server-render-distance: только для одиночной игры, позволяет заменить render distance встроенного сервера (по умолчанию-1, отключено)global:enabled: включить/выключить весь плагин/мод (по умолчаниюtrue)chunk-generation-limit: сколько новых чанков может генерироваться за один тик глобально (по умолчанию3)chunk-send-limit: максимум чанков, отправляемых одному игроку за тик (по умолчанию3)
dimensions:<dimension>(например,minecraft:overworld):enabled: включить/выключить для этого измерения (по умолчаниюtrue)chunk-generation-limit: сколько новых чанков генерировать за тик для этого уровня (по умолчанию2)chunk-queue-size: сколько чанков может быть в очереди на одного игрока (по умолчанию16)view-distance: максимальная расширенная дальность прорисовки для этого измерения (по умолчанию32)cache-duration: как долго держать расширенные чанки в памяти (по умолчаниюPT5M, 5 минут)- Подстраивай под тип сервера: для статичных лобби можно дольше, для динамичных SMP - меньше, иначе после реджойна будут старые данные.
anti-xray:- Встроенная лёгкая версия анти-xray, которая не проверяет, открыт ли блок воздуху. Так что engine-mode кроме
HIDEбудет выглядеть так себе. enabled: включить/выключить анти-xray в этом мире (по умолчаниюfalse)engine-mode: режимы:HIDE,OBFUSCATEилиOBFUSCATE_LAYER(по умолчаниюHIDE)hidden-blocks: список блоков для скрытия/обфускации (по умолчанию все руды и базовые блоки измерений)
- Встроенная лёгкая версия анти-xray, которая не проверяет, открыт ли блок воздуху. Так что engine-mode кроме
chunk-batches:- Пакетная отправка чанков, чтобы не перегружать клиент/интернет игрока. BetterView отправляет пачку и ждёт подтверждения, что игрок её получил, только потом шлёт следующую. Побочка: игроки с хорошим соединением, но высокой задержкой будут получать чанки медленнее. Важно: пачки могут отправляться через несколько тиков.
enabled: включить/выключить пакетную отправку (по умолчаниюtrue)chunks-per-batch: количество чанков в одной пачке (по умолчанию12)prepare-chunks-while-waiting: продолжать подготовку чанков, пока ждём подтверждения предыдущей пачки (по умолчаниюtrue)batch-timeout: время без отправки чанка, после которого пачка считается просроченной (по умолчаниюPT5S)batch-wait-timeout: таймаут, после которого BetterView автоматически помечает пачку как выполненную, даже без ответа игрока (по умолчаниюPT30S)
Поиграйся с лимитами генерации и отправки чанков под свой сервер.
API для разработчиков
Maven Repository: https://repo.minceraft.dev/releases/
Maven Artifact: dev.booky.betterview:betterview-api:2.2.0
Javadoc: https://repo.minceraft.dev/javadoc/releases/dev/booky/betterview/betterview-api/2.2.0
Пример для Paper
BvManager bvManager = Bukkit.getServicesManager().load(BvManager.class);
if (bvManager == null) {
throw new IllegalStateException("Failed to load BetterView API");
}
BvLevel overworld = bvManager.getLevel(Key.key(Key.MINECRAFT_NAMESPACE, "overworld"));
overworld.invalidateChunkCache(0, 0);
for (BvPlayer player : overworld.getPlayers()) {
player.getExecutor().execute(() -> {
if (!player.isActive() || player.getLevel() != overworld) return;
if (player.getChunkLifecycle(0, 0).isOwned()) {
player.refreshChunk(0, 0);
}
});
}
Пример для Fabric
BvManager bvManager = (BvManager) FabricLoader.getInstance().getObjectShare().get("betterview:api");
if (bvManager == null) {
throw new IllegalStateException("Failed to load BetterView API");
}
BvLevel overworld = bvManager.getLevel(Key.key(Key.MINECRAFT_NAMESPACE, "overworld"));
overworld.invalidateChunkCache(0, 0);
for (BvPlayer player : overworld.getPlayers()) {
player.getExecutor().execute(() -> {
if (!player.isActive() || player.getLevel() != overworld) return;
if (player.getChunkLifecycle(0, 0).isOwned()) {
player.refreshChunk(0, 0);
}
});
}
API ещё в разработке, так что если есть идеи или баги - пиши в трекер.
Сборка из исходников
- Клонируй репозиторий (
git clone https://github.com/MinceraftMC/BetterView.git) - Перейди в папку (
cd BetterView) - Собери jar-файлы (
./gradlew buildна Linux/MacOS илиgradlew buildна Windows)
Готовые jar-файлы будут в папке build/libs.
Если хочешь протестировать изменения локально, запусти ./gradlew :paper:runServer или ./gradlew :fabric:prodServer / ./gradlew :fabric:prodClient. Это запустит локальный сервер с уже установленным плагином/модом.
