Set up clear performance test
This commit is contained in:
@@ -19,7 +19,7 @@ class Options {
|
|||||||
var worlds: Map<String, WorldOptions> = HashMap()
|
var worlds: Map<String, WorldOptions> = HashMap()
|
||||||
private set
|
private set
|
||||||
var storage: StorageOptions = StorageOptions("postgresql", DataConnectionOptions())
|
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)
|
fun addWorld(name: String, options: WorldOptions) = (worlds as MutableMap).put(name, options)
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ abstract class ParcelGenerator : ChunkGenerator(), ParcelProvider {
|
|||||||
|
|
||||||
abstract fun clearParcel(parcel: Parcel): Worker
|
abstract fun clearParcel(parcel: Parcel): Worker
|
||||||
|
|
||||||
|
abstract fun doBlockOperation(parcel: Parcel, direction: RegionTraversal = RegionTraversal.DOWNWARD, operation: (Block) -> Unit): Worker
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface GeneratorFactory {
|
interface GeneratorFactory {
|
||||||
@@ -267,7 +269,7 @@ class DefaultParcelGenerator(val worlds: Worlds, val name: String, private val o
|
|||||||
override fun clearParcel(parcel: Parcel) = worktimeLimiter.submit {
|
override fun clearParcel(parcel: Parcel) = worktimeLimiter.submit {
|
||||||
val bottom = getBottomCoord(parcel)
|
val bottom = getBottomCoord(parcel)
|
||||||
val region = Region(Vec3i(bottom.x, 0, bottom.z), Vec3i(o.parcelSize, maxHeight + 1, o.parcelSize))
|
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 blockCount = region.blockCount.toDouble()
|
||||||
|
|
||||||
val world = world.world
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,21 @@ import kotlin.coroutines.experimental.SequenceBuilder
|
|||||||
import kotlin.coroutines.experimental.buildIterator
|
import kotlin.coroutines.experimental.buildIterator
|
||||||
|
|
||||||
enum class RegionTraversal(private val builder: suspend SequenceBuilder<Vec3i>.(Region) -> Unit) {
|
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, size.y - y - 1, z))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}),
|
||||||
|
|
||||||
|
UPDARD({ region ->
|
||||||
val origin = region.origin
|
val origin = region.origin
|
||||||
val size = region.size
|
val size = region.size
|
||||||
|
|
||||||
@@ -17,7 +31,6 @@ enum class RegionTraversal(private val builder: suspend SequenceBuilder<Vec3i>.(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}),
|
}),
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class Schematic {
|
|||||||
val size = region.size.also { _size = it }
|
val size = region.size.also { _size = it }
|
||||||
val data = arrayOfNulls<BlockData>(region.blockCount).also { _data = it }
|
val data = arrayOfNulls<BlockData>(region.blockCount).also { _data = it }
|
||||||
//val extra = mutableMapOf<Vec3i, (Block) -> Unit>().also { extra = 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()) {
|
for ((index, vec) in blocks.withIndex()) {
|
||||||
markSuspensionPoint()
|
markSuspensionPoint()
|
||||||
@@ -38,7 +38,7 @@ class Schematic {
|
|||||||
fun getPasteTask(world: World, position: Vec3i): TimeLimitedTask = {
|
fun getPasteTask(world: World, position: Vec3i): TimeLimitedTask = {
|
||||||
if (!isLoaded) throw IllegalStateException()
|
if (!isLoaded) throw IllegalStateException()
|
||||||
val region = Region(position, _size!!)
|
val region = Region(position, _size!!)
|
||||||
val blocks = RegionTraversal.XZY.regionTraverser(region)
|
val blocks = RegionTraversal.DOWNWARD.regionTraverser(region)
|
||||||
val data = _data!!
|
val data = _data!!
|
||||||
|
|
||||||
for ((index, vec) in blocks.withIndex()) {
|
for ((index, vec) in blocks.withIndex()) {
|
||||||
|
|||||||
@@ -7,12 +7,15 @@ import io.dico.dicore.command.annotation.Desc
|
|||||||
import io.dico.dicore.command.annotation.RequireParameters
|
import io.dico.dicore.command.annotation.RequireParameters
|
||||||
import io.dico.parcels2.ParcelOwner
|
import io.dico.parcels2.ParcelOwner
|
||||||
import io.dico.parcels2.ParcelsPlugin
|
import io.dico.parcels2.ParcelsPlugin
|
||||||
|
import io.dico.parcels2.blockvisitor.RegionTraversal
|
||||||
import io.dico.parcels2.command.NamedParcelDefaultValue.FIRST_OWNED
|
import io.dico.parcels2.command.NamedParcelDefaultValue.FIRST_OWNED
|
||||||
import io.dico.parcels2.storage.getParcelBySerializedValue
|
import io.dico.parcels2.storage.getParcelBySerializedValue
|
||||||
import io.dico.parcels2.util.hasAdminManage
|
import io.dico.parcels2.util.hasAdminManage
|
||||||
import io.dico.parcels2.util.hasParcelHomeOthers
|
import io.dico.parcels2.util.hasParcelHomeOthers
|
||||||
import io.dico.parcels2.util.uuid
|
import io.dico.parcels2.util.uuid
|
||||||
|
import org.bukkit.Material
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
//@Suppress("unused")
|
//@Suppress("unused")
|
||||||
class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
||||||
@@ -81,12 +84,31 @@ class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
|||||||
|
|
||||||
@Cmd("clear")
|
@Cmd("clear")
|
||||||
@ParcelRequire(owner = true)
|
@ParcelRequire(owner = true)
|
||||||
fun ParcelScope.cmdClear(player: Player, context: ExecutionContext) {
|
fun ParcelScope.cmdClear(context: ExecutionContext) {
|
||||||
world.generator.clearParcel(parcel)
|
world.generator.clearParcel(parcel)
|
||||||
.onProgressUpdate(1000, 1000) { progress, elapsedTime ->
|
.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))
|
.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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user