From bf6fec7753d690411faa9e6b0b6250b54a42b0eb Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 25 Mar 2025 11:09:47 +0700 Subject: [PATCH] Create shared state in EnhancedPlacementContext for memory efficiency --- .../otm/worldgen/EnhancedPlacementContext.kt | 56 ++++++++++++------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacementContext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacementContext.kt index 3cdd33f4d..720c0a138 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacementContext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacementContext.kt @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.worldgen +import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap import net.minecraft.core.BlockPos import net.minecraft.util.RandomSource import net.minecraft.world.level.ChunkPos @@ -18,15 +19,32 @@ class EnhancedPlacementContext { fun place(context: EnhancedPlacementContext, positions: List, feature: EnhancedFeature.Configured<*, *>) } - val level: WorldGenLevel - val generator: ChunkGenerator - val random: RandomSource - val origin: ChunkPos - private val placer: Placer - val vanillaContext: PlacementContext + private data class SharedState( + val level: WorldGenLevel, + val generator: ChunkGenerator, + val random: RandomSource, + val origin: ChunkPos, + val placer: Placer, + val vanillaContext: PlacementContext, + ) - private var parent: EnhancedPlacementContext? = null - private val variables = HashMap, KOptional<*>>() + private val state: SharedState + + val level: WorldGenLevel + get() = state.level + val generator: ChunkGenerator + get() = state.generator + val random: RandomSource + get() = state.random + val origin: ChunkPos + get() = state.origin + private val placer: Placer + get() = state.placer + val vanillaContext: PlacementContext + get() = state.vanillaContext + + private val parent: EnhancedPlacementContext? + private val variables = Reference2ObjectOpenHashMap, KOptional<*>>(0) private fun recursiveGet(index: PlacementVariable): KOptional? { return variables[index] as KOptional? ?: parent?.recursiveGet(index) @@ -56,23 +74,21 @@ class EnhancedPlacementContext { origin: ChunkPos, placer: Placer, ) { - this.level = level - this.generator = generator - this.random = random - this.origin = origin - this.placer = placer + state = SharedState( + level = level, + generator = generator, + random = random, + origin = origin, + placer = placer, + vanillaContext = PlacementContext(level, generator, Optional.empty()) + ) - vanillaContext = PlacementContext(level, generator, Optional.empty()) + parent = null } private constructor(parent: EnhancedPlacementContext) { - this.level = parent.level - this.generator = parent.generator - this.random = parent.random - this.origin = parent.origin - this.placer = parent.placer + this.state = parent.state this.parent = parent - this.vanillaContext = parent.vanillaContext } fun push(): EnhancedPlacementContext {