Skip to content

Commit 3ab2477

Browse files
authored
Merge pull request #3 from Harveykang/master
合并到主分支
2 parents e12d80e + fe4a5dc commit 3ab2477

5 files changed

Lines changed: 43 additions & 15 deletions

File tree

src/main/java/cn/coostack/cooparticlesapi/mixin/ParticleManagerMixin.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,21 @@ public abstract class ParticleManagerMixin {
2424

2525
@Redirect(method = "tick", at = @At(value = "INVOKE", target = "Ljava/util/Queue;poll()Ljava/lang/Object;"))
2626
public Object changeMaxParticles(Queue<Object> queue) {
27-
if (APIConfigManager.getConfig().getEnabledParticleCountInject()) {
28-
Particle particle;
29-
while ((particle = this.getNewParticles().poll()) != null) {
30-
Map<ParticleTextureSheet, Queue<Particle>> particles = this.getParticles();
31-
particles.computeIfAbsent(particle.getType(),
32-
sheet -> EvictingQueue.create(APIConfigManager.getConfig().getParticleCountLimit()))
33-
.add(particle);
27+
// 不需要判断 EnabledParticleCountInject 了,已在注入时判断,关这个一般都是因为会注入失败,所以不用担心
28+
Particle particle;
29+
int limit = APIConfigManager.getConfig().getParticleCountLimit();
30+
while ((particle = this.getNewParticles().poll()) != null) {
31+
Map<ParticleTextureSheet, Queue<Particle>> particles = this.getParticles();
32+
Queue<Particle> queue1 = particles.computeIfAbsent(particle.getType(),
33+
sheet -> EvictingQueue.create(limit));
34+
// limit 不会改变,这里可以直接判断
35+
if (queue1.size() < limit) {
36+
queue1.add(particle);
37+
} else {
38+
// 这样驱逐队列就没用了但是可以避免内存泄漏
39+
particle.markDead();
3440
}
35-
return null;
36-
} else {
37-
// 恢复原来的功能
38-
return this.getNewParticles().poll();
3941
}
42+
return null;
4043
}
4144
}

src/main/kotlin/cn/coostack/cooparticlesapi/network/particle/emitters/ParticleEmittersManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ object ParticleEmittersManager {
3131
/**
3232
* 客户端可视
3333
*/
34-
val clientEmitters = HashMap<UUID, ParticleEmitters>()
34+
val clientEmitters = ConcurrentHashMap<UUID, ParticleEmitters>()
3535

3636
internal fun getCodecFromID(id: String): PacketCodec<RegistryByteBuf, ParticleEmitters>? {
3737
return emittersCodec[id]

src/main/kotlin/cn/coostack/cooparticlesapi/particles/ControlableParticle.kt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,10 @@ abstract class ControlableParticle(
130130
*/
131131
var death: Boolean
132132
get() = dead
133-
set(value) {
134-
dead = value
133+
set(value) = if (value) {
134+
markDead()
135+
} else {
136+
dead = false
135137
}
136138

137139
/**
@@ -315,6 +317,19 @@ abstract class ControlableParticle(
315317
}
316318
}
317319

320+
/**
321+
* @see ParticleControler.remove()
322+
*/
323+
override fun markDead() {
324+
super.markDead()
325+
// FIXME 原版的驱逐队列满后不会调用 markDead,百分百泄漏,
326+
// 我们的 ParticleManagerMixin 可以确保没问题,
327+
// 但是一旦关闭 ParticleManagerMixin 注入,就绝对有问题
328+
// 粒子的移除方法被原版调用时也要移除 controller 否则会内存泄漏
329+
// 不能放在 controller.remove() 里,因为 markDead 可能在模组外部调用
330+
ControlParticleManager.removeControl(controlUUID)
331+
}
332+
318333
override fun buildGeometry(vertexConsumer: VertexConsumer, camera: Camera, tickDelta: Float) {
319334
if (faceToCamera) {
320335
super.buildGeometry(vertexConsumer, camera, tickDelta)

src/main/kotlin/cn/coostack/cooparticlesapi/particles/control/ControlParticleManager.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ object ControlParticleManager {
1616
return controls[uuid]
1717
}
1818

19+
internal fun removeControl(uuid: UUID) {
20+
controls.remove(uuid)
21+
}
22+
1923
fun createControl(uuid: UUID): ParticleControler {
2024
val controler = ParticleControler(uuid)
2125
controls[uuid] = controler

src/main/kotlin/cn/coostack/cooparticlesapi/particles/control/ParticleControler.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package cn.coostack.cooparticlesapi.particles.control
22

33
import cn.coostack.cooparticlesapi.particles.Controlable
44
import cn.coostack.cooparticlesapi.particles.ControlableParticle
5-
import cn.coostack.cooparticlesapi.utils.Math3DUtil
65
import cn.coostack.cooparticlesapi.utils.RelativeLocation
76
import net.fabricmc.api.EnvType
87
import net.fabricmc.api.Environment
@@ -67,6 +66,10 @@ class ParticleControler(private val uuid: UUID) : Controlable<ControlableParticl
6766
invokeQueue.forEach {
6867
it(particle)
6968
}
69+
// 防呆用的
70+
if (particle.death) {
71+
ControlParticleManager.removeControl(uuid)
72+
}
7073
}
7174

7275
fun rotateParticleTo(target: RelativeLocation) {
@@ -102,6 +105,9 @@ class ParticleControler(private val uuid: UUID) : Controlable<ControlableParticl
102105
particle.teleportTo(x, y, z)
103106
}
104107

108+
/**
109+
* @see ControlableParticle.markDead()
110+
*/
105111
override fun remove() {
106112
particle.markDead()
107113
}

0 commit comments

Comments
 (0)