Merge remote-tracking branch 'origin/1.20' into 1.21
This commit is contained in:
commit
168ab8effa
|
|
@ -19,6 +19,7 @@ import javax.annotation.processing.SupportedOptions;
|
|||
import javax.lang.model.SourceVersion;
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.lang.model.util.Elements;
|
||||
import javax.tools.Diagnostic;
|
||||
|
||||
import org.fury_phoenix.mixinAp.config.MixinConfig;
|
||||
|
|
@ -80,7 +81,7 @@ public class MixinProcessor extends AbstractProcessor {
|
|||
List<String> mixins =
|
||||
annotatedMixins.stream()
|
||||
.map(TypeElement.class::cast)
|
||||
.map(TypeElement::toString)
|
||||
.map(e -> processingEnv.getElementUtils().getBinaryName(e).toString())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
mixinConfigList.putIfAbsent(aliases.get(annotation.getSimpleName().toString()), mixins);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
package org.embeddedt.modernfix.common.mixin.feature.cause_lag_by_disabling_threads;
|
||||
|
||||
import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher;
|
||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Mixin(ChunkRenderDispatcher.class)
|
||||
@ClientOnlyMixin
|
||||
public class ChunkRenderDispatcherMixin {
|
||||
private static final Executor MFIX_CHUNK_BUILD_EXECUTOR = new ThreadPoolExecutor(1, computeNumThreads(), 0L, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
|
||||
|
||||
private static int computeNumThreads() {
|
||||
return Math.max(Math.min(Runtime.getRuntime().availableProcessors() / 4, 10), 1);
|
||||
}
|
||||
|
||||
@ModifyVariable(method = "<init>*", at = @At("HEAD"), ordinal = 0, argsOnly = true)
|
||||
private static Executor replaceExecutor(Executor old) {
|
||||
return MFIX_CHUNK_BUILD_EXECUTOR;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package org.embeddedt.modernfix.common.mixin.feature.cause_lag_by_disabling_threads;
|
||||
|
||||
import net.minecraft.Util;
|
||||
import org.embeddedt.modernfix.util.DirectExecutorService;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Mutable;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
@Mixin(Util.class)
|
||||
public class UtilMixin {
|
||||
@Shadow @Final @Mutable
|
||||
private static final ExecutorService BACKGROUND_EXECUTOR = new DirectExecutorService();
|
||||
}
|
||||
|
|
@ -1,12 +1,14 @@
|
|||
package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources;
|
||||
|
||||
import it.unimi.dsi.fastutil.objects.Reference2ReferenceLinkedOpenHashMap;
|
||||
import net.minecraft.client.renderer.block.BlockModelShaper;
|
||||
import net.minecraft.client.resources.model.BakedModel;
|
||||
import net.minecraft.client.resources.model.ModelManager;
|
||||
import net.minecraft.client.resources.model.ModelResourceLocation;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||
import org.embeddedt.modernfix.duck.IModelHoldingBlockState;
|
||||
import org.embeddedt.modernfix.dynamicresources.ModelLocationCache;
|
||||
import org.embeddedt.modernfix.util.DynamicOverridableMap;
|
||||
import org.spongepowered.asm.mixin.*;
|
||||
|
|
@ -24,13 +26,18 @@ public class BlockModelShaperMixin {
|
|||
@Shadow
|
||||
private Map<BlockState, BakedModel> modelByStateCache;
|
||||
|
||||
private ThreadLocal<Reference2ReferenceLinkedOpenHashMap<BlockState, BakedModel>> mfix$modelCache = ThreadLocal.withInitial(Reference2ReferenceLinkedOpenHashMap::new);
|
||||
|
||||
@Inject(method = { "<init>", "replaceCache" }, at = @At("RETURN"))
|
||||
private void replaceModelMap(CallbackInfo ci) {
|
||||
// replace the backing map for mods which will access it
|
||||
this.modelByStateCache = new DynamicOverridableMap<>(state -> modelManager.getModel(ModelLocationCache.get(state)));
|
||||
this.mfix$modelCache = ThreadLocal.withInitial(Reference2ReferenceLinkedOpenHashMap::new);
|
||||
// Clear the cached models on blockstate objects
|
||||
for(Block block : BuiltInRegistries.BLOCK) {
|
||||
for(BlockState state : block.getStateDefinition().getPossibleStates()) {
|
||||
if(state instanceof IModelHoldingBlockState modelHolder) {
|
||||
modelHolder.mfix$setModel(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private BakedModel cacheBlockModel(BlockState state) {
|
||||
|
|
@ -50,18 +57,18 @@ public class BlockModelShaperMixin {
|
|||
*/
|
||||
@Overwrite
|
||||
public BakedModel getBlockModel(BlockState state) {
|
||||
Reference2ReferenceLinkedOpenHashMap<BlockState, BakedModel> map = this.mfix$modelCache.get();
|
||||
BakedModel model = map.get(state);
|
||||
if(state instanceof IModelHoldingBlockState modelHolder) {
|
||||
BakedModel model = modelHolder.mfix$getModel();
|
||||
|
||||
if(model != null) {
|
||||
if(model != null) {
|
||||
return model;
|
||||
}
|
||||
|
||||
model = this.cacheBlockModel(state);
|
||||
modelHolder.mfix$setModel(model);
|
||||
return model;
|
||||
} else {
|
||||
return this.cacheBlockModel(state);
|
||||
}
|
||||
|
||||
model = this.cacheBlockModel(state);
|
||||
map.putAndMoveToFirst(state, model);
|
||||
if(map.size() > 500) {
|
||||
map.removeLast();
|
||||
}
|
||||
return model;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources;
|
||||
|
||||
import net.minecraft.client.resources.model.BakedModel;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||
import org.embeddedt.modernfix.duck.IModelHoldingBlockState;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
|
||||
import java.lang.ref.SoftReference;
|
||||
|
||||
@Mixin(BlockBehaviour.BlockStateBase.class)
|
||||
@ClientOnlyMixin
|
||||
public class BlockStateBaseMixin implements IModelHoldingBlockState {
|
||||
private volatile SoftReference<BakedModel> mfix$model;
|
||||
|
||||
@Override
|
||||
public BakedModel mfix$getModel() {
|
||||
var ref = mfix$model;
|
||||
return ref != null ? ref.get() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mfix$setModel(BakedModel model) {
|
||||
mfix$model = model != null ? new SoftReference<>(model) : null;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package org.embeddedt.modernfix.common.mixin.perf.worldgen_allocation;
|
||||
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.DensityFunction;
|
||||
import net.minecraft.world.level.levelgen.NoiseChunk;
|
||||
import net.minecraft.world.level.levelgen.material.MaterialRuleList;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(value = MaterialRuleList.class, priority = 100)
|
||||
public class MaterialRuleListMixin {
|
||||
@Shadow @Final private List<NoiseChunk.BlockStateFiller> materialRuleList;
|
||||
|
||||
/**
|
||||
* @author embeddedt
|
||||
* @reason Avoid iterator allocation
|
||||
*/
|
||||
@Overwrite
|
||||
@Nullable
|
||||
public BlockState calculate(DensityFunction.FunctionContext arg) {
|
||||
BlockState state = null;
|
||||
int s = this.materialRuleList.size();
|
||||
for(int i = 0; state == null && i < s; i++) {
|
||||
NoiseChunk.BlockStateFiller blockStateFiller = this.materialRuleList.get(i);
|
||||
state = blockStateFiller.calculate(arg);
|
||||
}
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package org.embeddedt.modernfix.common.mixin.perf.worldgen_allocation;
|
||||
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||
import net.minecraft.world.level.levelgen.DensityFunction;
|
||||
import net.minecraft.world.level.levelgen.NoiseChunk;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Mutable;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Mixin(value = NoiseChunk.class, priority = 100)
|
||||
public abstract class NoiseChunkMixin {
|
||||
@Shadow @Final @Mutable
|
||||
private Map<DensityFunction, DensityFunction> wrapped = new Object2ObjectOpenHashMap<>();
|
||||
|
||||
@Shadow protected abstract DensityFunction wrapNew(DensityFunction densityFunction);
|
||||
|
||||
/**
|
||||
* @author embeddedt
|
||||
* @reason Avoid lambda allocation
|
||||
*/
|
||||
@Overwrite
|
||||
protected DensityFunction wrap(DensityFunction unwrapped) {
|
||||
DensityFunction func = this.wrapped.get(unwrapped);
|
||||
if (func == null) {
|
||||
func = this.wrapNew(unwrapped);
|
||||
this.wrapped.put(unwrapped, func);
|
||||
}
|
||||
return func;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package org.embeddedt.modernfix.common.mixin.perf.worldgen_allocation;
|
||||
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.SurfaceRules;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(value = SurfaceRules.SequenceRule.class, priority = 100)
|
||||
public class SequenceRuleMixin {
|
||||
@Shadow @Final private List<SurfaceRules.SurfaceRule> rules;
|
||||
|
||||
/**
|
||||
* @author embeddedt
|
||||
* @reason Avoid iterator allocation
|
||||
*/
|
||||
@Overwrite
|
||||
public BlockState tryApply(int x, int y, int z) {
|
||||
int s = this.rules.size();
|
||||
//noinspection ForLoopReplaceableByForEach
|
||||
for(int i = 0; i < s; i++) {
|
||||
BlockState state = this.rules.get(i).tryApply(x, y, z);
|
||||
if(state != null) {
|
||||
return state;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
package org.embeddedt.modernfix.common.mixin.perf.worldgen_allocation;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.world.level.biome.Biome;
|
||||
import org.embeddedt.modernfix.world.gen.PositionalBiomeGetter;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@Mixin(targets = {"net/minecraft/world/level/levelgen/SurfaceRules$Context"}, priority = 100)
|
||||
public class SurfaceRulesContextMixin {
|
||||
@Shadow private long lastUpdateY;
|
||||
|
||||
@Shadow private int blockY;
|
||||
|
||||
@Shadow private int waterHeight;
|
||||
|
||||
@Shadow private int stoneDepthBelow;
|
||||
|
||||
@Shadow private int stoneDepthAbove;
|
||||
|
||||
@Shadow private Supplier<Holder<Biome>> biome;
|
||||
|
||||
@Shadow @Final private Function<BlockPos, Holder<Biome>> biomeGetter;
|
||||
|
||||
@Shadow @Final private BlockPos.MutableBlockPos pos;
|
||||
|
||||
/**
|
||||
* @author embeddedt
|
||||
* @reason Reuse supplier object instead of creating new ones every time
|
||||
*/
|
||||
@Overwrite
|
||||
protected void updateY(int stoneDepthAbove, int stoneDepthBelow, int waterHeight, int blockX, int blockY, int blockZ) {
|
||||
++this.lastUpdateY;
|
||||
var getter = this.biome;
|
||||
if(getter == null) {
|
||||
this.biome = getter = new PositionalBiomeGetter(this.biomeGetter, this.pos);
|
||||
}
|
||||
((PositionalBiomeGetter)getter).update(blockX, blockY, blockZ);
|
||||
this.blockY = blockY;
|
||||
this.waterHeight = waterHeight;
|
||||
this.stoneDepthBelow = stoneDepthBelow;
|
||||
this.stoneDepthAbove = stoneDepthAbove;
|
||||
}
|
||||
}
|
||||
|
|
@ -139,7 +139,7 @@ public class ModernFixEarlyConfig {
|
|||
mixinOptions.add(mixinCategoryName);
|
||||
}
|
||||
} catch(IOException e) {
|
||||
ModernFix.LOGGER.error("Error scanning file " + mixinPath, e);
|
||||
LOGGER.error("Error scanning file " + mixinPath, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -166,6 +166,7 @@ public class ModernFixEarlyConfig {
|
|||
.put("mixin.feature.stalled_chunk_load_detection", false)
|
||||
.put("mixin.perf.blast_search_trees.force", false)
|
||||
.put("mixin.bugfix.restore_old_dragon_movement", false)
|
||||
.put("mixin.feature.cause_lag_by_disabling_threads", false)
|
||||
.put("mixin.perf.clear_mixin_classinfo", false)
|
||||
.put("mixin.perf.deduplicate_climate_parameters", false)
|
||||
.put("mixin.bugfix.packet_leak", false)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
package org.embeddedt.modernfix.duck;
|
||||
|
||||
import net.minecraft.client.resources.model.BakedModel;
|
||||
|
||||
public interface IModelHoldingBlockState {
|
||||
BakedModel mfix$getModel();
|
||||
void mfix$setModel(BakedModel model);
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
package org.embeddedt.modernfix.util;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.AbstractExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class DirectExecutorService extends AbstractExecutorService {
|
||||
private boolean isShutdown;
|
||||
|
||||
@Override
|
||||
public void shutdown() {
|
||||
isShutdown = true;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public List<Runnable> shutdownNow() {
|
||||
isShutdown = true;
|
||||
return List.of();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShutdown() {
|
||||
return isShutdown;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTerminated() {
|
||||
return isShutdown;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean awaitTermination(long timeout, @NotNull TimeUnit unit) throws InterruptedException {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(@NotNull Runnable command) {
|
||||
command.run();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
package org.embeddedt.modernfix.world.gen;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.world.level.biome.Biome;
|
||||
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class PositionalBiomeGetter implements Supplier<Holder<Biome>> {
|
||||
private final Function<BlockPos, Holder<Biome>> biomeGetter;
|
||||
private final BlockPos.MutableBlockPos pos;
|
||||
private int nextX, nextY, nextZ;
|
||||
private volatile Holder<Biome> curBiome;
|
||||
|
||||
public PositionalBiomeGetter(Function<BlockPos, Holder<Biome>> biomeGetter, BlockPos.MutableBlockPos pos) {
|
||||
this.biomeGetter = biomeGetter;
|
||||
this.pos = pos;
|
||||
}
|
||||
|
||||
public void update(int nextX, int nextY, int nextZ) {
|
||||
this.nextX = nextX;
|
||||
this.nextY = nextY;
|
||||
this.nextZ = nextZ;
|
||||
this.curBiome = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Holder<Biome> get() {
|
||||
var biome = curBiome;
|
||||
if(biome == null) {
|
||||
curBiome = biome = biomeGetter.apply(pos.set(nextX, nextY, nextZ));
|
||||
}
|
||||
return biome;
|
||||
}
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
"modernfix.connectedness_dynresoruces": "Connectedness 和 ModernFix 的動態資源選項不相容。請移除 Connectedness 或在 ModernFix 設定中停用動態資源。",
|
||||
"modernfix.perf_mod_warning": "建議安裝這些模組,但警告可以在 ModernFix 設定中停用。",
|
||||
"modernfix.config": "ModernFix 混合設定",
|
||||
"modernfix.config.done_restart": "完成(需要重新啟動)",
|
||||
"modernfix.config.done_restart": "完成(需要重新啟動)",
|
||||
"modernfix.config.wiki": "開啟 Wiki",
|
||||
"modernfix.message.reload_config": "偵測到模組設定檔變更。為了防止載入尚未儲存的檔案,重新載入必須通過執行 /mfrc 指令來觸發。",
|
||||
"modernfix.option.on": "開啟",
|
||||
|
|
@ -15,9 +15,9 @@
|
|||
"modernfix.option.disabled": "已停用",
|
||||
"modernfix.option.enabled": "已啟用",
|
||||
"modernfix.option.mod_override": ",原因是裝了這些模組:[%s]",
|
||||
"modernfix.config.not_default": "(已修改)",
|
||||
"asynclocator.map.locating": "地圖(定位中...)",
|
||||
"asynclocator.map.none": "地圖(在附近找不到相關地物)",
|
||||
"modernfix.config.not_default": "(已修改)",
|
||||
"asynclocator.map.locating": "地圖(定位中...)",
|
||||
"asynclocator.map.none": "地圖(在附近找不到相關地物)",
|
||||
"modernfix.option.category.performance": "效能",
|
||||
"modernfix.option.category.performance.description": "有助於提升遊戲內效能或啟動速度的功能",
|
||||
"modernfix.option.category.bugfixes": "錯誤修復",
|
||||
|
|
@ -30,14 +30,14 @@
|
|||
"modernfix.option.mixin.perf.async_jei": "僅限 1.16。**一項關鍵最佳化。**修改 JEI 以在背景執行緒上執行其重新載入,完全消除它對世界載入所增加的長時間等待時間。",
|
||||
"modernfix.option.mixin.perf.async_locator": "僅限 1.16。將 Async Locator 模組的補丁倒退,以消除與 `/locate`、戰利品表生成等相關的伺服器凍結。",
|
||||
"modernfix.option.mixin.perf.biome_zoomer": "僅限 1.16。微小的最佳化,使用 1.18 的邏輯來提升生態區縮放器的效能。",
|
||||
"modernfix.option.mixin.perf.blast_search_trees": "所有版本。如果安裝了 REI 或 JEI,則停用用於創造性搜尋的原生搜尋樹的構建,而改為使用這些模組的搜尋實現。這在世界載入期間節省幾秒,可能還減少一些記憶體使用量(雖然我沒有測試)。",
|
||||
"modernfix.option.mixin.perf.blast_search_trees": "所有版本。如果安裝了 REI 或 JEI,則停用用於創造性搜尋的原生搜尋樹的構建,而改為使用這些模組的搜尋實現。這在世界載入期間節省幾秒,可能還減少一些記憶體使用量(雖然我沒有測試)。",
|
||||
"modernfix.option.mixin.perf.boost_worker_count": "僅限 1.16。移除對工作執行緒數量的硬上限,與 Mojang 在 1.18 中所做的相似。",
|
||||
"modernfix.option.mixin.perf.cache_blockstate_cache_arrays": "所有版本。在每次初始化區塊狀態快取時避免建立新的列舉數組副本。這是一項微小的最佳化,但易於實現。",
|
||||
"modernfix.option.mixin.perf.cache_model_materials": "所有版本。對 `RenderMaterial`(紋理)集合和模型返回的相依清單進行記錄,而不是需要在每次請求時重新計算它們。有助於加速模型載入和烘焙過程。",
|
||||
"modernfix.option.mixin.perf.cache_model_materials": "所有版本。對 `RenderMaterial`(紋理)集合和模型返回的相依清單進行記錄,而不是需要在每次請求時重新計算它們。有助於加速模型載入和烘焙過程。",
|
||||
"modernfix.option.mixin.perf.cache_strongholds": "所有版本。將生成的堡壘位置清單與世界一同儲存,而不是在每次世界載入時重新生成。在 1.16 上節省了一點時間,在 1.18 和 1.19 上節省了更多時間。",
|
||||
"modernfix.option.mixin.perf.cache_upgraded_structures": "所有版本。許多模組發布過時的結構檔案,需要遊戲每次載入時使用 DFU 進行升級。這可能會相當慢。此補丁增加了邏輯,以儲存結構的升級版本,並在下一次載入時重複使用它。為處理模組變更結構檔案但未變更名稱的情況,將原始檔案的雜湊值與快取版本進行比較,如果它們不匹配,則結構將被再次升級。",
|
||||
"modernfix.option.mixin.perf.compress_biome_container": "僅限 1.16。從 Hydrogen 借來的微小最佳化,試圖在可能的情況下節省生態區容器的空間。如果安裝了與之衝突的模組,如 BetterEnd 或 Chocolate,則會自動停用此功能。",
|
||||
"modernfix.option.mixin.perf.datapack_reload_exceptions": "所有版本。透過不輸出資料包重新載入期間(如戰利品表、配方中缺少物品)某些常見拋出例外的堆疊追蹤,減少記錄檔洗版,可能稍微提高載入速度。仍然會輸出相同訊息。",
|
||||
"modernfix.option.mixin.perf.datapack_reload_exceptions": "所有版本。透過不輸出資料包重新載入期間(如戰利品表、配方中缺少物品)某些常見拋出例外的堆疊追蹤,減少記錄檔洗版,可能稍微提高載入速度。仍然會輸出相同訊息。",
|
||||
"modernfix.option.mixin.perf.dedicated_reload_executor": "所有版本。將資源包和資料包的重新載入移到專用的工作池,而不是使用預設的 `Worker-Main` 執行緒。這允許模組在執行時仍然有可能改善單人遊戲的效能,同時不會因為有限的執行緒數量而減慢啟動速度。",
|
||||
"modernfix.option.mixin.perf.deduplicate_location": "所有版本,但預設停用以避免載入時間的影響。去除資源位置的命名空間和路徑的重複。這節省了記憶體,但也使構建新的 `ResourceLocation` 的成本增加了相當多。",
|
||||
"modernfix.option.mixin.perf.dynamic_dfu": "所有版本。修改 DFU 初始化,使其在首次需要進行升級時發生。這聽起來類似於 LazyDFU,但實際上是不同實現,因為它避免載入 *任何* DFU 類、資料結構,而 LazyDFU 僅停用規則最佳化。基本上,此選項是 DataFixerSlayer 的更安全版本,因為它在需要時仍會載入 DFU。\n\n一般情況下,即使啟用此選項,您仍應繼續使用 LazyDFU,因為否則 DFU 規則最佳化將導致卡頓。",
|
||||
|
|
@ -46,26 +46,26 @@
|
|||
"modernfix.option.mixin.perf.dynamic_structure_manager": "所有版本。允許遊戲在生成結構檔案後卸載它們,而不是永久保持它們載入。",
|
||||
"modernfix.option.mixin.perf.fast_registry_validation": "所有版本。Forge 在每次驗證註冊表時無謂地通過反射尋找一個方法。這個補丁簡單地快取了方法的返回值,因為它每次都是相同的。",
|
||||
"modernfix.option.mixin.perf.faster_font_loading": "所有版本。最佳化字型渲染器以更快地載入字型,加速資源重新載入速度。",
|
||||
"modernfix.option.mixin.perf.faster_item_rendering": "所有版本。避免在介面中繪製物品的側面。(是的,看起來原版似乎這樣做。)\n\n如果安裝了像 REI 或 JEI 這樣的模組且可見的物品足夠多,這可能會使低階顯示卡上的 FPS 提高三倍。預設停用,因為這是新功能且測試不多,但應該是安全的。最有可能的問題是物品在介面中完全看不見,或在世界中顯示為平面。",
|
||||
"modernfix.option.mixin.perf.faster_texture_loading": "所有 1.19.4 之前的版本。避免兩次讀取紋理(第一次使用非常緩慢的代碼路徑),而是進行一次更快速的載入(類似於 1.19.3 以上)。",
|
||||
"modernfix.option.mixin.perf.faster_item_rendering": "所有版本。避免在介面中繪製物品的側面。(是的,看起來原版似乎這樣做。)\n\n如果安裝了像 REI 或 JEI 這樣的模組且可見的物品足夠多,這可能會使低階顯示卡上的 FPS 提高三倍。預設停用,因為這是新功能且測試不多,但應該是安全的。最有可能的問題是物品在介面中完全看不見,或在世界中顯示為平面。",
|
||||
"modernfix.option.mixin.perf.faster_texture_loading": "所有 1.19.4 之前的版本。避免兩次讀取紋理(第一次使用非常緩慢的代碼路徑),而是進行一次更快速的載入(類似於 1.19.3 以上)。",
|
||||
"modernfix.option.mixin.perf.faster_texture_stitching": "所有版本。啟用遊戲使用由 SuperCoder79 為 1.7.10 上的 lwjgl3ify 原創的更快速的紋理拼接系統,可以在載入期間節省一些時間。極少數報告說這可能導致方塊或介面上出現奇怪的異常,這可能是 Sodium 的問題。",
|
||||
"modernfix.option.mixin.perf.jeresources_startup": "僅限 1.16。最佳化 Just Enough Resources,避免不必要地為相同職業多次重新建立村民實體,在 JEI 啟動期間節省時間。",
|
||||
"modernfix.option.mixin.perf.kubejs": "僅限 1.16。最佳化 KubeJS,避免不必要的 `ItemStack` 複製等,從而減少載入資料包所需的時間。",
|
||||
"modernfix.option.mixin.perf.model_optimizations": "所有版本。實施最佳化以加速模型載入過程。",
|
||||
"modernfix.option.mixin.perf.nbt_memory_usage": "所有版本。對於複合 NBT 標籤,使用一個更有效的背景地圖,去重鍵名,同時對於非常小的複合體使用陣列地圖。這減少了在記憶體中儲存許多複合標籤的開銷。",
|
||||
"modernfix.option.mixin.perf.nuke_empty_chunk_sections": "僅限 1.16,受 Hydrogen 啟發。避免在記憶體中儲存充滿空氣的區塊部分,而是將它們標記為空的。",
|
||||
"modernfix.option.mixin.perf.reduce_blockstate_cache_rebuilds": "所有版本。**一項關鍵最佳化。**較新的 Minecraft 版本(1.12 之後)實現了一個塊狀態快取系統,用於快取有關塊狀態的經常使用的資訊,例如它是否為實體,其碰撞形狀等。在原版中,重建此快取相當迅速(僅需一兩秒),但在安裝了許多模組的情況下,由於遊戲中存在許多塊狀態,所有這些塊狀態都必須重新構建其快取,這會變得相當慢。\n\n由於 Forge 會在幾乎可以確定在下一次重建之前不會使用資料的許多點上重建快取,這一問題在 Forge 上變得更為嚴重。這些點的示例包括在達到標題畫面之前(在「凍結資料」階段)以及在載入世界時(多次!)。\n\nModernFix 通過改為使快取重建變為惰性,解決了這個效能瓶頸。每個塊狀態在首次訪問資料時重建其快取。在任何時候當原版或 Forge 試圖為所有塊狀態重建快取時,這將被重新導向到僅使每個塊狀態上的快取失效。\n\n這應該不會在啟動後對 TPS 產生任何影響。",
|
||||
"modernfix.option.mixin.perf.reduce_blockstate_cache_rebuilds": "所有版本。**一項關鍵最佳化。**較新的 Minecraft 版本 (1.12 之後)實現了一個塊狀態快取系統,用於快取有關塊狀態的經常使用的資訊,例如它是否為實體,其碰撞形狀等。在原版中,重建此快取相當迅速(僅需一兩秒),但在安裝了許多模組的情況下,由於遊戲中存在許多塊狀態,所有這些塊狀態都必須重新構建其快取,這會變得相當慢。\n\n由於 Forge 會在幾乎可以確定在下一次重建之前不會使用資料的許多點上重建快取,這一問題在 Forge 上變得更為嚴重。這些點的示例包括在達到標題畫面之前(在「凍結資料」階段)以及在載入世界時(多次!)。\n\nModernFix 通過改為使快取重建變為惰性,解決了這個效能瓶頸。每個塊狀態在首次訪問資料時重建其快取。在任何時候當原版或 Forge 試圖為所有塊狀態重建快取時,這將被重新導向到僅使每個塊狀態上的快取失效。\n\n這應該不會在啟動後對 TPS 產生任何影響。",
|
||||
"modernfix.option.mixin.perf.remove_biome_temperature_cache": "所有版本。刪除生態域溫度快取,就像現代版本的 Lithium 一樣。",
|
||||
"modernfix.option.mixin.perf.resourcepacks": "所有版本。**一項關鍵最佳化。**在現代版本上啟動受到檔案系統訪問的極大制約。經常向資源包發送許多請求,以列舉資源或檢查給定資源是否存在,每一次都導致非常緩慢的檔案 API 調用。\n\nModernFix 完全消除了這裡的大部分制約,僅通過簡單地快取所有存在於模組提供和原版資源包中的資源的清單來實現。快取在資源重新載入時重新構建(除了原版資源,因為它們在遊戲執行時應該永遠不會改變)。\n\n對於這個補丁,目前沒有已知的相容性問題,除了 OptiFine(其 CTM 資源無法正確載入)。然而,我不建議在任何情況下使用 OptiFine,因為它本身會使啟動時間增加數分鐘,並且完全沒有與 ModernFix 測試過。",
|
||||
"modernfix.option.mixin.perf.reuse_datapacks": "僅限 1.16。嘗試通過在可能的情況下跳過資料包重新載入來加速在單人世界之間切換。可能會導致與某些模組的相容性問題,但目前預設啟用。",
|
||||
"modernfix.option.mixin.perf.resourcepacks": "所有版本。**一項關鍵最佳化。**在現代版本上啟動受到檔案系統訪問的極大制約。經常向資源包發送許多請求,以列舉資源或檢查給定資源是否存在,每一次都導致非常緩慢的檔案 API 調用。\n\nModernFix 完全消除了這裡的大部分制約,僅通過簡單地快取所有存在於模組提供和原版資源包中的資源的清單來實現。快取在資源重新載入時重新構建(除了原版資源,因為它們在遊戲執行時應該永遠不會改變)。\n\n對於這個補丁,目前沒有已知的相容性問題,除了 OptiFine(其 CTM 資源無法正確載入)。然而,我不建議在任何情況下使用 OptiFine,因為它本身會使啟動時間增加數分鐘,並且完全沒有與 ModernFix 測試過。",
|
||||
"modernfix.option.mixin.perf.reuse_datapacks": "僅限 1.16。嘗試通過在可能的情況下跳過資料包重新載入來加速在單人世界之間切換。可能會導致與某些模組的相容性問題,但目前預設啟用。",
|
||||
"modernfix.option.mixin.perf.rewrite_registry": "所有版本。**目前處於半殘狀態。**積極替換 Forge 註冊系統的一些內部部分為更快速的版本,但預設下在載入某些模組包時會導致凍結。預設停用,理由很明顯。",
|
||||
"modernfix.option.mixin.perf.skip_first_datapack_reload": "僅限 1.16 和 1.19。**一項關鍵最佳化。**\n\n在 1.16 開發週期的中間,Forge 對遊戲進行了補丁,以在載入現有世界時重新載入資料包兩次,以解決生態 ID 位移的問題。不幸的是,資料包重新載入通常需要超過 30 秒,因此這極大地影響了世界載入時間。\n\nModernFix 進行了必要的變更,以避免這種重新載入,基於未完成的 Forge PR #8163。\n\n這一變更在 1.18 中被 Forge 刪除,但在 1.19 中又增加了 *相似的* 補丁,以解決在建立新的單人世界時未載入模組資料包的問題。幸運的是,在 1.19 中,這個問題僅局限於建立世界的畫面,現有的世界只需要再重新載入。但是,這仍然會在 1.19 中點擊「建立新世界」時使卡頓時間加倍,因此 ModernFix 再次進行了變更,以避免執行多餘的重新載入。",
|
||||
"modernfix.option.mixin.perf.state_definition_construct": "所有版本。僅在安裝 FerriteCore 時啟用。利用 FerriteCore 對方塊狀態的處理,加快其建立速度。這有助於加速安裝了許多方塊狀態的模組(如家具模組)的啟動。",
|
||||
"modernfix.option.mixin.perf.state_definition_construct": "所有版本。僅在安裝 FerriteCore 時啟用。利用 FerriteCore 對方塊狀態的處理,加快其建立速度。這有助於加速安裝了許多方塊狀態的模組(如家具模組)的啟動。",
|
||||
"modernfix.option.mixin.perf.sync_executor_sleep": "所有版本。避免主執行緒在等待模組載入工作完成時閒置旋轉,消耗一個 CPU 核心的計算資源。",
|
||||
"modernfix.option.mixin.perf.thread_priorities": "所有版本。調整工作執行緒和伺服器執行緒的優先順序,使其低於用戶端執行緒。這有助於提高在 CPU 核心較少的機器上的 FPS 穩定性,前提是使用的 Java 實現支持優先順序。",
|
||||
"modernfix.option.mixin.perf.use_integrated_resources": "主要針對 1.16。對 JEResources 進行補丁,以在單人遊戲時使用集成伺服器的戰利品表資料,而不是無謂地重新載入戰利品表。在 JEI 啟動期間再節省幾秒。",
|
||||
"modernfix.option.mixin.bugfix.concurrency": "此補丁修復了 Minecraft 和(或)Forge 內的與並發相關的問題。大多數都導致在載入過程中出現罕見且難以診斷的崩潰。",
|
||||
"modernfix.option.mixin.bugfix.edge_chunk_not_saved": "此選項是 SuperCoder 的 Chunk Saving Fix 模組的移植(因為當時我不知道 Forge 已經有這個模組)。",
|
||||
"modernfix.option.mixin.bugfix.concurrency": "此補丁修復了 Minecraft 和 (或) Forge 內的與並發相關的問題。大多數都導致在載入過程中出現罕見且難以診斷的崩潰。",
|
||||
"modernfix.option.mixin.bugfix.edge_chunk_not_saved": "此選項是 SuperCoder 的 Chunk Saving Fix 模組的移植(因為當時我不知道 Forge 已經有這個模組)。",
|
||||
"modernfix.option.mixin.bugfix.mc218112": "此選項修復了在處理實體資料時發生的當一個異常抛出時可能發生的死鎖。原版在應該解鎖資料管理員時並未正確解鎖。這在錯誤追蹤器上被追蹤為 MC-218112,並且在 1.17 中由 Mojang 修復。",
|
||||
"modernfix.option.mixin.bugfix.packet_leak": "**實驗性**,預設未啟用。嘗試修復在 1.16 上遊玩足夠長時間後發生的記憶體流失問題。",
|
||||
"modernfix.option.mixin.bugfix.paper_chunk_patches": "1.18 及更新版本。**一項關鍵最佳化。**匯入來自 Paper 的修補程式,解決 1.17 版中區塊載入需要龐大記憶體並生成大量 `CompletableFuture` 實例的問題。現在 1.18+ 能夠像 1.16 一樣在僅使用 400MB 記憶體的情況下載入世界。",
|
||||
|
|
@ -74,7 +74,7 @@
|
|||
"modernfix.option.mixin.feature.direct_stack_trace": "通常為關閉狀態,可以啟用以強制在崩潰時將原始堆疊追蹤輸出到記錄檔中。偶爾,Minecraft 的崩潰報告系統無法正常運作,並提供完全無關的堆疊追蹤或報告。",
|
||||
"modernfix.option.mixin.feature.measure_time": "使用幾個注入來測量世界載入時間、資料包重新載入時間、資源重新載入時間、啟動時間,並新增必要的鉤子以在所設定時啟用 Minecraft 未使用的資源重新載入的分析邏輯。",
|
||||
"modernfix.option.mixin.feature.spam_thread_dump": "**僅供除錯使用。**每 60 秒將一個執行緒轉儲輸出到記錄檔中。這有助於診斷載入、遊戲過程中的無法解釋的凍結。",
|
||||
"modernfix.option.mixin.bugfix.chunk_deadlock": "嘗試防止區塊系統死鎖,或在它們發生時在記錄檔中提供額外的除錯資訊。這些死鎖通常表現為伺服器無限凍結(如實體不移動),而用戶端繼續正常運作。",
|
||||
"modernfix.option.mixin.bugfix.chunk_deadlock": "嘗試防止區塊系統死鎖,或在它們發生時在記錄檔中提供額外的除錯資訊。這些死鎖通常表現為伺服器無限凍結(如實體不移動),而用戶端繼續正常運作。",
|
||||
"modernfix.option.mixin.bugfix.chunk_deadlock.valhesia": "修補了 Valhesia Structures 的程式碼,解決其導致頻繁的世界生成、區塊載入死鎖的問題。",
|
||||
"modernfix.option.mixin.bugfix.cofh_core_crash": "修復了 CoFH Core 中的一個多執行緒問題,可能在啟動時導致罕見的崩潰。",
|
||||
"modernfix.option.mixin.bugfix.ctm_resourceutil_cme": "修復了 ConnectedTexturesMod 中的一個多執行緒問題,可能在啟動時導致罕見的崩潰。",
|
||||
|
|
@ -87,13 +87,13 @@
|
|||
"modernfix.option.mixin.bugfix.remove_block_chunkloading": "修復了 Forge 上的殭屍豬人永久保持 0, 0 區塊載入的問題。是 Forge PR #8583 的回溯版本。",
|
||||
"modernfix.option.mixin.bugfix.starlight_emptiness": "修復了由於未初始化空白地圖而導致的偶爾 Starlight 崩潰。是 Starlight for 1.18.x 中相同修復的回溯版本。",
|
||||
"modernfix.option.mixin.core": "ModernFix 正常運作所需的核心修補程式",
|
||||
"modernfix.option.mixin.devenv": "在開發環境中執行時使用的修補程式,用於提高速度和(或)測試",
|
||||
"modernfix.option.mixin.devenv": "在開發環境中執行時使用的修補程式,用於提高速度和(或)測試",
|
||||
"modernfix.option.mixin.safety": "防止在啟動過程中崩潰的並行修補程式",
|
||||
"modernfix.option.mixin.feature.integrated_server_watchdog": "將原版的看門狗增加到單人世界中,但僅輸出堆棧追蹤,而不是強制中止世界。此版本包含 Fullstack Watchdog 的功能,但後者在多人遊戲中仍然需要。",
|
||||
"modernfix.option.mixin.feature.snapshot_easter_egg": "在快照版本執行時增加復活節彩蛋功能(不影響任何原版的視覺效果或行為)。",
|
||||
"modernfix.option.mixin.feature.snapshot_easter_egg": "在快照版本執行時增加復活節彩蛋功能(不影響任何原版的視覺效果或行為)。",
|
||||
"modernfix.option.mixin.feature.spark_profile_launch": "如果啟用,並安裝了相容版本的 Spark,整個啟動過程將被概述,直到標題畫面。",
|
||||
"modernfix.option.mixin.feature.warn_missing_perf_mods": "在啟動時如果缺少其他被認為是基本且高度相容的效能模組,則顯示警告",
|
||||
"modernfix.option.mixin.launch.class_search_cache": "使用一個更快的版本替換 Forge 的資源尋找器(用於尋找遊戲和模組代碼),加快啟動速度。",
|
||||
"modernfix.option.mixin.launch.class_search_cache": "使用一個更快的版本替換 Forge 的資源尋找器(用於尋找遊戲和模組代碼),加快啟動速度。",
|
||||
"modernfix.option.mixin.perf.clear_fabric_mapping_tables": "通過清理 Fabric Loader 中多餘或很少被模組使用的映射資料結構,減少記憶體使用。出於相容性原因,預設情況下不啟用。",
|
||||
"modernfix.option.mixin.perf.clear_mixin_classinfo": "在啟動完成後強制載入所有 mixin,然後清除 mixin 資料結構以消除大部分 Mixin 的記憶體使用。出於相容性原因,預設情況下不啟用。",
|
||||
"modernfix.option.mixin.perf.deduplicate_wall_shapes": "使大多數牆塊共享相同的形狀對象,而不是每個牆塊都有自己的副本。在模組增加了大量牆塊時,可以大幅減少記憶體使用。",
|
||||
|
|
@ -109,7 +109,7 @@
|
|||
"modernfix.option.mixin.perf.use_integrated_resources.jeresources": "",
|
||||
"modernfix.option.mixin.bugfix.blueprint_modif_memory_leak": "修復了 Blueprint 的 ObjectModificationManager 洩漏原版資源的問題,減少記憶體使用。儘管該修復是在 PR #195 中貢獻的,但尚未進行發布。",
|
||||
"modernfix.option.mixin.bugfix.removed_dimensions": "修復了如果刪除了維度模組,遊戲將無法載入世界的問題。是 Forge PR #8959 的回溯版本。",
|
||||
"modernfix.option.mixin.perf.compact_bit_storage": "修復了一些舊版伺服器(如 Hypixel)將空區塊發送為包含方塊的區塊而引起的記憶體浪費。在這些伺服器上顯著減少記憶體使用。",
|
||||
"modernfix.option.mixin.perf.compact_bit_storage": "修復了一些舊版伺服器(如 Hypixel) 將空區塊發送為包含方塊的區塊而引起的記憶體浪費。在這些伺服器上顯著減少記憶體使用。",
|
||||
"modernfix.option.mixin.perf.deduplicate_climate_parameters": "去重新的生態系統使用的氣候參數對象,可以節省約 2MB,但也會在資料包重新載入時略微降低速度。",
|
||||
"modernfix.option.mixin.perf.dynamic_entity_renderers": "在首次看到實體時構建實體模型,而不是在啟動時。某些模組與此選項不相容,將導致 EntityRenderer 崩潰。",
|
||||
"modernfix.option.mixin.perf.twilightforest.structure_spawn_fix": "修復了由於 Twilight Forest 世界生成非常低效地檢查結構而引起的卡頓。",
|
||||
|
|
@ -117,8 +117,21 @@
|
|||
"modernfix.option.mixin.perf.tag_id_caching": "通過快取位置對象而不是每次重新建立時加快標籤條目的使用。",
|
||||
"modernfix.option.mixin.feature.disable_unihex_font": "刪除 Unicode 字型,節省 10MB 但導致特殊字元不再繪製。",
|
||||
"modernfix.option.mixin.bugfix.world_leaks": "減少不需要在切換維度後的舊用戶端世界的記憶體使用。這些通常在原版中進行垃圾回收,但模組有時會保留對它們的引用。",
|
||||
"modernfix.option.mixin.perf.compact_mojang_registries": "(Fabric)實驗性選項,將註冊表的記憶體使用減少約 50%。在大多數模組包中,除非它們包含數百萬個方塊和物品,否則沒用。",
|
||||
"modernfix.option.mixin.perf.dynamic_block_codecs": "避免為每個方塊(狀態)儲存編解碼器,而是在需要時動態生成並快取它。通常情況下,除非有數百萬個方塊、物品,否則不值得啟用。",
|
||||
"modernfix.option.mixin.perf.compact_mojang_registries": "(Fabric)實驗性選項,將註冊表的記憶體使用減少約 50%。在大多數模組包中,除非它們包含數百萬個方塊和物品,否則沒用。",
|
||||
"modernfix.option.mixin.perf.dynamic_block_codecs": "避免為每個方塊(狀態)儲存編解碼器,而是在需要時動態生成並快取它。通常情況下,除非有數百萬個方塊、物品,否則不值得啟用。",
|
||||
"modernfix.option.mixin.perf.faster_command_suggestions": "在輸入指令時有數十萬個建議時降低等待時間。",
|
||||
"modernfix.option.mixin.perf.mojang_registry_size": "修復了導致方塊、物品的註冊數量與已註冊數量成比例地減慢的問題。這提高了啟動時間。"
|
||||
"modernfix.option.mixin.perf.mojang_registry_size": "修復了導致方塊、物品的註冊數量與已註冊數量成比例地減慢的問題。這提高了啟動時間。",
|
||||
"modernfix.option.mixin.perf.cache_profile_texture_url": "避免無意義地建立 URL 對象,加快頭顱的渲染速度。",
|
||||
"modernfix.option.mixin.bugfix.entity_pose_stack": "修復了 Forge #9118,在該問題中,模組可透過推送矩陣堆棧而不彈出堆棧,導致無法卸載的渲染崩潰。",
|
||||
"modernfix.option.mixin.bugfix.file_dialog_title": "修復了世界生成設置文件對話框的安全問題",
|
||||
"modernfix.option.mixin.bugfix.forge_vehicle_packets": "修復了由 Forge 補丁引入的一個錯誤,該錯誤會在玩家駕駛交通工具行駛在區塊邊界上時向其發送過量的大塊封包。",
|
||||
"modernfix.option.mixin.bugfix.mantle_model_cme": "修復了 Mantle 中的一個錯誤,該錯誤在渲染 Tinkers Construct 內容時可導致隨機 ConcurrentModificationException 崩潰。",
|
||||
"modernfix.option.mixin.bugfix.model_data_manager_cme": "解決了 Forge ModelDataManager 系統中可能導致意外並發問題的設計缺陷。",
|
||||
"modernfix.option.mixin.bugfix.recipe_book_type_desync": "修復了 如果模組新增自訂合成配方條目類型,Forge 用戶端在連接到普通伺服器時會中斷連線的問題。",
|
||||
"modernfix.option.mixin.bugfix.unsafe_modded_shape_caches": "修復了內容模式中計算方塊形狀時可能出現的各種 ConcurrentModificationException 異常",
|
||||
"modernfix.option.mixin.feature.stalled_chunk_load_detection": "該選項可能有助於檢測區塊載入凍結的原因。不過,啟用該選項可能會導致效能略微下降。",
|
||||
"modernfix.option.mixin.perf.fix_loop_spin_waiting": "修復了 Minecraft 內建等待功能占用過多 CPU 資源的問題。",
|
||||
"modernfix.option.mixin.perf.forge_cap_retrieval": "小幅微最佳化,使 Forge 上檢索自訂實體數據的效率略有提高。",
|
||||
"modernfix.option.mixin.perf.forge_registry_lambda": "修正了 Forge 中導致熱註冊表方法分配過多的疏忽。",
|
||||
"modernfix.option.mixin.bugfix.restore_old_dragon_movement": "修復了 MC-272431,該修復了終界龍無法像 1.13 及更早版本那樣降落到傳送門上的問題。這導致終界龍的飛行方式與現代玩家習慣的飛行方式大相徑庭,同時也修正了單循環功能,因此默認情況下不會啟用該功能。感謝 Jukitsu 發現了原版代碼中的回歸。"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,18 @@ accessible field net/minecraft/world/level/Level blockEntityTickers Ljava/util/L
|
|||
accessible class net/minecraft/client/renderer/RenderType$CompositeRenderType
|
||||
accessible method net/minecraft/nbt/CompoundTag <init> (Ljava/util/Map;)V
|
||||
|
||||
accessible class net/minecraft/world/level/levelgen/SurfaceRules$SequenceRule
|
||||
accessible class net/minecraft/world/level/levelgen/SurfaceRules$SurfaceRule
|
||||
accessible class net/minecraft/world/level/levelgen/DensityFunctions$Marker
|
||||
accessible class net/minecraft/world/level/levelgen/DensityFunctions$Marker$Type
|
||||
accessible method net/minecraft/world/level/levelgen/DensityFunctions$Marker <init> (Lnet/minecraft/world/level/levelgen/DensityFunctions$Marker$Type;Lnet/minecraft/world/level/levelgen/DensityFunction;)V
|
||||
accessible class net/minecraft/world/level/levelgen/DensityFunctions$Mapped
|
||||
accessible class net/minecraft/world/level/levelgen/DensityFunctions$Mapped$Type
|
||||
accessible method net/minecraft/world/level/levelgen/DensityFunctions$Mapped <init> (Lnet/minecraft/world/level/levelgen/DensityFunctions$Mapped$Type;Lnet/minecraft/world/level/levelgen/DensityFunction;DD)V
|
||||
accessible class net/minecraft/world/level/levelgen/DensityFunctions$MulOrAdd
|
||||
accessible class net/minecraft/world/level/levelgen/DensityFunctions$MulOrAdd$Type
|
||||
accessible method net/minecraft/world/level/levelgen/DensityFunctions$MulOrAdd <init> (Lnet/minecraft/world/level/levelgen/DensityFunctions$MulOrAdd$Type;Lnet/minecraft/world/level/levelgen/DensityFunction;DDD)V
|
||||
|
||||
accessible class net/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase$Cache
|
||||
accessible class net/minecraft/server/level/ServerChunkCache$MainThreadExecutor
|
||||
accessible field net/minecraft/world/level/block/state/BlockBehaviour properties Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user