Optimize EntityDataManager by dropping its lock

This commit is contained in:
IzzelAliz 2021-05-08 23:32:18 +08:00
parent cef6d7e3fc
commit 8982e79ba6
3 changed files with 87 additions and 0 deletions

View File

@ -0,0 +1,61 @@
package io.izzel.arclight.impl.common.optimization;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
public class NoopReadWriteLock implements ReadWriteLock {
private static final NoopReadWriteLock INSTANCE = new NoopReadWriteLock();
private static final NoopLock LOCK = new NoopLock();
@NotNull
@Override
public Lock readLock() {
return LOCK;
}
@NotNull
@Override
public Lock writeLock() {
return LOCK;
}
public static ReadWriteLock instance() {
return INSTANCE;
}
private static class NoopLock implements Lock {
@Override
public void lock() {
}
@Override
public void lockInterruptibly() throws InterruptedException {
}
@Override
public boolean tryLock() {
return true;
}
@Override
public boolean tryLock(long time, @NotNull TimeUnit unit) throws InterruptedException {
return true;
}
@Override
public void unlock() {
}
@NotNull
@Override
public Condition newCondition() {
throw new AssertionError();
}
}
}

View File

@ -0,0 +1,25 @@
package io.izzel.arclight.impl.mixin.optimization.general;
import io.izzel.arclight.impl.common.optimization.NoopReadWriteLock;
import net.minecraft.entity.Entity;
import net.minecraft.network.datasync.EntityDataManager;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.concurrent.locks.ReadWriteLock;
@Mixin(EntityDataManager.class)
public class EntityDataManagerMixin_Optimize {
@Shadow @Final @Mutable private ReadWriteLock lock;
@Inject(method = "<init>", at = @At("RETURN"))
private void optimize$dropLock(Entity entityIn, CallbackInfo ci) {
this.lock = NoopReadWriteLock.instance();
}
}

View File

@ -5,6 +5,7 @@
"refmap": "mixins.arclight.impl.refmap.1_16.json",
"mixins": [
"ClassInheritanceMultiMapMixin",
"EntityDataManagerMixin_Optimize",
"VoxelShapesMixin",
"activationrange.ActivationRangeMixin",
"activationrange.EntityMixin_ActivationRange",