diff --git a/source/funkin/backend/system/framerate/MemoryCounter.hx b/source/funkin/backend/system/framerate/MemoryCounter.hx index 068399b512..9b429a5bba 100644 --- a/source/funkin/backend/system/framerate/MemoryCounter.hx +++ b/source/funkin/backend/system/framerate/MemoryCounter.hx @@ -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,6 +39,21 @@ 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 == memory && osMem == memoryPeak) { + updateLabelPosition(); + return; + } + + memory = gcMem; + memoryPeak = osMem; + + memoryText.text = CoolUtil.getSizeString(gcMem); + memoryPeakText.text = ' / ${CoolUtil.getSizeString(osMem)}'; + #else final mem = MemoryUtil.currentMemUsage(); if (mem == memory) { @@ -44,9 +62,8 @@ class MemoryCounter extends Sprite { } memory = mem; - if (memoryPeak < memory) memoryPeak = memory; - memoryText.text = CoolUtil.getSizeString(memory); - memoryPeakText.text = ' / ${CoolUtil.getSizeString(memoryPeak)}'; + 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