From 42e6b188454fbc6c872fac10a0c50fdec168d534 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sat, 25 Jul 2020 20:01:41 -0700 Subject: [PATCH] Text rendering job system --- .../Plugins/ConformalDecals.dll | Bin 76800 -> 80896 bytes Source/ConformalDecals/ConformalDecals.csproj | 1 + Source/ConformalDecals/ModuleConformalText.cs | 4 +- Source/ConformalDecals/Text/RenderedText.cs | 9 +- Source/ConformalDecals/Text/TextRenderJob.cs | 42 +++++++ Source/ConformalDecals/Text/TextRenderer.cs | 104 +++++++++++++++--- 6 files changed, 141 insertions(+), 19 deletions(-) create mode 100644 Source/ConformalDecals/Text/TextRenderJob.cs diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 1ac867af8444dda26e65d45d86d4e960801d6ab8..abddca6459a34371d21097e8694c908271c8b153 100644 GIT binary patch literal 80896 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 z lI%znB2Wk`?8mG*DHjE_Dk#)l1f!mPq2j_sR|%T5`W+WgB$XZhIdl{`uGis$7f hAvgMQfw#)XalWFzeykx#_^};Vl=}ZC`hScA{~NfDu=xN0 literal 76800 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 VK3F~^{OkT}O8w7?{y*cu{{gAR21x(_ diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index f4c8b7a..b6a10d0 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -90,6 +90,7 @@ + diff --git a/Source/ConformalDecals/ModuleConformalText.cs b/Source/ConformalDecals/ModuleConformalText.cs index a851536..6e3615a 100644 --- a/Source/ConformalDecals/ModuleConformalText.cs +++ b/Source/ConformalDecals/ModuleConformalText.cs @@ -27,8 +27,8 @@ namespace ConformalDecals { var decalText = new DecalText("Hello World!", _font, _style); - TextRenderer.Instance.RenderText(decalText, out var texture, out var window); - materialProperties.AddOrGetTextureProperty("_Decal", true).Texture = texture; + //TextRenderer.Instance.RenderText(decalText, out var texture, out var window); + //materialProperties.AddOrGetTextureProperty("_Decal", true).Texture = texture; UpdateMaterials(); UpdateScale(); } diff --git a/Source/ConformalDecals/Text/RenderedText.cs b/Source/ConformalDecals/Text/RenderedText.cs index d00c293..fc31ae4 100644 --- a/Source/ConformalDecals/Text/RenderedText.cs +++ b/Source/ConformalDecals/Text/RenderedText.cs @@ -1,11 +1,16 @@ using UnityEngine; namespace ConformalDecals.Text { - public class RenderedText : ScriptableObject { + public class RenderedText { public Texture2D Texture { get; private set; } public Rect Window { get; private set; } - public int UserCount { get; private set; } + public int UserCount { get; set; } + + public RenderedText(Texture2D texture, Rect window) { + Texture = texture; + Window = window; + } } } \ No newline at end of file diff --git a/Source/ConformalDecals/Text/TextRenderJob.cs b/Source/ConformalDecals/Text/TextRenderJob.cs new file mode 100644 index 0000000..0d17cbd --- /dev/null +++ b/Source/ConformalDecals/Text/TextRenderJob.cs @@ -0,0 +1,42 @@ +using System; +using UnityEngine.Events; + +namespace ConformalDecals.Text { + public class TextRenderJob { + public DecalText OldText { get; } + public DecalText NewText { get; } + public bool Needed { get; private set; } + public bool IsStarted { get; private set; } + public bool IsDone { get; private set; } + + public readonly TextRenderer.TextRenderEvent onRenderFinished = new TextRenderer.TextRenderEvent(); + + public TextRenderJob(DecalText oldText, DecalText newText, UnityAction renderFinishedCallback) { + OldText = oldText ?? throw new ArgumentNullException(nameof(oldText)); + NewText = newText ?? throw new ArgumentNullException(nameof(newText)); + Needed = true; + + if (renderFinishedCallback != null) onRenderFinished.AddListener(renderFinishedCallback); + } + + public TextRenderJob( DecalText newText, UnityAction renderFinishedCallback) { + NewText = newText ?? throw new ArgumentNullException(nameof(newText)); + Needed = true; + + if (renderFinishedCallback != null) onRenderFinished.AddListener(renderFinishedCallback); + } + + public void Cancel() { + Needed = false; + } + + public void Start() { + IsStarted = true; + } + + public void Finish(RenderedText output) { + IsDone = true; + onRenderFinished.Invoke(output); + } + } +} \ No newline at end of file diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs index aee2b59..8cd57df 100644 --- a/Source/ConformalDecals/Text/TextRenderer.cs +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -1,13 +1,15 @@ using System; -using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; -using UnityEngine.Rendering; +using UnityEngine.Events; namespace ConformalDecals.Text { [KSPAddon(KSPAddon.Startup.Instantly, true)] public class TextRenderer : MonoBehaviour { + public const TextureFormat TextTextureFormat = TextureFormat.RG16; + public const RenderTextureFormat TextRenderTextureFormat = RenderTextureFormat.R8; + public static TextRenderer Instance { get { if (!_instance._isSetup) { @@ -18,8 +20,8 @@ namespace ConformalDecals.Text { } } - public const TextureFormat TextTextureFormat = TextureFormat.RG16; - public const RenderTextureFormat TextRenderTextureFormat = RenderTextureFormat.R8; + [Serializable] + public class TextRenderEvent : UnityEvent { } private const string BlitShader = "ConformalDecals/Text Blit"; private const int MaxTextureSize = 4096; @@ -32,8 +34,30 @@ namespace ConformalDecals.Text { private TextMeshPro _tmp; private Material _blitMaterial; - private Dictionary _renderedTextures = new Dictionary(); - private Texture2D _lastTexture; // to reduce the number of Texture2D objects created and destroyed, keep the last one on hand + private readonly Dictionary _renderCache = new Dictionary(); + private readonly Queue _renderJobs = new Queue(); + + public TextRenderJob RenderText(DecalText text, UnityAction renderFinishedCallback) { + var job = new TextRenderJob(text, renderFinishedCallback); + _renderJobs.Enqueue(job); + return job; + } + + public TextRenderJob UpdateText(DecalText oldText, DecalText newText, UnityAction renderFinishedCallback) { + var job = new TextRenderJob(oldText, newText, renderFinishedCallback); + _renderJobs.Enqueue(job); + return job; + } + + public void UnregisterText(DecalText text) { + if (_renderCache.TryGetValue(text, out var renderedText)) { + renderedText.UserCount--; + if (renderedText.UserCount <= 0) { + _renderCache.Remove(text); + Destroy(renderedText.Texture); + } + } + } private void Start() { if (_instance != null) { @@ -45,6 +69,16 @@ namespace ConformalDecals.Text { DontDestroyOnLoad(gameObject); } + private void Update() { + TextRenderJob nextJob; + do { + if (_renderJobs.Count <= 0) return; + nextJob = _renderJobs.Dequeue(); + } while (nextJob.Needed); + + RunJob(nextJob); + } + private void Setup() { if (_isSetup) return; @@ -60,7 +94,47 @@ namespace ConformalDecals.Text { _isSetup = true; } - public void RenderText(DecalText text, out Texture2D texture, out Rect window) { + private void RunJob(TextRenderJob job) { + Debug.Log($"Starting Text Rendering Job. queue depth = {_renderJobs.Count}, cache size = {_renderCache.Count}"); + job.Start(); + + Texture2D texture = null; + if (job.OldText != null && _renderCache.TryGetValue(job.OldText, out var oldRender)) { + // old output still exists + + oldRender.UserCount--; + + if (oldRender.UserCount <= 0) { + // this is the only usage of this output, so we are free to re-render into the texture + Debug.Log("Render output is not shared with other users, so reusing texture and removing cache slot"); + + texture = oldRender.Texture; + _renderCache.Remove(job.OldText); + } + else { + // other things are using this render output, so decriment usercount, and we'll make a new entry instead + Debug.Log("Render output is shared with other users, so making new output"); + } + } + + // now that all old references are handled, begin rendering the new output + + if (_renderCache.TryGetValue(job.NewText, out var cachedRender)) { + Debug.Log("Using Cached Render Output"); + Debug.Log($"Finished Text Rendering Job. queue depth = {_renderJobs.Count}, cache size = {_renderCache.Count}"); + + cachedRender.UserCount++; + return; + } + + var output = RenderText(job.NewText, texture); + _renderCache.Add(job.NewText, output); + + job.Finish(output); + Debug.Log($"Finished Text Rendering Job. queue depth = {_renderJobs.Count}, cache size = {_renderCache.Count}"); + } + + public RenderedText RenderText(DecalText text, Texture2D texture) { // SETUP TMP OBJECT FOR RENDERING _tmp.text = text.FormattedText; _tmp.font = text.Font.FontAsset; @@ -108,20 +182,18 @@ namespace ConformalDecals.Text { float sizeRatio = Mathf.Min(textureSize.x / size.x, textureSize.y, size.y); // calculate where in the texture the used area actually is - window = new Rect { + var window = new Rect { size = size * sizeRatio, center = (Vector2) textureSize / 2 }; - // GET TEXTURE - if (_lastTexture != null) { - texture = _lastTexture; - texture.Resize(textureSize.x, textureSize.y, TextTextureFormat, false); - _lastTexture = null; - } - else { + // SETUP TEXTURE + if (texture == null) { texture = new Texture2D(textureSize.x, textureSize.y, TextTextureFormat, false); } + else if (texture.width != textureSize.x || texture.height != textureSize.y || texture.format != TextTextureFormat) { + texture.Resize(textureSize.x, textureSize.y, TextTextureFormat, false); + } // GENERATE PROJECTION MATRIX var halfSize = (Vector2) textureSize / PixelDensity / 2 / sizeRatio; @@ -147,6 +219,8 @@ namespace ConformalDecals.Text { // RELEASE RENDERTEX RenderTexture.ReleaseTemporary(renderTex); + + return new RenderedText(texture, window); } } } \ No newline at end of file