split renderers in async renderers

* This reduces the amount of thread pool calls per frame
This commit is contained in:
Bixilon 2022-09-03 19:51:43 +02:00
parent 74191aa799
commit 11056c9295
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
6 changed files with 28 additions and 7 deletions

View File

@ -28,7 +28,7 @@ import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent
import de.bixilon.minosoft.gui.rendering.particle.types.Particle import de.bixilon.minosoft.gui.rendering.particle.types.Particle
import de.bixilon.minosoft.gui.rendering.renderer.Renderer import de.bixilon.minosoft.gui.rendering.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.SkipAll import de.bixilon.minosoft.gui.rendering.system.base.phases.SkipAll
@ -49,7 +49,7 @@ import de.bixilon.minosoft.util.collections.floats.DirectArrayFloatList
class ParticleRenderer( class ParticleRenderer(
private val connection: PlayConnection, private val connection: PlayConnection,
override val renderWindow: RenderWindow, override val renderWindow: RenderWindow,
) : Renderer, TransparentDrawable, TranslucentDrawable, SkipAll, AbstractParticleRenderer { ) : AsyncRenderer, TransparentDrawable, TranslucentDrawable, SkipAll, AbstractParticleRenderer {
override val renderSystem: RenderSystem = renderWindow.renderSystem override val renderSystem: RenderSystem = renderWindow.renderSystem
private val profile = connection.profiles.particle private val profile = connection.profiles.particle
private val transparentShader: Shader = renderSystem.createShader(minosoft("particle")) private val transparentShader: Shader = renderSystem.createShader(minosoft("particle"))

View File

@ -0,0 +1,19 @@
/*
* Minosoft
* Copyright (C) 2020-2022 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.renderer
interface AsyncRenderer : Renderer {
fun prepareDrawAsync() = Unit
}

View File

@ -34,6 +34,5 @@ interface Renderer {
fun postAsyncInit(latch: CountUpAndDownLatch) = Unit fun postAsyncInit(latch: CountUpAndDownLatch) = Unit
fun prePrepareDraw() = Unit fun prePrepareDraw() = Unit
fun prepareDrawAsync() = Unit
fun postPrepareDraw() = Unit fun postPrepareDraw() = Unit
} }

View File

@ -125,6 +125,9 @@ class RendererManager(
val latch = CountUpAndDownLatch(1) val latch = CountUpAndDownLatch(1)
for (renderer in rendererList) { for (renderer in rendererList) {
if (renderer !is AsyncRenderer) {
continue
}
latch.inc() latch.inc()
DefaultThreadPool += ThreadPoolRunnable(priority = ThreadPool.HIGHER) { renderer.prepareDrawAsync(); latch.dec() } DefaultThreadPool += ThreadPoolRunnable(priority = ThreadPool.HIGHER) { renderer.prepareDrawAsync(); latch.dec() }
} }

View File

@ -25,8 +25,8 @@ import de.bixilon.minosoft.data.registries.dimension.DimensionProperties
import de.bixilon.minosoft.data.text.formatting.color.ChatColors import de.bixilon.minosoft.data.text.formatting.color.ChatColors
import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.MeshSwapper import de.bixilon.minosoft.gui.rendering.renderer.MeshSwapper
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
import de.bixilon.minosoft.gui.rendering.system.base.phases.OpaqueDrawable import de.bixilon.minosoft.gui.rendering.system.base.phases.OpaqueDrawable
@ -42,7 +42,7 @@ import de.bixilon.minosoft.util.KUtil.toResourceLocation
class ChunkBorderRenderer( class ChunkBorderRenderer(
val connection: PlayConnection, val connection: PlayConnection,
override val renderWindow: RenderWindow, override val renderWindow: RenderWindow,
) : Renderer, OpaqueDrawable, MeshSwapper { ) : AsyncRenderer, OpaqueDrawable, MeshSwapper {
private val profile = connection.profiles.rendering private val profile = connection.profiles.rendering
override val renderSystem: RenderSystem = renderWindow.renderSystem override val renderSystem: RenderSystem = renderWindow.renderSystem
private var chunkPosition: Vec2i? = null private var chunkPosition: Vec2i? = null

View File

@ -24,8 +24,8 @@ import de.bixilon.minosoft.data.registries.blocks.types.entity.BlockWithEntity
import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget
import de.bixilon.minosoft.gui.rendering.renderer.AsyncRenderer
import de.bixilon.minosoft.gui.rendering.renderer.MeshSwapper import de.bixilon.minosoft.gui.rendering.renderer.MeshSwapper
import de.bixilon.minosoft.gui.rendering.renderer.Renderer
import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions
import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem
@ -38,7 +38,7 @@ import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
class BlockOutlineRenderer( class BlockOutlineRenderer(
val connection: PlayConnection, val connection: PlayConnection,
override val renderWindow: RenderWindow, override val renderWindow: RenderWindow,
) : Renderer, OtherDrawable, MeshSwapper { ) : AsyncRenderer, OtherDrawable, MeshSwapper {
private val profile = connection.profiles.block.outline private val profile = connection.profiles.block.outline
override val renderSystem: RenderSystem = renderWindow.renderSystem override val renderSystem: RenderSystem = renderWindow.renderSystem
private var currentOutlinePosition: Vec3i? = null private var currentOutlinePosition: Vec3i? = null