Skip to content

Commit c9876a5

Browse files
committed
可能修复在使用 Barrage功能时退出重进会导致卡死锁的问题
1 parent bdd9335 commit c9876a5

5 files changed

Lines changed: 66 additions & 32 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public BufferBuilder renderParticles(ParticleTextureSheet instance,
3535
@Local(argsOnly = true) Camera camera,
3636
@Local(argsOnly = true) float tickDelta,
3737
@Local(ordinal = 0) ParticleTextureSheet sheet) {
38-
Object[] array = queue.toArray();
38+
Particle[] array = queue.toArray(new Particle[0]);
3939
// 异步调用...
4040
ParticleAsyncRenderHelper.INSTANCE
4141
.renderParticlesAsync(array, instance, textureManager, camera, tickDelta);

src/main/kotlin/cn/coostack/cooparticlesapi/CooParticleAPI.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ object CooParticleAPI : ModInitializer {
9090
ServerLifecycleEvents.SERVER_STARTED.register { server ->
9191
this.server = server
9292
}
93+
9394
PacketParticleGroupS2C.init()
9495
PacketParticleS2C.init()
9596
PacketParticleStyleS2C.init()
@@ -100,7 +101,6 @@ object CooParticleAPI : ModInitializer {
100101

101102
private fun testEntity() {
102103
CooParticleEntities.init()
103-
104104
FabricDefaultAttributeRegistry.register(
105105
CooParticleEntities.TEST_ENTITY,
106106
TestEntity.createDefaultMobAttributes()

src/main/kotlin/cn/coostack/cooparticlesapi/barrages/AbstractBarrage.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import com.google.common.base.Predicate
66
import net.minecraft.entity.LivingEntity
77
import net.minecraft.server.world.ServerWorld
88
import net.minecraft.util.math.BlockPos
9+
import net.minecraft.util.math.ChunkPos
910
import net.minecraft.util.math.Vec3d
11+
import net.minecraft.world.chunk.Chunk
1012
import kotlin.math.max
1113

1214
abstract class AbstractBarrage(
@@ -67,18 +69,20 @@ abstract class AbstractBarrage(
6769
}
6870
var hit = false
6971
val blockPos = BlockPos.ofFloored(loc)
70-
val block = world.getBlockState(blockPos)
7172
val result = BarrageHitResult()
72-
if (!block.isAir) {
73-
val shape = block.getCollisionShape(world, blockPos)
74-
if (block.isLiquid) {
75-
if (!options.acrossLiquid) {
73+
if (world.shouldTick(blockPos) && world.isPosLoaded(blockPos.x, blockPos.z)) {
74+
val block = world.getBlockState(blockPos)
75+
if (!block.isAir) {
76+
val shape = block.getCollisionShape(world, blockPos)
77+
if (block.isLiquid) {
78+
if (!options.acrossLiquid) {
79+
result.hitBlockState = block
80+
hit = true
81+
}
82+
} else if (!options.acrossBlock && (!shape.isEmpty || !options.acrossEmptyCollectionShape)) {
7683
result.hitBlockState = block
7784
hit = true
7885
}
79-
} else if (!options.acrossBlock && (!shape.isEmpty || !options.acrossEmptyCollectionShape)) {
80-
result.hitBlockState = block
81-
hit = true
8286
}
8387
}
8488

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,6 @@ abstract class ControlableParticle(
348348
)
349349
// 构建顶点几何
350350
val light = this.getBrightness(tickDelta)
351-
352-
353351
setParticleTexture(vertexConsumer, q, x, y, z, tickDelta, light)
354352
}
355353

src/main/kotlin/cn/coostack/cooparticlesapi/utils/ParticleAsyncRenderHelper.kt

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
package cn.coostack.cooparticlesapi.utils
22

33
import cn.coostack.cooparticlesapi.config.APIConfigManager
4+
import kotlinx.coroutines.CoroutineScope
5+
import kotlinx.coroutines.Deferred
6+
import kotlinx.coroutines.Dispatchers
7+
import kotlinx.coroutines.Job
8+
import kotlinx.coroutines.async
9+
import kotlinx.coroutines.awaitAll
10+
import kotlinx.coroutines.launch
11+
import kotlinx.coroutines.newFixedThreadPoolContext
12+
import kotlinx.coroutines.runBlocking
413
import net.minecraft.client.particle.Particle
514
import net.minecraft.client.particle.ParticleTextureSheet
615
import net.minecraft.client.render.BufferBuilder
@@ -22,8 +31,7 @@ object ParticleAsyncRenderHelper {
2231
val threadCount: Int
2332
get() = APIConfigManager.getConfig().calculateThreadCount
2433
private var threadPool = Executors.newFixedThreadPool(threadCount)
25-
26-
34+
private var scope = CoroutineScope(newFixedThreadPoolContext(threadCount, "particle-async"))
2735
fun close() {
2836
threadPool.shutdownNow()
2937
}
@@ -59,7 +67,8 @@ object ParticleAsyncRenderHelper {
5967
// 索引计算规则如下 从0开始 到 taskPreThreadCount + n 结束 左闭右开
6068
// 下一个thread就是 taskPreThreadCount + n 开始 n一般为1或者0
6169
var currentIndex = 0
62-
val tasks = ArrayList<FutureTask<BufferBuilder?>>()
70+
// val tasks = ArrayList<FutureTask<BufferBuilder?>>()
71+
val tasks = ArrayList<Deferred<BufferBuilder>>()
6372
repeat(actualThreads) {
6473
val tessellator = Tessellator.getInstance()
6574
var next = currentIndex + taskPreThreadCount // 取到 taskHandledIndexStart ..< next
@@ -73,35 +82,58 @@ object ParticleAsyncRenderHelper {
7382
// 复用子数组 taskHandledIndexStart - next
7483
val array = particles.sliceArray(taskHandledIndexStart..<next)
7584
// 创建任务
76-
val task = submitParticlesRender(
77-
array, builder, camera, tickDelta
78-
)
79-
task ?: return@repeat
80-
tasks.add(task)
85+
86+
val job = scope.async {
87+
submitParticlesRender(array, builder, camera, tickDelta)
88+
}
89+
tasks.add(job)
90+
// val task = submitParticlesRender(
91+
// array, builder, camera, tickDelta
92+
// )
93+
// task ?: return@repeat
94+
// tasks.add(task)
8195
}
82-
tasks.forEach {
83-
val builder = it.get() ?: return@forEach
84-
val built = builder.endNullable() ?: return@forEach
85-
BufferRenderer.drawWithGlobalProgram(built)
96+
runBlocking {
97+
tasks.awaitAll().forEach { builder ->
98+
val built = builder.endNullable() ?: return@forEach
99+
BufferRenderer.drawWithGlobalProgram(built)
100+
}
86101
}
102+
// tasks.forEach {
103+
// val builder = it.get() ?: return@forEach
104+
// val built = builder.endNullable() ?: return@forEach
105+
// BufferRenderer.drawWithGlobalProgram(built)
106+
// }
87107
}
88108

89109
fun submitParticlesRender(
90110
particles: Array<out Any>,
91111
builder: BufferBuilder,
92112
camera: Camera,
93113
tickDelta: Float
94-
): FutureTask<BufferBuilder?>? {
95-
val task = FutureTask {
96-
particles.forEach { particle ->
97-
render(particle, builder, camera, tickDelta)
98-
}
99-
return@FutureTask builder
114+
): BufferBuilder {
115+
particles.forEach { particle ->
116+
render(particle, builder, camera, tickDelta)
100117
}
101-
threadPool.submit(task)
102-
return task
118+
return builder
103119
}
104120

121+
// fun submitParticlesRender(
122+
// particles: Array<out Any>,
123+
// builder: BufferBuilder,
124+
// camera: Camera,
125+
// tickDelta: Float
126+
// ): FutureTask<BufferBuilder?>? {
127+
// val task = FutureTask {
128+
// particles.forEach { particle ->
129+
// render(particle, builder, camera, tickDelta)
130+
// }
131+
// return@FutureTask builder
132+
// }
133+
// threadPool.submit(task)
134+
// return task
135+
// }
136+
105137
// 渲染一个粒子
106138
fun render(p: Any, builder: BufferBuilder, camera: Camera, tickDelta: Float) {
107139
if (p !is Particle) return

0 commit comments

Comments
 (0)