11package cn.coostack.cooparticlesapi.utils
22
33import 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
413import net.minecraft.client.particle.Particle
514import net.minecraft.client.particle.ParticleTextureSheet
615import 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