#include "orkestra_metrik.hpp" #include #include namespace fiko { namespace { inline uint64_t ftU64(const FILETIME& ft) { return ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime; } } // namespace MetrikToplayici::~MetrikToplayici() { if (adapter_) ((IDXGIAdapter3*)adapter_)->Release(); } bool MetrikToplayici::topla(orkestra::NodeMetrikOzet& out) { bool okundu = false; // CPU — sistem geneli yüzde (idle payının tersi, delta üzerinden). FILETIME bosta, cekirdek, kullanici; if (GetSystemTimes(&bosta, &cekirdek, &kullanici)) { const uint64_t b = ftU64(bosta), c = ftU64(cekirdek), k = ftU64(kullanici); if (sonCekirdek_ | sonKullanici_) { const uint64_t toplamD = (c - sonCekirdek_) + (k - sonKullanici_); const uint64_t bostaD = b - sonBosta_; if (toplamD > 0) { const float mesgul = 100.f * (float)(toplamD - (bostaD < toplamD ? bostaD : toplamD)) / (float)toplamD; out.cpuYuzde = mesgul < 0.f ? 0.f : (mesgul > 100.f ? 100.f : mesgul); } } sonBosta_ = b; sonCekirdek_ = c; sonKullanici_ = k; okundu = true; } // RAM — kullanılan MB. MEMORYSTATUSEX ms{}; ms.dwLength = sizeof(ms); if (GlobalMemoryStatusEx(&ms)) { out.ramMB = (uint32_t)((ms.ullTotalPhys - ms.ullAvailPhys) >> 20); okundu = true; } // VRAM — DXGI yerel bellek kullanımı (adapter ilk çağrıda önbelleklenir). if (!adapterDenendi_) { adapterDenendi_ = true; IDXGIFactory1* fabrika = nullptr; if (SUCCEEDED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&fabrika))) { IDXGIAdapter1* a1 = nullptr; if (fabrika->EnumAdapters1(0, &a1) == S_OK) { IDXGIAdapter3* a3 = nullptr; if (SUCCEEDED(a1->QueryInterface(__uuidof(IDXGIAdapter3), (void**)&a3))) adapter_ = a3; a1->Release(); } fabrika->Release(); } } if (adapter_) { DXGI_QUERY_VIDEO_MEMORY_INFO vm{}; if (SUCCEEDED(((IDXGIAdapter3*)adapter_) ->QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &vm))) { out.vramMB = (uint32_t)(vm.CurrentUsage >> 20); okundu = true; } } // Disk — exe sürücüsünün boş alanı (GB). wchar_t exeYol[MAX_PATH] = {}; if (GetModuleFileNameW(nullptr, exeYol, MAX_PATH) > 2) { const wchar_t kok[4] = {exeYol[0], L':', L'\\', 0}; ULARGE_INTEGER bos{}; if (GetDiskFreeSpaceExW(kok, &bos, nullptr, nullptr)) { out.diskBosGB = (uint32_t)(bos.QuadPart >> 30); okundu = true; } } return okundu; } } // namespace fiko