From f586f12b90154fd4857902fd1d2f738fdcac6226 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 3 Oct 2022 18:27:14 +0700 Subject: [PATCH] Field synchronizer technical improvements --- .../mc/otm/network/FieldSynchronizer.kt | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt index e081311d4..5841fc42a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt @@ -242,7 +242,8 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa ) } - private val endpoints = ArrayList>() + private var endpointsMaxCapacity = 1 + private val endpoints = ArrayList>(1) val defaultEndpoint = Endpoint() private var lastEndpointsCleanup = System.nanoTime() @@ -270,17 +271,23 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa execute.invoke(endpoint) } } + + if (endpoints.size < endpointsMaxCapacity / 2) { + endpoints.trimToSize() + endpointsMaxCapacity = endpoints.size + } } } inner class Endpoint { init { - endpoints.add(WeakReference(this)) + synchronized(endpoints) { + endpoints.add(WeakReference(this)) + endpointsMaxCapacity = endpointsMaxCapacity.coerceAtLeast(endpoints.size) - if (System.nanoTime() - lastEndpointsCleanup >= 60_000_000_000) { - lastEndpointsCleanup = System.nanoTime() + if (System.nanoTime() - lastEndpointsCleanup >= 60_000_000_000) { + lastEndpointsCleanup = System.nanoTime() - synchronized(endpoints) { val iterator = endpoints.listIterator() for (value in iterator) { @@ -288,6 +295,11 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa iterator.remove() } } + + if (endpoints.size < endpointsMaxCapacity / 2) { + endpoints.trimToSize() + endpointsMaxCapacity = endpoints.size + } } } } @@ -515,6 +527,7 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa if (!isDirty && !codec.compare(remote, value)) { notifyEndpoints(this) isDirty = true + remote = codec.copy(value) } } @@ -534,7 +547,6 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa val value = value codec.write(stream, value) isDirty = false - remote = codec.copy(value) } override fun read(stream: DataInputStream) {