From e362198360acf6ad333d83f74fd23ee05b2eb896 Mon Sep 17 00:00:00 2001 From: HEIHUAa <112499486+HEIHUAa@users.noreply.github.com> Date: Thu, 13 Aug 2026 04:32:40 +0800 Subject: [PATCH 1/2] Memory --- .../backend/system/framerate/MemoryCounter.hx | 31 ++++++++++++++----- source/funkin/backend/utils/MemoryUtil.hx | 17 ++++++++++ source/funkin/backend/utils/native/Linux.hx | 20 ++++++++++++ source/funkin/backend/utils/native/Mac.hx | 14 +++++++++ source/funkin/backend/utils/native/Windows.hx | 13 ++++++++ 5 files changed, 88 insertions(+), 7 deletions(-) diff --git a/source/funkin/backend/system/framerate/MemoryCounter.hx b/source/funkin/backend/system/framerate/MemoryCounter.hx index 068399b512..0cb64606cf 100644 --- a/source/funkin/backend/system/framerate/MemoryCounter.hx +++ b/source/funkin/backend/system/framerate/MemoryCounter.hx @@ -8,8 +8,8 @@ class MemoryCounter extends Sprite { public var memoryText:TextField; public var memoryPeakText:TextField; - public var memory:Float = 0; - public var memoryPeak:Float = 0; + public var gcMemory:Float = 0; + public var processMemory:Float = 0; public function new() { super(); @@ -28,6 +28,9 @@ class MemoryCounter extends Sprite { addChild(label); } memoryPeakText.alpha = 0.5; + #if !(cpp && (windows || mac || linux)) + memoryPeakText.visible = false; + #end } public function reload() {} @@ -36,17 +39,31 @@ class MemoryCounter extends Sprite { if (alpha <= 0.05) return; super.__enterFrame(t); + #if (cpp && (windows || mac || linux)) + final gcMem = MemoryUtil.currentMemUsage(); + final osMem = MemoryUtil.currentProcessMemUsage(); + + if (gcMem == gcMemory && osMem == processMemory) { + updateLabelPosition(); + return; + } + + gcMemory = gcMem; + processMemory = osMem; + + memoryText.text = CoolUtil.getSizeString(gcMemory); + memoryPeakText.text = ' / ${CoolUtil.getSizeString(osMem)}'; + #else final mem = MemoryUtil.currentMemUsage(); - if (mem == memory) { + if (mem == gcMemory) { updateLabelPosition(); return; } - memory = mem; - if (memoryPeak < memory) memoryPeak = memory; - memoryText.text = CoolUtil.getSizeString(memory); - memoryPeakText.text = ' / ${CoolUtil.getSizeString(memoryPeak)}'; + gcMemory = mem; + memoryText.text = CoolUtil.getSizeString(mem); + #end updateLabelPosition(); } diff --git a/source/funkin/backend/utils/MemoryUtil.hx b/source/funkin/backend/utils/MemoryUtil.hx index 2de56184c1..87d75fdd15 100644 --- a/source/funkin/backend/utils/MemoryUtil.hx +++ b/source/funkin/backend/utils/MemoryUtil.hx @@ -119,6 +119,23 @@ final class MemoryUtil { #end } + /** + * Gets the current process memory usage (Working Set / RSS) from the OS. + * This is much more granular than Haxe GC memory and updates more frequently. + * Returns the value in bytes, matching what you see in Task Manager / Activity Monitor. + */ + public static inline function currentProcessMemUsage():Float { + #if (cpp && windows) + return funkin.backend.utils.native.Windows.getCurrentProcessMemory(); + #elseif (cpp && mac) + return funkin.backend.utils.native.Mac.getCurrentProcessMemory(); + #elseif (cpp && linux) + return funkin.backend.utils.native.Linux.getCurrentProcessMemory(); + #else + return currentMemUsage(); + #end + } + /** * Gets the memory type of the system. diff --git a/source/funkin/backend/utils/native/Linux.hx b/source/funkin/backend/utils/native/Linux.hx index 661c584267..001929d009 100644 --- a/source/funkin/backend/utils/native/Linux.hx +++ b/source/funkin/backend/utils/native/Linux.hx @@ -28,5 +28,25 @@ final class Linux { { return 0; } + + @:functionCode(' + FILE *status = fopen("/proc/self/status", "r"); + if (status == NULL) return 0.0; + + char line[256]; + while (fgets(line, sizeof(line), status)) { + long rss; + if (sscanf(line, "VmRSS: %ld kB", &rss) == 1) { + fclose(status); + return (double)(rss * 1024); // kB -> bytes + } + } + fclose(status); + return 0.0; + ') + public static function getCurrentProcessMemory():Float + { + return 0; + } } #end \ No newline at end of file diff --git a/source/funkin/backend/utils/native/Mac.hx b/source/funkin/backend/utils/native/Mac.hx index afd9d58981..86924dc2eb 100644 --- a/source/funkin/backend/utils/native/Mac.hx +++ b/source/funkin/backend/utils/native/Mac.hx @@ -5,6 +5,7 @@ import funkin.backend.utils.NativeAPI.CodeCursor; import openfl.ui.Mouse; @:headerInclude('sys/sysctl.h') +@:headerInclude('mach/mach.h') @:dox(hide) final class Mac { @@ -23,6 +24,19 @@ final class Mac return 0; } + @:functionCode(' + task_basic_info_data_t info; + mach_msg_type_number_t count = TASK_BASIC_INFO_COUNT; + if (task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &count) == KERN_SUCCESS) { + return (double)info.resident_size; + } + return 0.0; + ') + public static function getCurrentProcessMemory():Float + { + return 0; + } + public static function setMouseCursorIcon(icon:CodeCursor):Void { final valid:Bool = external.ExternalMac.setCursorIcon(icon.toInt(), null, 0, 0); diff --git a/source/funkin/backend/utils/native/Windows.hx b/source/funkin/backend/utils/native/Windows.hx index 545e34b62a..706eba21c2 100644 --- a/source/funkin/backend/utils/native/Windows.hx +++ b/source/funkin/backend/utils/native/Windows.hx @@ -27,6 +27,7 @@ import funkin.backend.utils.NativeAPI.MessageBoxIcon; #include #include #include +#include #define SAFE_RELEASE(punk) \\ if ((punk) != NULL) \\ @@ -267,5 +268,17 @@ final class Windows { { return 0; } + + @:functionCode(" + PROCESS_MEMORY_COUNTERS_EX pmc; + if (GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc))) { + return (double)pmc.WorkingSetSize; + } + return 0.0; + ") + public static function getCurrentProcessMemory():Float + { + return 0; + } } #end \ No newline at end of file From 58219ffd7ca2b052fe0b943109de0210122639b7 Mon Sep 17 00:00:00 2001 From: HEIHUAa <112499486+HEIHUAa@users.noreply.github.com> Date: Thu, 13 Aug 2026 04:40:44 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20MemoryCounter.hx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/system/framerate/MemoryCounter.hx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/funkin/backend/system/framerate/MemoryCounter.hx b/source/funkin/backend/system/framerate/MemoryCounter.hx index 0cb64606cf..9b429a5bba 100644 --- a/source/funkin/backend/system/framerate/MemoryCounter.hx +++ b/source/funkin/backend/system/framerate/MemoryCounter.hx @@ -8,8 +8,8 @@ class MemoryCounter extends Sprite { public var memoryText:TextField; public var memoryPeakText:TextField; - public var gcMemory:Float = 0; - public var processMemory:Float = 0; + public var memory:Float = 0; + public var memoryPeak:Float = 0; public function new() { super(); @@ -43,25 +43,25 @@ class MemoryCounter extends Sprite { final gcMem = MemoryUtil.currentMemUsage(); final osMem = MemoryUtil.currentProcessMemUsage(); - if (gcMem == gcMemory && osMem == processMemory) { + if (gcMem == memory && osMem == memoryPeak) { updateLabelPosition(); return; } - gcMemory = gcMem; - processMemory = osMem; + memory = gcMem; + memoryPeak = osMem; - memoryText.text = CoolUtil.getSizeString(gcMemory); + memoryText.text = CoolUtil.getSizeString(gcMem); memoryPeakText.text = ' / ${CoolUtil.getSizeString(osMem)}'; #else final mem = MemoryUtil.currentMemUsage(); - if (mem == gcMemory) { + if (mem == memory) { updateLabelPosition(); return; } - gcMemory = mem; + memory = mem; memoryText.text = CoolUtil.getSizeString(mem); #end