demo: add performance demo

This commit is contained in:
mob-sakai
2022-06-14 13:39:13 +09:00
parent d9e7eb9732
commit 6b11e7c588
54 changed files with 17264 additions and 0 deletions

View File

@@ -0,0 +1,138 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Coffee.NanoMonitor{
public class FixedFont
{
private readonly UIVertex[] _tmpVerts = new UIVertex[4];
private static readonly Dictionary<Font, FixedFont> _fonts = new Dictionary<Font, FixedFont>();
private static readonly TextGenerator _textGenerator = new TextGenerator(100);
private static TextGenerationSettings _settings = new TextGenerationSettings
{
scaleFactor = 1,
horizontalOverflow = HorizontalWrapMode.Overflow,
verticalOverflow = VerticalWrapMode.Overflow,
alignByGeometry = true,
textAnchor = TextAnchor.MiddleCenter,
color = Color.white
};
private int _resolution = 0;
private readonly Font _font;
private UIVertex[] _verts;
private UICharInfo[] _charInfos;
private FixedFont(Font font)
{
_font = font;
}
public int fontSize => _font.dynamic ? 32 : _font.fontSize;
public static FixedFont GetOrCreate(Font font)
{
if (font == null) return null;
if (_fonts.TryGetValue(font, out var data)) return data;
data = new FixedFont(font);
_fonts.Add(font, data);
return data;
}
public void Invalidate()
{
_resolution = 0;
}
public void UpdateFont()
{
if (!_font) return;
var mat = _font.material;
if (!mat) return;
var tex = mat.mainTexture;
if (!tex) return;
var currentResolution = tex.width * tex.height;
if (_resolution == currentResolution) return;
_resolution = currentResolution;
_settings.font = _font;
_textGenerator.Invalidate();
_textGenerator.Populate("_!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", _settings);
_verts = _textGenerator.GetVerticesArray();
_charInfos = _textGenerator.GetCharactersArray();
float offsetX = 0;
for (var i = 0; i < _verts.Length; i++)
{
if ((i & 3) == 0)
offsetX = _verts[i].position.x;
var v = _verts[i];
v.position -= new Vector3(offsetX, 0);
_verts[i] = v;
}
}
public float Layout(char c, float offset, float scale)
{
if (_charInfos == null) return offset;
if (c < 0x20 || 0x7e < c) return offset;
var ci = c - 0x20;
return offset + _charInfos[ci].charWidth * scale;
}
public float Append(VertexHelper toFill, char c, float offset, float scale, Color color)
{
if (_verts == null || _charInfos == null) return offset;
if (c < 0x20 || 0x7e < c) return offset;
var ci = c - 0x20;
for (var i = 0; i < 4; i++)
{
_tmpVerts[i] = _verts[ci * 4 + i];
_tmpVerts[i].position = _tmpVerts[i].position * scale + new Vector3(offset, 0);
_tmpVerts[i].color = ci == 0 ? Color.clear : color;
}
toFill.AddUIVertexQuad(_tmpVerts);
return offset + _charInfos[ci].charWidth * scale;
}
public void Fill(VertexHelper toFill, Color color, RectTransform tr)
{
if (_verts == null || _charInfos == null) return;
const int ci = '*' - 0x20;
var uv = (_verts[ci * 4].uv0 + _verts[ci * 4 + 2].uv0) / 2;
var rect = tr.rect;
var size = rect.size / 2;
var offset = (new Vector2(0.5f, 0.5f) - tr.pivot) * rect.size;
for (var i = 0; i < 4; i++)
{
_tmpVerts[i] = new UIVertex();
_tmpVerts[i].uv0 = uv;
_tmpVerts[i].color = color;
if (i == 0)
_tmpVerts[i].position = new Vector2(-size.x, -size.y) + offset;
else if (i == 1)
_tmpVerts[i].position = new Vector2(-size.x, size.y) + offset;
else if (i == 2)
_tmpVerts[i].position = new Vector2(size.x, size.y) + offset;
else
_tmpVerts[i].position = new Vector2(size.x, -size.y) + offset;
}
toFill.AddUIVertexQuad(_tmpVerts);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 9a8c5c555d4bf4361ab3435c318c0699
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences:
- m_Material: {fileID: 2100000, guid: 4da4639f724144ddead57bffca64e71f, type: 3}
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,236 @@
using System.Text;
using UnityEngine;
using UnityEngine.UI;
namespace Coffee.NanoMonitor{
#if UNITY_EDITOR
using UnityEditor;
[CustomEditor(typeof(MonitorUI))]
public class MonitorTextEditor : Editor
{
private SerializedProperty m_Mode;
private SerializedProperty m_TextAnchor;
private SerializedProperty m_FontSize;
private SerializedProperty m_Font;
private SerializedProperty m_Text;
private SerializedProperty m_Color;
private void OnEnable()
{
m_Mode = serializedObject.FindProperty("m_Mode");
m_Text = serializedObject.FindProperty("m_Text");
m_Color = serializedObject.FindProperty("m_Color");
var fontData = serializedObject.FindProperty("m_FontData");
m_FontSize = fontData.FindPropertyRelative("m_FontSize");
m_Font = fontData.FindPropertyRelative("m_Font");
m_TextAnchor = serializedObject.FindProperty("m_TextAnchor");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(m_Mode);
if ((MonitorUI.Mode) m_Mode.intValue == MonitorUI.Mode.Text)
{
EditorGUILayout.PropertyField(m_Text);
EditorGUILayout.PropertyField(m_FontSize);
EditorGUILayout.PropertyField(m_TextAnchor);
//EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.PropertyField(m_Font);
//EditorGUI.EndDisabledGroup();
}
EditorGUILayout.PropertyField(m_Color);
serializedObject.ApplyModifiedProperties();
}
}
#endif
public class MonitorUI : Text
{
public enum Mode
{
Text,
Fill,
}
public enum TextAnchor
{
Left,
Center,
Right
}
//################################
// Serialize Members.
//################################
[SerializeField] private Mode m_Mode = Mode.Text;
[SerializeField] private TextAnchor m_TextAnchor;
//################################
// Public Members.
//################################
public override string text
{
get => m_StringBuilder.ToString();
set
{
m_Text = value;
if (m_StringBuilder.IsEqual(m_Text)) return;
m_StringBuilder.Length = 0;
m_StringBuilder.Append(m_Text);
SetVerticesDirty();
}
}
public TextAnchor textAnchor
{
get => m_TextAnchor;
set
{
if (m_TextAnchor == value) return;
m_TextAnchor = value;
SetVerticesDirty();
}
}
public override bool raycastTarget
{
get => m_Mode == Mode.Fill;
set { }
}
public void SetText(string format, double arg0 = 0, double arg1 = 0, double arg2 = 0, double arg3 = 0)
{
m_StringBuilder.Length = 0;
m_StringBuilder.AppendFormatNoAlloc(format, arg0, arg1, arg2, arg3);
SetVerticesDirty();
}
public void SetText(StringBuilder builder)
{
m_StringBuilder.Length = 0;
m_StringBuilder.Append(builder);
SetVerticesDirty();
}
//################################
// Private Members.
//################################
private readonly StringBuilder m_StringBuilder = new StringBuilder(64);
private void UpdateFont()
{
//var globalFont = NNanoMonitorttings.Instance.font;
//if (globalFont)
//{
// font = globalFont;
//}
var fontData = FixedFont.GetOrCreate(font);
if (fontData != null)
{
fontData.Invalidate();
fontData.UpdateFont();
}
}
//################################
// Unity Callbacks.
//################################
protected override void OnEnable()
{
//NaNanoMonitortings.Instance.onFontChanged += UpdateFont;
RegisterDirtyMaterialCallback(UpdateFont);
base.OnEnable();
raycastTarget = false;
maskable = false;
m_StringBuilder.Length = 0;
m_StringBuilder.Append(m_Text);
}
protected override void OnDisable()
{
//NanNanoMonitorings.Instance.onFontChanged -= UpdateFont;
UnregisterDirtyMaterialCallback(UpdateFont);
base.OnDisable();
}
#if UNITY_EDITOR
protected override void OnValidate()
{
base.OnValidate();
if (!m_StringBuilder.IsEqual(m_Text))
{
m_StringBuilder.Length = 0;
m_StringBuilder.Append(m_Text);
}
}
#endif
protected override void OnPopulateMesh(VertexHelper toFill)
{
toFill.Clear();
var fontData = FixedFont.GetOrCreate(font);
if (fontData == null) return;
fontData.UpdateFont();
if (m_Mode == Mode.Fill)
{
fontData.Fill(toFill, color, rectTransform);
return;
}
var scale = (float) fontSize / fontData.fontSize;
float offset = 0;
switch (textAnchor)
{
case TextAnchor.Left:
offset = rectTransform.rect.xMin;
break;
case TextAnchor.Center:
for (var i = 0; i < m_StringBuilder.Length; i++)
offset = fontData.Layout(m_StringBuilder[i], offset, scale);
offset = -offset / 2;
break;
case TextAnchor.Right:
for (var i = 0; i < m_StringBuilder.Length; i++)
offset = fontData.Layout(m_StringBuilder[i], offset, scale);
offset = rectTransform.rect.xMax - offset;
break;
}
for (var i = 0; i < m_StringBuilder.Length; i++)
{
offset = fontData.Append(toFill, m_StringBuilder[i], offset, scale, color);
}
}
protected override void UpdateMaterial()
{
base.UpdateMaterial();
var fontData = FixedFont.GetOrCreate(font);
if (fontData != null)
{
fontData.UpdateFont();
}
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: b0e08c6080a2e4d8186f97c60518830f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences:
- m_Material: {fileID: 2100000, guid: 4da4639f724144ddead57bffca64e71f, type: 3}
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: