summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDico Karssiens <dico.karssiens@gmail.com>2018-07-30 14:52:36 +0100
committerDico Karssiens <dico.karssiens@gmail.com>2018-07-30 14:52:36 +0100
commitdbab42039432f1516ce64fc11b8af1f4d874576f (patch)
tree32340a758299e1b6484c4a2aca8a726131907b19
parent48da05c9e866cbdfa3bdedb7d3ae35201993bf14 (diff)
Set up clear performance test
-rw-r--r--src/main/kotlin/io/dico/parcels2/Options.kt2
-rw-r--r--src/main/kotlin/io/dico/parcels2/WorldGenerator.kt18
-rw-r--r--src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraversal.kt17
-rw-r--r--src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt4
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/CommandsGeneral.kt26
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<String, WorldOptions> = 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<Vec3i>.(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<BlockData>(region.blockCount).also { _data = it }
//val extra = mutableMapOf<Vec3i, (Block) -> 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