Long hash map somehow is ~4 times faster than AVL tree map
This commit is contained in:
parent
bbcf83e239
commit
2857a3f9ef
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user