mirror of
https://github.com/boy0001/FastAsyncWorldedit.git
synced 2025-02-17 21:11:26 +01:00
Optimize set when not region restricted
This commit is contained in:
parent
0c33e84e6b
commit
04bdec3e76
@ -111,10 +111,12 @@ public abstract class CharFaweChunk<T, V extends FaweQueue> extends FaweChunk<T>
|
|||||||
* @param i
|
* @param i
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public char[] getIdArray(final int i) {
|
public char[] getIdArray(final int i) {
|
||||||
return this.ids[i];
|
return this.ids[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public char[][] getCombinedIdArrays() {
|
public char[][] getCombinedIdArrays() {
|
||||||
return this.ids;
|
return this.ids;
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,11 @@ public class NullFaweChunk extends FaweChunk<Void> {
|
|||||||
return new char[16][];
|
return new char[16][];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public char[] getIdArray(int layer) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getBitMask() {
|
public int getBitMask() {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -10,6 +10,7 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public abstract class FaweChunk<T> implements Callable<FaweChunk> {
|
public abstract class FaweChunk<T> implements Callable<FaweChunk> {
|
||||||
|
|
||||||
@ -123,8 +124,28 @@ public abstract class FaweChunk<T> implements Callable<FaweChunk> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the combined id array at a layer or null if it does not exist
|
||||||
|
* @param layer
|
||||||
|
* @return char[] or null
|
||||||
|
*/
|
||||||
|
public @Nullable char[] getIdArray(int layer) {
|
||||||
|
char[] ids = new char[4096];
|
||||||
|
int by = layer << 4;
|
||||||
|
int index = 0;
|
||||||
|
for (int y = 0; y < 16; y++) {
|
||||||
|
int yy = by + y;
|
||||||
|
for (int z = 0; z < 16; z++) {
|
||||||
|
for (int x = 0; x < 16; x++) {
|
||||||
|
ids[index++] = (char) getBlockCombinedId(x, yy, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ids;
|
||||||
|
}
|
||||||
|
|
||||||
public char[][] getCombinedIdArrays() {
|
public char[][] getCombinedIdArrays() {
|
||||||
char[][] ids = new char[16][];
|
char[][] ids = new char[HEIGHT >> 4][];
|
||||||
for (int y = 0; y < HEIGHT >> 4; y++) {
|
for (int y = 0; y < HEIGHT >> 4; y++) {
|
||||||
int y4 = y >> 4;
|
int y4 = y >> 4;
|
||||||
short[][] i1 = FaweCache.CACHE_J[y];
|
short[][] i1 = FaweCache.CACHE_J[y];
|
||||||
|
@ -33,6 +33,7 @@ public abstract class FaweChangeSet implements ChangeSet {
|
|||||||
|
|
||||||
private final World world;
|
private final World world;
|
||||||
private final boolean mainThread;
|
private final boolean mainThread;
|
||||||
|
private final int layers;
|
||||||
private AtomicInteger waitingCombined = new AtomicInteger(0);
|
private AtomicInteger waitingCombined = new AtomicInteger(0);
|
||||||
private AtomicInteger waitingAsync = new AtomicInteger(0);
|
private AtomicInteger waitingAsync = new AtomicInteger(0);
|
||||||
private Object lockCombined = new Object();
|
private Object lockCombined = new Object();
|
||||||
@ -49,6 +50,7 @@ public abstract class FaweChangeSet implements ChangeSet {
|
|||||||
public FaweChangeSet(World world) {
|
public FaweChangeSet(World world) {
|
||||||
this.world = world;
|
this.world = world;
|
||||||
this.mainThread = Fawe.get().isMainThread();
|
this.mainThread = Fawe.get().isMainThread();
|
||||||
|
this.layers = this.world.getMaxY() >> 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
public World getWorld() {
|
public World getWorld() {
|
||||||
@ -221,12 +223,12 @@ public abstract class FaweChangeSet implements ChangeSet {
|
|||||||
// Block changes
|
// Block changes
|
||||||
{
|
{
|
||||||
// Current blocks
|
// Current blocks
|
||||||
char[][] currentIds = next.getCombinedIdArrays();
|
// char[][] currentIds = next.getCombinedIdArrays();
|
||||||
// Previous blocks in modified sections (i.e. we skip sections that weren't modified)
|
// Previous blocks in modified sections (i.e. we skip sections that weren't modified)
|
||||||
char[][] previousIds = previous.getCombinedIdArrays();
|
// char[][] previousIds = previous.getCombinedIdArrays();
|
||||||
for (int layer = 0; layer < currentIds.length; layer++) {
|
for (int layer = 0; layer < layers; layer++) {
|
||||||
char[] currentLayer = currentIds[layer];
|
char[] currentLayer = next.getIdArray(layer);
|
||||||
char[] previousLayer = previousIds[layer];
|
char[] previousLayer = previous.getIdArray(layer);
|
||||||
if (currentLayer == null) {
|
if (currentLayer == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -524,6 +524,10 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting
|
|||||||
return history != null ? history.getChangeSet() : changeTask;
|
return history != null ? history.getChangeSet() : changeTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FaweChangeSet getChangeTask() {
|
||||||
|
return changeTask;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the ChangeSet being used for this EditSession
|
* Change the ChangeSet being used for this EditSession
|
||||||
* - If history is disabled, no changeset can be set
|
* - If history is disabled, no changeset can be set
|
||||||
|
@ -319,7 +319,7 @@ public class RegionCommands {
|
|||||||
@CommandPermissions("worldedit.region.set")
|
@CommandPermissions("worldedit.region.set")
|
||||||
@Logging(REGION)
|
@Logging(REGION)
|
||||||
public void set(Player player, LocalSession session, EditSession editSession, @Selection Region selection, Pattern to) throws WorldEditException {
|
public void set(Player player, LocalSession session, EditSession editSession, @Selection Region selection, Pattern to) throws WorldEditException {
|
||||||
if (selection instanceof CuboidRegion && editSession.hasFastMode() && to instanceof BlockPattern) {
|
if (selection instanceof CuboidRegion && (editSession.hasFastMode() || (editSession.getRegionExtent() == null && editSession.getChangeTask() != null)) && to instanceof BlockPattern) {
|
||||||
try {
|
try {
|
||||||
CuboidRegion cuboid = (CuboidRegion) selection;
|
CuboidRegion cuboid = (CuboidRegion) selection;
|
||||||
RegionWrapper current = new RegionWrapper(cuboid.getMinimumPoint(), cuboid.getMaximumPoint());
|
RegionWrapper current = new RegionWrapper(cuboid.getMinimumPoint(), cuboid.getMaximumPoint());
|
||||||
@ -363,9 +363,11 @@ public class RegionCommands {
|
|||||||
newChunk.addToQueue();
|
newChunk.addToQueue();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
int volume = cuboid.getArea();
|
||||||
|
editSession.setSize(volume);
|
||||||
queue.enqueue();
|
queue.enqueue();
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
BBC.OPERATION.send(player, BBC.VISITOR_BLOCK.format(cuboid.getArea()));
|
BBC.OPERATION.send(player, BBC.VISITOR_BLOCK.format(volume));
|
||||||
queue.flush();
|
queue.flush();
|
||||||
BBC.ACTION_COMPLETE.send(player, (System.currentTimeMillis() - start) / 1000d);
|
BBC.ACTION_COMPLETE.send(player, (System.currentTimeMillis() - start) / 1000d);
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user