From 9736d39e048ca23befda243eb480deeecb050184 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 26 Jun 2018 09:10:05 +0900 Subject: [PATCH] trying to optimise the rendering, this is BEFORE job --- assets/aaaxmul.frag | 17 +++++++++++++++++ assets/rgbxmul.frag | 17 +++++++++++++++++ src/net/torvald/terrarum/Terrarum.kt | 12 ++++++++++++ .../terrarum/modulebasegame/EntryPoint.kt | 2 +- .../torvald/terrarum/modulebasegame/Ingame.kt | 15 +++++++++++++-- ...rum_update_and_render_performance_test.xlsx | Bin 0 -> 39455 bytes 6 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 assets/aaaxmul.frag create mode 100644 assets/rgbxmul.frag create mode 100644 work_files/Terrarum_update_and_render_performance_test.xlsx diff --git a/assets/aaaxmul.frag b/assets/aaaxmul.frag new file mode 100644 index 000000000..6a67d5b99 --- /dev/null +++ b/assets/aaaxmul.frag @@ -0,0 +1,17 @@ +#version 120 +#ifdef GL_ES + precision mediump float; +#endif + +varying vec4 v_color; +varying vec2 v_texCoords; +uniform sampler2D u_texture; // world texture, has alpha value that is meaningful + +uniform sampler2D tex1; // lightmap texture + +void main() { + vec4 colorTex0 = texture2D(u_texture, v_texCoords); // world texture + vec4 colorTex1 = texture2D(tex1, v_texCoords); // lightmap (RGBA) + + gl_FragColor = colorTex0 * vec4(colorTex1.aaa, 1.0); +} diff --git a/assets/rgbxmul.frag b/assets/rgbxmul.frag new file mode 100644 index 000000000..39b28b186 --- /dev/null +++ b/assets/rgbxmul.frag @@ -0,0 +1,17 @@ +#version 120 +#ifdef GL_ES + precision mediump float; +#endif + +varying vec4 v_color; +varying vec2 v_texCoords; +uniform sampler2D u_texture; // world texture, has alpha value that is meaningful + +uniform sampler2D tex1; // lightmap texture + +void main() { + vec4 colorTex0 = texture2D(u_texture, v_texCoords); // world texture + vec4 colorTex1 = texture2D(tex1, v_texCoords); // lightmap (RGBA) + + gl_FragColor = colorTex0 * vec4(colorTex1.rgb, 1.0); +} diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 974061645..536a6f2c1 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -192,11 +192,16 @@ object Terrarum : Screen { lateinit var shaderRGBOnly: ShaderProgram lateinit var shaderAtoGrey: ShaderProgram lateinit var shader18Bit: ShaderProgram + lateinit var shaderMulRGBX: ShaderProgram + lateinit var shaderMulAAAX: ShaderProgram lateinit var textureWhiteSquare: Texture + lateinit var testTexture: Texture + + /** Actually just a mesh of four vertices, two triangles -- not a literal glQuad */ lateinit var fullscreenQuad: Mesh; private set private var fullscreenQuadInit = false @@ -308,6 +313,9 @@ object Terrarum : Screen { assetManager = AssetManager() + testTexture = Texture(Gdx.files.internal("./assets/test_texture.tga")) + + println("[Terrarum] GL_VERSION = $GL_VERSION") println("[Terrarum] GL_MAX_TEXTURE_SIZE = $GL_MAX_TEXTURE_SIZE") println("[Terrarum] GL info:\n${Gdx.graphics.glVersion.debugVersionString}") // debug info @@ -368,6 +376,10 @@ object Terrarum : Screen { shaderRGBOnly = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/rgbonly.frag")) shaderAtoGrey = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/aonly.frag")) + shaderMulRGBX = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/rgbxmul.frag")) + shaderMulAAAX = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/aaaxmul.frag")) + + shader18Bit = ShaderProgram(Gdx.files.internal("assets/4096.vert"), Gdx.files.internal("assets/18BitColour.frag")) diff --git a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt index ac4fa94e6..62922fee4 100644 --- a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt +++ b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt @@ -26,7 +26,7 @@ class EntryPoint : ModuleEntryPoint() { // load customised item loader // ///////////////////////////////// - println("[ItemCodex] recording item ID ") + println("[ModuleBaseGame.EntryPoint] recording item ID ") // blocks.csvs are loaded by ModMgr beforehand // block items (blocks and walls are the same thing basically) diff --git a/src/net/torvald/terrarum/modulebasegame/Ingame.kt b/src/net/torvald/terrarum/modulebasegame/Ingame.kt index 9aed0b7f8..19b3b9815 100644 --- a/src/net/torvald/terrarum/modulebasegame/Ingame.kt +++ b/src/net/torvald/terrarum/modulebasegame/Ingame.kt @@ -527,7 +527,10 @@ class Ingame(batch: SpriteBatch) : IngameInstance(batch) { else { var updateTries = 0 while (updateDeltaCounter >= updateRate) { - updateGame(delta) + + //updateGame(delta) + measureRuntime({ updateGame(delta) }, prependMsg = "Update Game: ") + updateDeltaCounter -= updateRate updateTries++ @@ -540,7 +543,15 @@ class Ingame(batch: SpriteBatch) : IngameInstance(batch) { /** RENDER CODE GOES HERE */ - renderGame(batch) + //renderGame(batch) + measureRuntime({ renderGame(batch) }, prependMsg = "Render Game: ") + } + + private fun measureRuntime(function: (() -> Unit), out: PrintStream = System.err, prependMsg: String = "", appendMsg: String = "") { + val startTime = System.nanoTime() + function.invoke() + val endTime = System.nanoTime() + println("$prependMsg${endTime - startTime} ns$appendMsg") } protected fun updateGame(delta: Float) { diff --git a/work_files/Terrarum_update_and_render_performance_test.xlsx b/work_files/Terrarum_update_and_render_performance_test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..58f286004ee4a305d8dd06200934d7719a77886c GIT binary patch literal 39455 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 j<^Mi