Optimize GC for log in gameplay scene.

This commit is contained in:
2023-02-12 21:50:57 +08:00
parent 87ef534f59
commit ee4399109a
2 changed files with 32 additions and 13 deletions

View File

@@ -47,10 +47,8 @@ namespace Cryville.Crtr {
bool started = false;
static bool initialized;
static Text logs;
TextMeshProUGUI logs;
TextMeshProUGUI status;
readonly TargetString statusstr = new TargetString();
readonly StringBuffer statusbuf = new StringBuffer();
static Vector2 screenSize;
public static Rect hitRect;
@@ -79,7 +77,7 @@ namespace Cryville.Crtr {
void Start() {
var logobj = GameObject.Find("Logs");
if (logobj != null)
logs = logobj.GetComponent<Text>();
logs = logobj.GetComponent<TextMeshProUGUI>();
if (!initialized) {
Game.Init();
GenericResources.LoadDefault();
@@ -222,8 +220,14 @@ namespace Cryville.Crtr {
}
}
}
readonly TargetString statusstr = new TargetString();
readonly StringBuffer statusbuf = new StringBuffer();
readonly TargetString logsstr = new TargetString();
readonly StringBuffer logsbuf = new StringBuffer();
readonly List<string> logEntries = new List<string>();
int logsLength = 0;
void LogUpdate() {
string _logs = logs.text;
logsbuf.Clear();
Game.MainLogger.Enumerate((level, module, msg) => {
string color;
switch (level) {
@@ -235,12 +239,25 @@ namespace Cryville.Crtr {
case 5: color = "#bb0000"; break;
default: color = "#ff00ff"; break;
}
_logs += string.Format(
"\r\n<color={1}bb><{2}> {3}</color>",
var l = string.Format(
"\n<color={1}bb><{2}> {3}</color>",
DateTime.UtcNow.ToString("s"), color, module, msg
);
logEntries.Add(l);
logsLength += l.Length;
});
logs.text = _logs.Substring(Mathf.Max(0, _logs.IndexOf('\n', Mathf.Max(0, _logs.Length - 4096))));
while (logsLength >= 4096) {
logsLength -= logEntries[0].Length;
logEntries.RemoveAt(0);
}
foreach (var l in logEntries) {
logsbuf.Append(l);
}
logsstr.Length = logsbuf.Count;
var larr = logsstr.TrustedAsArray();
logsbuf.CopyTo(0, larr, 0, logsbuf.Count);
logs.SetText(larr, 0, logsbuf.Count);
statusbuf.Clear();
statusbuf.AppendFormat(
"FPS: i{0:0} / s{1:0}\nSMem: {2:N0} / {3:N0}\nIMem: {4:N0} / {5:N0}",
@@ -281,9 +298,9 @@ namespace Cryville.Crtr {
}
}
statusstr.Length = statusbuf.Count;
var arr = statusstr.TrustedAsArray();
statusbuf.CopyTo(0, arr, 0, statusbuf.Count);
status.SetText(arr, 0, statusbuf.Count);
var sarr = statusstr.TrustedAsArray();
statusbuf.CopyTo(0, sarr, 0, statusbuf.Count);
status.SetText(sarr, 0, statusbuf.Count);
}
#endregion
@@ -313,7 +330,8 @@ namespace Cryville.Crtr {
bool logEnabled = true;
public void ToggleLogs() {
logs.text = "";
logEntries.Clear();
logsLength = 0;
status.SetText("");
logEnabled = !logEnabled;
}
@@ -450,7 +468,8 @@ namespace Cryville.Crtr {
timer.Stop();
Logger.Log("main", 1, "Load/Prehandle", "Prehandling done ({0}ms)", timer.Elapsed.TotalMilliseconds);
if (Settings.Default.ClearLogOnPlay) {
logs.text = "";
logEntries.Clear();
logsLength = 0;
Game.MainLogger.Enumerate((level, module, msg) => { });
}
Game.AudioSequencer.Playing = true;

Binary file not shown.