From dbab42039432f1516ce64fc11b8af1f4d874576f Mon Sep 17 00:00:00 2001 From: Dico Karssiens Date: Mon, 30 Jul 2018 14:52:36 +0100 Subject: Set up clear performance test --- src/main/kotlin/io/dico/parcels2/Options.kt | 2 +- src/main/kotlin/io/dico/parcels2/WorldGenerator.kt | 18 ++++++++++++++- .../dico/parcels2/blockvisitor/RegionTraversal.kt | 17 ++++++++++++-- .../io/dico/parcels2/blockvisitor/Schematic.kt | 4 ++-- .../io/dico/parcels2/command/CommandsGeneral.kt | 26 ++++++++++++++++++++-- 5 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/io/dico/parcels2/Options.kt b/src/main/kotlin/io/dico/parcels2/Options.kt index 05df718..90a1594 100644 --- a/src/main/kotlin/io/dico/parcels2/Options.kt +++ b/src/main/kotlin/io/dico/parcels2/Options.kt @@ -19,7 +19,7 @@ class Options { var worlds: Map = HashMap() private set var storage: StorageOptions = StorageOptions("postgresql", DataConnectionOptions()) - var tickWorktime: TickWorktimeOptions = TickWorktimeOptions(30, 1) + var tickWorktime: TickWorktimeOptions = TickWorktimeOptions(20, 1) fun addWorld(name: String, options: WorldOptions) = (worlds as MutableMap).put(name, options) diff --git a/src/main/kotlin/io/dico/parcels2/WorldGenerator.kt b/src/main/kotlin/io/dico/parcels2/WorldGenerator.kt index 724eba7..72ca3bd 100644 --- a/src/main/kotlin/io/dico/parcels2/WorldGenerator.kt +++ b/src/main/kotlin/io/dico/parcels2/WorldGenerator.kt @@ -52,6 +52,8 @@ abstract class ParcelGenerator : ChunkGenerator(), ParcelProvider { abstract fun clearParcel(parcel: Parcel): Worker + abstract fun doBlockOperation(parcel: Parcel, direction: RegionTraversal = RegionTraversal.DOWNWARD, operation: (Block) -> Unit): Worker + } interface GeneratorFactory { @@ -267,7 +269,7 @@ class DefaultParcelGenerator(val worlds: Worlds, val name: String, private val o override fun clearParcel(parcel: Parcel) = worktimeLimiter.submit { val bottom = getBottomCoord(parcel) val region = Region(Vec3i(bottom.x, 0, bottom.z), Vec3i(o.parcelSize, maxHeight + 1, o.parcelSize)) - val blocks = RegionTraversal.XZY.regionTraverser(region) + val blocks = RegionTraversal.DOWNWARD.regionTraverser(region) val blockCount = region.blockCount.toDouble() val world = world.world @@ -288,4 +290,18 @@ class DefaultParcelGenerator(val worlds: Worlds, val name: String, private val o } + override fun doBlockOperation(parcel: Parcel, direction: RegionTraversal, operation: (Block) -> Unit) = worktimeLimiter.submit { + val bottom = getBottomCoord(parcel) + val region = Region(Vec3i(bottom.x, 0, bottom.z), Vec3i(o.parcelSize, maxHeight + 1, o.parcelSize)) + val blocks = direction.regionTraverser(region) + val blockCount = region.blockCount.toDouble() + val world = world.world + + for ((index, vec) in blocks.withIndex()) { + markSuspensionPoint() + operation(world[vec]) + setProgress((index + 1) / blockCount) + } + } + } \ No newline at end of file diff --git a/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraversal.kt b/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraversal.kt index 0e7d217..19eb7ee 100644 --- a/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraversal.kt +++ b/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraversal.kt @@ -6,20 +6,33 @@ import kotlin.coroutines.experimental.SequenceBuilder import kotlin.coroutines.experimental.buildIterator enum class RegionTraversal(private val builder: suspend SequenceBuilder.(Region) -> Unit) { - XZY({ region -> + DOWNWARD({ region -> val origin = region.origin val size = region.size repeat(size.y) { y -> repeat(size.z) { z -> repeat(size.x) { x -> - yield(origin.add(x, y, z)) + yield(origin.add(x, size.y - y - 1, z)) } } } }), + UPDARD({ region -> + val origin = region.origin + val size = region.size + + repeat(size.y) { y -> + repeat(size.z) { z -> + repeat(size.x) { x -> + yield(origin.add(x, y, z)) + } + } + } + }), + ; fun regionTraverser(region: Region) = Iterable { buildIterator { builder(region) } } diff --git a/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt b/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt index 1c01571..41df083 100644 --- a/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt +++ b/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt @@ -22,7 +22,7 @@ class Schematic { val size = region.size.also { _size = it } val data = arrayOfNulls(region.blockCount).also { _data = it } //val extra = mutableMapOf Unit>().also { extra = it } - val blocks = RegionTraversal.XZY.regionTraverser(region) + val blocks = RegionTraversal.DOWNWARD.regionTraverser(region) for ((index, vec) in blocks.withIndex()) { markSuspensionPoint() @@ -38,7 +38,7 @@ class Schematic { fun getPasteTask(world: World, position: Vec3i): TimeLimitedTask = { if (!isLoaded) throw IllegalStateException() val region = Region(position, _size!!) - val blocks = RegionTraversal.XZY.regionTraverser(region) + val blocks = RegionTraversal.DOWNWARD.regionTraverser(region) val data = _data!! for ((index, vec) in blocks.withIndex()) { diff --git a/src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt b/src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt index c3f8836..78a989e 100644 --- a/src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt +++ b/src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt @@ -7,12 +7,15 @@ import io.dico.dicore.command.annotation.Desc import io.dico.dicore.command.annotation.RequireParameters import io.dico.parcels2.ParcelOwner import io.dico.parcels2.ParcelsPlugin +import io.dico.parcels2.blockvisitor.RegionTraversal import io.dico.parcels2.command.NamedParcelDefaultValue.FIRST_OWNED import io.dico.parcels2.storage.getParcelBySerializedValue import io.dico.parcels2.util.hasAdminManage import io.dico.parcels2.util.hasParcelHomeOthers import io.dico.parcels2.util.uuid +import org.bukkit.Material import org.bukkit.entity.Player +import java.util.* //@Suppress("unused") class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) { @@ -81,12 +84,31 @@ class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) { @Cmd("clear") @ParcelRequire(owner = true) - fun ParcelScope.cmdClear(player: Player, context: ExecutionContext) { + fun ParcelScope.cmdClear(context: ExecutionContext) { world.generator.clearParcel(parcel) .onProgressUpdate(1000, 1000) { progress, elapsedTime -> - context.sendMessage(EMessageType.INFORMATIVE, "Clear progress: %.06f%%, %.2fs elapsed" + context.sendMessage(EMessageType.INFORMATIVE, "Clear progress: %.02f%%, %.2fs elapsed" .format(progress * 100, elapsedTime / 1000.0)) } } + @Cmd("make_mess") + @ParcelRequire(owner = true) + fun ParcelScope.cmdMakeMess(context: ExecutionContext) { + val server = plugin.server + val blockDatas = arrayOf( + server.createBlockData(Material.STICKY_PISTON), + server.createBlockData(Material.GLASS), + server.createBlockData(Material.STONE_SLAB), + server.createBlockData(Material.QUARTZ_BLOCK) + ) + val random = Random() + world.generator.doBlockOperation(parcel, direction = RegionTraversal.UPDARD) { block -> + block.blockData = blockDatas[random.nextInt(4)] + }.onProgressUpdate(1000, 1000) { progress, elapsedTime -> + context.sendMessage(EMessageType.INFORMATIVE, "Mess progress: %.02f%%, %.2fs elapsed" + .format(progress * 100, elapsedTime / 1000.0)) + } + } + } \ No newline at end of file -- cgit v1.2.3