3
0
Mirror von https://github.com/IntellectualSites/FastAsyncWorldEdit.git synchronisiert 2024-11-19 17:30:08 +01:00

Add config options

Dieser Commit ist enthalten in:
dordsor21 2024-09-15 16:16:43 +01:00
Ursprung f58c2d470a
Commit 56b7c6ebb5
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 1E53E88969FFCF0B
7 geänderte Dateien mit 24 neuen und 11 gelöschten Zeilen

Datei anzeigen

@ -438,7 +438,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
final ServerLevel nmsWorld = serverLevel; final ServerLevel nmsWorld = serverLevel;
CompletableFuture<LevelChunk> nmsChunkFuture = ensureLoaded(nmsWorld, chunkX, chunkZ); CompletableFuture<LevelChunk> nmsChunkFuture = ensureLoaded(nmsWorld, chunkX, chunkZ);
LevelChunk chunk = nmsChunkFuture.getNow(null); LevelChunk chunk = nmsChunkFuture.getNow(null);
if (chunk == null && MemUtil.shouldBeginSlow()) { if ((chunk == null && MemUtil.shouldBeginSlow()) || Settings.settings().QUEUE.ASYNC_CHUNK_LOAD_WRITE) {
try { try {
chunk = nmsChunkFuture.get(); // "Artificially" slow FAWE down if memory low as performing the chunk = nmsChunkFuture.get(); // "Artificially" slow FAWE down if memory low as performing the
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {

Datei anzeigen

@ -438,7 +438,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
final ServerLevel nmsWorld = serverLevel; final ServerLevel nmsWorld = serverLevel;
CompletableFuture<LevelChunk> nmsChunkFuture = ensureLoaded(nmsWorld, chunkX, chunkZ); CompletableFuture<LevelChunk> nmsChunkFuture = ensureLoaded(nmsWorld, chunkX, chunkZ);
LevelChunk chunk = nmsChunkFuture.getNow(null); LevelChunk chunk = nmsChunkFuture.getNow(null);
if (chunk == null && MemUtil.shouldBeginSlow()) { if ((chunk == null && MemUtil.shouldBeginSlow()) || Settings.settings().QUEUE.ASYNC_CHUNK_LOAD_WRITE) {
try { try {
chunk = nmsChunkFuture.get(); // "Artificially" slow FAWE down if memory low as performing the chunk = nmsChunkFuture.get(); // "Artificially" slow FAWE down if memory low as performing the
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {

Datei anzeigen

@ -439,7 +439,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
final ServerLevel nmsWorld = serverLevel; final ServerLevel nmsWorld = serverLevel;
CompletableFuture<LevelChunk> nmsChunkFuture = ensureLoaded(nmsWorld, chunkX, chunkZ); CompletableFuture<LevelChunk> nmsChunkFuture = ensureLoaded(nmsWorld, chunkX, chunkZ);
LevelChunk chunk = nmsChunkFuture.getNow(null); LevelChunk chunk = nmsChunkFuture.getNow(null);
if (chunk == null && MemUtil.shouldBeginSlow()) { if ((chunk == null && MemUtil.shouldBeginSlow()) || Settings.settings().QUEUE.ASYNC_CHUNK_LOAD_WRITE) {
try { try {
chunk = nmsChunkFuture.get(); // "Artificially" slow FAWE down if memory low as performing the chunk = nmsChunkFuture.get(); // "Artificially" slow FAWE down if memory low as performing the
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {

Datei anzeigen

@ -440,7 +440,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
final ServerLevel nmsWorld = serverLevel; final ServerLevel nmsWorld = serverLevel;
CompletableFuture<LevelChunk> nmsChunkFuture = ensureLoaded(nmsWorld, chunkX, chunkZ); CompletableFuture<LevelChunk> nmsChunkFuture = ensureLoaded(nmsWorld, chunkX, chunkZ);
LevelChunk chunk = nmsChunkFuture.getNow(null); LevelChunk chunk = nmsChunkFuture.getNow(null);
if (chunk == null && MemUtil.shouldBeginSlow()) { if ((chunk == null && MemUtil.shouldBeginSlow()) || Settings.settings().QUEUE.ASYNC_CHUNK_LOAD_WRITE) {
try { try {
chunk = nmsChunkFuture.get(); // "Artificially" slow FAWE down if memory low as performing the chunk = nmsChunkFuture.get(); // "Artificially" slow FAWE down if memory low as performing the
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {

Datei anzeigen

@ -138,7 +138,7 @@ public class Fawe {
} catch (Throwable ignored) { } catch (Throwable ignored) {
} }
}, 0); }, 0);
TaskManager.taskManager().repeatAsync(() -> MemUtil.checkAndSetApproachingLimit(), 1); TaskManager.taskManager().repeatAsync(MemUtil::checkAndSetApproachingLimit, 1);
TaskManager.taskManager().repeat(timer, 1); TaskManager.taskManager().repeat(timer, 1);
@ -418,16 +418,12 @@ public class Fawe {
final NotificationEmitter ne = (NotificationEmitter) memBean; final NotificationEmitter ne = (NotificationEmitter) memBean;
ne.addNotificationListener((notification, handback) -> { ne.addNotificationListener((notification, handback) -> {
LOGGER.info("Notification");
final long heapSize = Runtime.getRuntime().totalMemory(); final long heapSize = Runtime.getRuntime().totalMemory();
final long heapMaxSize = Runtime.getRuntime().maxMemory(); final long heapMaxSize = Runtime.getRuntime().maxMemory();
if (heapSize < heapMaxSize) { if (heapSize < heapMaxSize) {
return; return;
} }
LOGGER.info("NNNNNNNNNNNNNNNNNNNNNNNNNNNN"); LOGGER.warn("High memory usage detected, FAWE will attempt to slow operations to prevent a crash.");
LOGGER.info("NNNNNNNNNNNNNNNNNNNNNNNNNNNN");
LOGGER.info("NNNNNNNNNNNNNNNNNNNNNNNNNNNN");
LOGGER.info("JJJJJJJJJJJJJJJJJJJJJJJJJJJJ");
MemUtil.memoryLimitedTask(); MemUtil.memoryLimitedTask();
}, null, null); }, null, null);

Datei anzeigen

@ -57,6 +57,12 @@ public class Settings extends Config {
" - Disable with 100 or -1." " - Disable with 100 or -1."
}) })
public int MAX_MEMORY_PERCENT = 95; public int MAX_MEMORY_PERCENT = 95;
@Comment({
"When percent memory usage reaches this threshold some aspects of editing will be slowed down:",
" - FAWE-Asynchronous chunk loading when writing changes (see queue.async-chunk-load-write)"
})
public int SLOWER_MEMORY_PERCENT = 80;
@Create @Create
public ENABLED_COMPONENTS ENABLED_COMPONENTS; public ENABLED_COMPONENTS ENABLED_COMPONENTS;
@Create @Create
@ -599,6 +605,13 @@ public class Settings extends Config {
}) })
public boolean POOL = true; public boolean POOL = true;
@Comment({
"If chunk loading for writing edits to the world should be performed asynchronously to to FAWE",
" - Enable to improve performance at the expense of memory",
" - If experience out of memory crashed, disable this or reduce slower-memory-percent"
})
public boolean ASYNC_CHUNK_LOAD_WRITE = true;
public static class PROGRESS { public static class PROGRESS {
@Comment({"Display constant titles about the progress of a user's edit", @Comment({"Display constant titles about the progress of a user's edit",

Datei anzeigen

@ -1,6 +1,8 @@
package com.fastasyncworldedit.core.util; package com.fastasyncworldedit.core.util;
import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.configuration.Settings;
import com.sk89q.worldedit.internal.util.LogManagerCompat;
import org.apache.logging.log4j.Logger;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
@ -8,6 +10,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
public class MemUtil { public class MemUtil {
private static final Logger LOGGER = LogManagerCompat.getLogger();
private static final AtomicBoolean memory = new AtomicBoolean(false); private static final AtomicBoolean memory = new AtomicBoolean(false);
private static final AtomicBoolean slower = new AtomicBoolean(false); private static final AtomicBoolean slower = new AtomicBoolean(false);
@ -60,7 +63,8 @@ public class MemUtil {
final long heapFreeSize = Runtime.getRuntime().freeMemory(); final long heapFreeSize = Runtime.getRuntime().freeMemory();
final long heapMaxSize = Runtime.getRuntime().maxMemory(); final long heapMaxSize = Runtime.getRuntime().maxMemory();
final int size = (int) ((heapFreeSize * 100) / heapMaxSize); final int size = (int) ((heapFreeSize * 100) / heapMaxSize);
slower.set(size > 80); boolean limited = size >= Settings.settings().SLOWER_MEMORY_PERCENT;
slower.set(limited);
} }
private static final Queue<Runnable> memoryLimitedTasks = new ConcurrentLinkedQueue<>(); private static final Queue<Runnable> memoryLimitedTasks = new ConcurrentLinkedQueue<>();