From 9f3e879f0e18efa8e7705b62934ba9c2c9a96195 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 17 Aug 2024 20:34:56 +0300 Subject: [PATCH 1/4] feat: minimize lags when moving between chunks (unload loaded chunks less eagerly) + a setting to control that --- prismarine-viewer/viewer/lib/worldDataEmitter.ts | 5 +++-- src/index.ts | 3 ++- src/optionsGuiScheme.tsx | 3 +++ src/optionsStorage.ts | 1 + src/watchOptions.ts | 10 ++++++++++ 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index 9e36a89a..2e1c78db 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -19,6 +19,7 @@ export class WorldDataEmitter extends EventEmitter { private readonly lastPos: Vec3 private eventListeners: Record = {} private readonly emitter: WorldDataEmitter + preserveChunksDistance = 0 constructor (public world: typeof __type_bot['world'], public viewDistance: number, position: Vec3 = new Vec3(0, 0, 0)) { super() @@ -191,14 +192,14 @@ export class WorldDataEmitter extends EventEmitter { const [botX, botZ] = chunkPos(pos) if (lastX !== botX || lastZ !== botZ || force) { this.emitter.emit('chunkPosUpdate', { pos }) - const newView = new ViewRect(botX, botZ, this.viewDistance) + const newViewToUnload = new ViewRect(botX, botZ, this.viewDistance + this.preserveChunksDistance) const chunksToUnload: Vec3[] = [] for (const coords of Object.keys(this.loadedChunks)) { const x = parseInt(coords.split(',')[0], 10) const z = parseInt(coords.split(',')[1], 10) const p = new Vec3(x, 0, z) const [chunkX, chunkZ] = chunkPos(p) - if (!newView.contains(chunkX, chunkZ)) { + if (!newViewToUnload.contains(chunkX, chunkZ)) { chunksToUnload.push(p) } } diff --git a/src/index.ts b/src/index.ts index 39626d54..75112a67 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,7 +24,7 @@ import './reactUi' import { contro, onBotCreate } from './controls' import './dragndrop' import { possiblyCleanHandle, resetStateAfterDisconnect } from './browserfs' -import { watchOptionsAfterViewerInit } from './watchOptions' +import { watchOptionsAfterViewerInit, watchOptionsAfterWorldViewInit } from './watchOptions' import downloadAndOpenFile from './downloadAndOpenFile' import fs from 'fs' @@ -690,6 +690,7 @@ async function connect (connectOptions: ConnectOptions) { const center = bot.entity.position const worldView = window.worldView = new WorldDataEmitter(bot.world, renderDistance, center) + watchOptionsAfterWorldViewInit() bot.on('physicsTick', () => updateCursor()) diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index bcf3054f..983d0730 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -83,6 +83,9 @@ export const guiOptionsScheme: { }, starfieldRendering: {}, renderEntities: {}, + preserveChunksDistance: { + max: 5, + }, }, ], main: [ diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 990dd31e..39558ef6 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -7,6 +7,7 @@ import { omitObj } from '@zardoy/utils' const defaultOptions = { renderDistance: 3, + preserveChunksDistance: 1, multiplayerRenderDistance: 3, closeConfirmation: true, autoFullScreen: false, diff --git a/src/watchOptions.ts b/src/watchOptions.ts index e379cb50..0e6fe68a 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -63,3 +63,13 @@ export const watchOptionsAfterViewerInit = () => { viewer.world.starField.enabled = o.starfieldRendering }) } + +let viewWatched = false +export const watchOptionsAfterWorldViewInit = () => { + worldView!.preserveChunksDistance = options.preserveChunksDistance + if (viewWatched) return + watchValue(options, o => { + if (!worldView) return + worldView.preserveChunksDistance = o.preserveChunksDistance + }) +} From 057d02454f2284f287b0d235380a5bcd1d57222e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 18 Aug 2024 05:22:15 +0300 Subject: [PATCH 2/4] setting fixup --- prismarine-viewer/viewer/lib/worldDataEmitter.ts | 4 ++-- src/optionsGuiScheme.tsx | 3 ++- src/optionsStorage.ts | 2 +- src/watchOptions.ts | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index 2e1c78db..cf7f5a6c 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -19,7 +19,7 @@ export class WorldDataEmitter extends EventEmitter { private readonly lastPos: Vec3 private eventListeners: Record = {} private readonly emitter: WorldDataEmitter - preserveChunksDistance = 0 + keepChunksDistance = 0 constructor (public world: typeof __type_bot['world'], public viewDistance: number, position: Vec3 = new Vec3(0, 0, 0)) { super() @@ -192,7 +192,7 @@ export class WorldDataEmitter extends EventEmitter { const [botX, botZ] = chunkPos(pos) if (lastX !== botX || lastZ !== botZ || force) { this.emitter.emit('chunkPosUpdate', { pos }) - const newViewToUnload = new ViewRect(botX, botZ, this.viewDistance + this.preserveChunksDistance) + const newViewToUnload = new ViewRect(botX, botZ, this.viewDistance + this.keepChunksDistance) const chunksToUnload: Vec3[] = [] for (const coords of Object.keys(this.loadedChunks)) { const x = parseInt(coords.split(',')[0], 10) diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 983d0730..ca7f10cb 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -83,8 +83,9 @@ export const guiOptionsScheme: { }, starfieldRendering: {}, renderEntities: {}, - preserveChunksDistance: { + keepChunksDistance: { max: 5, + unit: '', }, }, ], diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 39558ef6..cac8c9f8 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -7,7 +7,7 @@ import { omitObj } from '@zardoy/utils' const defaultOptions = { renderDistance: 3, - preserveChunksDistance: 1, + keepChunksDistance: 1, multiplayerRenderDistance: 3, closeConfirmation: true, autoFullScreen: false, diff --git a/src/watchOptions.ts b/src/watchOptions.ts index 0e6fe68a..f9c2fc9c 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -66,10 +66,10 @@ export const watchOptionsAfterViewerInit = () => { let viewWatched = false export const watchOptionsAfterWorldViewInit = () => { - worldView!.preserveChunksDistance = options.preserveChunksDistance + worldView!.keepChunksDistance = options.keepChunksDistance if (viewWatched) return watchValue(options, o => { if (!worldView) return - worldView.preserveChunksDistance = o.preserveChunksDistance + worldView.keepChunksDistance = o.keepChunksDistance }) } From 9b5eda71d6e7133b97de8694669d7509440234aa Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 20 Aug 2024 23:37:37 +0300 Subject: [PATCH 3/4] up tooltip --- src/optionsGuiScheme.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index ca7f10cb..644ec66c 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -86,6 +86,7 @@ export const guiOptionsScheme: { keepChunksDistance: { max: 5, unit: '', + tooltip: 'Additional distance to keep the chunks loading before unloading them by marking them as too far', }, }, ], From b0f7322a85d3b1eae3a3f1cb3ff36b51f24fd231 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 20 Aug 2024 23:38:43 +0300 Subject: [PATCH 4/4] fix lint --- src/watchOptions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/watchOptions.ts b/src/watchOptions.ts index f9c2fc9c..9deb46a5 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -68,6 +68,7 @@ let viewWatched = false export const watchOptionsAfterWorldViewInit = () => { worldView!.keepChunksDistance = options.keepChunksDistance if (viewWatched) return + viewWatched = true watchValue(options, o => { if (!worldView) return worldView.keepChunksDistance = o.keepChunksDistance