Set up clear performance test
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,7 +6,21 @@ 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, size.y - y - 1, z))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}),
|
||||
|
||||
UPDARD({ region ->
|
||||
val origin = region.origin
|
||||
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 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()) {
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user