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()