Long hash map somehow is ~4 times faster than AVL tree map

This commit is contained in:
DBotThePony 2022-11-22 16:12:51 +07:00
parent bbcf83e239
commit 2857a3f9ef
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.block.entity
import it.unimi.dsi.fastutil.longs.Long2ObjectAVLTreeMap import it.unimi.dsi.fastutil.longs.Long2ObjectAVLTreeMap
import it.unimi.dsi.fastutil.longs.Long2ObjectFunction import it.unimi.dsi.fastutil.longs.Long2ObjectFunction
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap
import net.minecraft.core.BlockPos import net.minecraft.core.BlockPos
import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.ServerLevel
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer
@ -92,7 +93,7 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_:
unsubscribe() unsubscribe()
val subs = playerMap val subs = playerMap
.computeIfAbsent(level) { Long2ObjectAVLTreeMap() } .computeIfAbsent(level) { Long2ObjectOpenHashMap() }
.computeIfAbsent(ChunkPos(blockPos).toLong(), Long2ObjectFunction { ChunkSubscribers(level = WeakReference(level), chunkPos = ChunkPos(blockPos).toLong()) }) .computeIfAbsent(ChunkPos(blockPos).toLong(), Long2ObjectFunction { ChunkSubscribers(level = WeakReference(level), chunkPos = ChunkPos(blockPos).toLong()) })
subs.subscribe(this) subs.subscribe(this)
@ -276,7 +277,7 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_:
* [net.minecraft.server.level.ChunkMap.getPlayers], which is not something we want * [net.minecraft.server.level.ChunkMap.getPlayers], which is not something we want
*/ */
companion object { companion object {
private val playerMap = WeakHashMap<ServerLevel, Long2ObjectAVLTreeMap<ChunkSubscribers>>() private val playerMap = WeakHashMap<ServerLevel, Long2ObjectOpenHashMap<ChunkSubscribers>>()
private val tickingMap = WeakHashMap<ServerLevel, ArrayList<WeakReference<ChunkSubscribers>>>() private val tickingMap = WeakHashMap<ServerLevel, ArrayList<WeakReference<ChunkSubscribers>>>()
fun onLevelUnload(event: LevelEvent.Unload) { fun onLevelUnload(event: LevelEvent.Unload) {
@ -331,7 +332,7 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_:
} }
fun onWatch(event: ChunkWatchEvent.Watch) { fun onWatch(event: ChunkWatchEvent.Watch) {
playerMap.computeIfAbsent(event.level) { Long2ObjectAVLTreeMap() }.computeIfAbsent(event.pos.toLong(), Long2ObjectFunction { ChunkSubscribers(level = WeakReference(event.level), chunkPos = event.pos.toLong()) }).let { playerMap.computeIfAbsent(event.level) { Long2ObjectOpenHashMap() }.computeIfAbsent(event.pos.toLong(), Long2ObjectFunction { ChunkSubscribers(level = WeakReference(event.level), chunkPos = event.pos.toLong()) }).let {
val (blocks, players) = it val (blocks, players) = it
if (event.player !in players) { if (event.player !in players) {