diff --git a/pom.xml b/pom.xml index 92caf13d0..5c6498a9e 100644 --- a/pom.xml +++ b/pom.xml @@ -465,5 +465,10 @@ 4.1.73.Final compile + + it.unimi.dsi + fastutil + 8.5.6 + diff --git a/src/main/java/de/bixilon/minosoft/data/entities/meta/EntityData.kt b/src/main/java/de/bixilon/minosoft/data/entities/meta/EntityData.kt index 4b7ee76a7..e2cac6da8 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/meta/EntityData.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/meta/EntityData.kt @@ -33,6 +33,7 @@ import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType import glm_.vec3.Vec3i +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap import java.util.* class EntityData( @@ -105,7 +106,7 @@ class EntityData( } } - inner class EntityDataHashMap : HashMap() { + inner class EntityDataHashMap : Int2ObjectOpenHashMap() { operator fun get(field: EntityDataFields): K { val index: Int = this@EntityData.connection.registries.getEntityMetaDataIndex(field) ?: return field.defaultValue.unsafeCast() // Can not find field. diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/BlockStateRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/BlockStateRegistry.kt index 2f201f36e..5ec70deb9 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/BlockStateRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/BlockStateRegistry.kt @@ -15,10 +15,11 @@ package de.bixilon.minosoft.data.registries.registries.registry import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap class BlockStateRegistry(var flattened: Boolean) : AbstractRegistry { override var parent: AbstractRegistry? = null - private val idMap: MutableMap = mutableMapOf() + private val idMap: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() override val size: Int get() { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/EnumRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/EnumRegistry.kt index 7c816ec82..86c5039c2 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/EnumRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/EnumRegistry.kt @@ -17,6 +17,8 @@ import com.google.gson.JsonPrimitive import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.enums.ValuesEnum import de.bixilon.minosoft.util.collections.Clearable +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap import java.util.* class EnumRegistry>( @@ -26,8 +28,8 @@ class EnumRegistry>( ) : Clearable, Parentable> { private var initialized = false - private val idValueMap: MutableMap = mutableMapOf() - private val valueIdMap: MutableMap = mutableMapOf() + private val idValueMap: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() + private val valueIdMap: Object2IntOpenHashMap = Object2IntOpenHashMap() operator fun get(id: Int): T? { return idValueMap[id] ?: parent?.get(id) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/FakeEnumRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/FakeEnumRegistry.kt index e292345a7..5926184e6 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/FakeEnumRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/FakeEnumRegistry.kt @@ -17,13 +17,15 @@ import de.bixilon.kutil.json.JsonUtil.asJsonObject import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.util.collections.Clearable +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap class FakeEnumRegistry( override var parent: FakeEnumRegistry? = null, ) : Clearable, Parentable> { private var initialized = false - private val idValueMap: MutableMap = mutableMapOf() - private val valueIdMap: MutableMap = mutableMapOf() + private val idValueMap: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() + private val valueIdMap: Object2IntOpenHashMap = Object2IntOpenHashMap() private val nameValueMap: MutableMap = mutableMapOf() operator fun get(name: String): T? { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/Registry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/Registry.kt index 9bb946651..a3d4e9350 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/Registry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/Registry.kt @@ -23,13 +23,15 @@ import de.bixilon.minosoft.data.registries.ResourceLocationAble import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap open class Registry( override var parent: AbstractRegistry? = null, ) : AbstractRegistry { private var initialized = false - protected val idValueMap: MutableMap = mutableMapOf() - protected val valueIdMap: MutableMap = mutableMapOf() + protected val idValueMap: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() + protected val valueIdMap: Object2IntOpenHashMap = Object2IntOpenHashMap() protected val resourceLocationMap: MutableMap = mutableMapOf() override val size: Int diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/ResourceLocationRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/ResourceLocationRegistry.kt index 74eea707e..240aab3f2 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/ResourceLocationRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/ResourceLocationRegistry.kt @@ -16,13 +16,15 @@ package de.bixilon.minosoft.data.registries.registries.registry import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap class ResourceLocationRegistry( override var parent: AbstractRegistry? = null, ) : AbstractRegistry { private var initialized = false - private val idValueMap: MutableMap = mutableMapOf() - private val valueIdMap: MutableMap = mutableMapOf() + private val idValueMap: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() + private val valueIdMap: Object2IntOpenHashMap = Object2IntOpenHashMap() override val size: Int diff --git a/src/main/java/de/bixilon/minosoft/data/registries/versions/Versions.kt b/src/main/java/de/bixilon/minosoft/data/registries/versions/Versions.kt index fd16299a2..b7b55c4d5 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/versions/Versions.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/versions/Versions.kt @@ -28,12 +28,13 @@ import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap object Versions : Iterable { private val VERSIONS_INDEX = "minosoft:mapping/versions.json".toResourceLocation() private val VERSIONS_BY_NAME: MutableMap = mutableMapOf() - private val VERSIONS_BY_ID: MutableMap = mutableMapOf() - private val VERSIONS_BY_PROTOCOL: MutableMap = mutableMapOf() + private val VERSIONS_BY_ID: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() + private val VERSIONS_BY_PROTOCOL: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() val AUTOMATIC = Version("Automatic", -1, -1, VersionTypes.RELEASE, mapOf(), mapOf()) private fun addVersion(version: Version) { diff --git a/src/main/java/de/bixilon/minosoft/data/world/WorldEntities.kt b/src/main/java/de/bixilon/minosoft/data/world/WorldEntities.kt index 9b421686e..6b461a794 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/WorldEntities.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/WorldEntities.kt @@ -19,11 +19,13 @@ import de.bixilon.minosoft.data.abilities.Gamemodes import de.bixilon.minosoft.data.entities.entities.Entity import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity import glm_.vec3.Vec3d +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap import java.util.* class WorldEntities : Iterable { - private val idEntityMap: MutableMap = synchronizedMapOf() - private val entityIdMap: MutableMap = synchronizedMapOf() + private val idEntityMap: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() + private val entityIdMap: Object2IntOpenHashMap = Object2IntOpenHashMap() private val entityUUIDMap: MutableMap = synchronizedMapOf() private val uuidEntityMap: MutableMap = synchronizedMapOf() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasElement.kt index fc0d319be..6d5ed3d61 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasElement.kt @@ -16,12 +16,13 @@ package de.bixilon.minosoft.gui.rendering.gui.atlas import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture import glm_.vec2.Vec2 import glm_.vec2.Vec2i +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap class AtlasElement( override val texture: AbstractTexture, val start: Vec2i, val end: Vec2i, - val slots: Map, // ToDo: Use an array? + val slots: Int2ObjectOpenHashMap, // ToDo: Use an array? ) : TextureLike { override val size: Vec2i = end - start override lateinit var uvStart: Vec2 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasManager.kt index 456d13366..1b8a6e324 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasManager.kt @@ -23,6 +23,7 @@ import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.toVec2i import de.bixilon.minosoft.util.KUtil.toResourceLocation import glm_.vec2.Vec2 import glm_.vec2.Vec2i +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap class AtlasManager(private val renderWindow: RenderWindow) { private lateinit var elements: Map @@ -59,7 +60,7 @@ class AtlasManager(private val renderWindow: RenderWindow) { val texture = renderWindow.textureManager.staticTextures.createTexture(versionData["texture"].toResourceLocation(), mipmaps = false) val start = versionData["start"].toVec2i() val end = versionData["end"].toVec2i() - val slots: MutableMap = mutableMapOf() + val slots: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() versionData["slots"].toJsonObject()?.let { for ((slotId, slotData) in it) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ContainerItemsElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ContainerItemsElement.kt index 3907cc0ad..9613cf7ca 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ContainerItemsElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ContainerItemsElement.kt @@ -22,11 +22,12 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.Element import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions import glm_.vec2.Vec2i +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap class ContainerItemsElement( guiRenderer: GUIRenderer, val container: Container, - val slots: Map, // ToDo: Use an array? + val slots: Int2ObjectOpenHashMap, // ToDo: Use an array? ) : Element(guiRenderer) { private val itemElements: MutableMap = synchronizedMapOf() private var revision = -1L diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt index 735101ec3..695cd58ac 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt @@ -76,6 +76,8 @@ import de.bixilon.minosoft.util.chunk.ChunkUtil.received import glm_.vec2.Vec2i import glm_.vec3.Vec3 import glm_.vec3.Vec3i +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap +import it.unimi.dsi.fastutil.ints.IntOpenHashSet class WorldRenderer( private val connection: PlayConnection, @@ -91,7 +93,7 @@ class WorldRenderer( private val fluidSectionPreparer: FluidSectionPreparer = FluidCullSectionPreparer(renderWindow) private val lightMap = LightMap(connection) - private val loadedMeshes: MutableMap> = mutableMapOf() // all prepared (and up to date) meshes + private val loadedMeshes: MutableMap> = mutableMapOf() // all prepared (and up to date) meshes private val loadedMeshesLock = ReadWriteLock() val maxPreparingTasks = maxOf(DefaultThreadPool.threadCount - 1, 1) @@ -100,7 +102,7 @@ class WorldRenderer( private val queue: MutableList = synchronizedListOf() // queue, that is visible, and should be rendered private val queueLock = ReadWriteLock() - private val culledQueue: MutableMap> = mutableMapOf() // Chunk sections that can be prepared or have changed, but are not required to get rendered yet (i.e. culled chunks) + private val culledQueue: MutableMap = mutableMapOf() // Chunk sections that can be prepared or have changed, but are not required to get rendered yet (i.e. culled chunks) private val culledQueueLock = ReadWriteLock() // ToDo: Sometimes if you clear the chunk cache a ton of times, the workers are maxed out and nothing happens anymore @@ -189,7 +191,7 @@ class WorldRenderer( if (!chunk.isFullyLoaded) { return@of } - val sectionHeights: MutableMap = mutableMapOf() + val sectionHeights: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() for (blockPosition in it.blocks.keys) { val neighbours = sectionHeights.getOrPut(blockPosition.sectionHeight) { BooleanArray(Directions.SIZE) } val inSectionHeight = blockPosition.y.inSectionHeight @@ -542,7 +544,7 @@ class WorldRenderer( return true } else { culledQueueLock.lock() - culledQueue.getOrPut(chunkPosition) { mutableSetOf() } += sectionHeight + culledQueue.getOrPut(chunkPosition) { IntOpenHashSet() } += sectionHeight culledQueueLock.unlock() } return false @@ -606,7 +608,7 @@ class WorldRenderer( } loadedMeshesLock.lock() - val meshes = loadedMeshes.getOrPut(item.chunkPosition) { mutableMapOf() } + val meshes = loadedMeshes.getOrPut(item.chunkPosition) { Int2ObjectOpenHashMap() } meshes.put(item.sectionHeight, mesh)?.let { this.visible.removeMesh(it) @@ -719,18 +721,18 @@ class WorldRenderer( loadedMeshesLock.release() culledQueueLock.acquire() - val queue: MutableMap> = mutableMapOf() // The queue method needs the full lock of the culledQueue + val queue: MutableMap = mutableMapOf() // The queue method needs the full lock of the culledQueue for ((chunkPosition, sectionHeights) in this.culledQueue) { if (!isChunkVisible(chunkPosition)) { continue } - var chunkQueue: MutableSet? = null + var chunkQueue: IntOpenHashSet? = null for (sectionHeight in sectionHeights) { if (!isSectionVisible(chunkPosition, sectionHeight, Vec3i.EMPTY, Vec3i(16), false)) { continue } if (chunkQueue == null) { - chunkQueue = queue.getOrPut(chunkPosition) { mutableSetOf() } + chunkQueue = queue.getOrPut(chunkPosition) { IntOpenHashSet() } } chunkQueue += sectionHeight } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/entity/passenger/EntityPassengerS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/entity/passenger/EntityPassengerS2CP.kt index 1440e9142..846831fef 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/entity/passenger/EntityPassengerS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/entity/passenger/EntityPassengerS2CP.kt @@ -21,11 +21,12 @@ import de.bixilon.minosoft.util.KUtil.entities import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType +import it.unimi.dsi.fastutil.ints.IntOpenHashSet @LoadPacket class EntityPassengerS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { val vehicleEntityId: Int = buffer.readVarInt() - val passengerEntityIds: Set = buffer.readVarIntArray().toSet() + val passengerEntityIds: IntOpenHashSet = IntOpenHashSet(buffer.readVarIntArray()) override fun handle(connection: PlayConnection) { val vehicle = connection.world.entities[vehicleEntityId] ?: return diff --git a/src/main/java/de/bixilon/minosoft/recipes/RecipeRegistry.kt b/src/main/java/de/bixilon/minosoft/recipes/RecipeRegistry.kt index d8ffda2bf..384210bd8 100644 --- a/src/main/java/de/bixilon/minosoft/recipes/RecipeRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/recipes/RecipeRegistry.kt @@ -17,12 +17,14 @@ import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocationAble import de.bixilon.minosoft.data.registries.registries.registry.AbstractRegistry import de.bixilon.minosoft.util.KUtil.toResourceLocation +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap class RecipeRegistry( override var parent: AbstractRegistry? = null, ) : AbstractRegistry { - private val idValueMap: MutableMap = mutableMapOf() - private val valueIdMap: MutableMap = mutableMapOf() + private val idValueMap: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() + private val valueIdMap: Object2IntOpenHashMap = Object2IntOpenHashMap() private val resourceLocationRecipeMap: MutableMap = mutableMapOf() private val recipeResourceLocationMap: MutableMap = mutableMapOf()