Skip to content

Releases: Matteo842/EasyFPS

1.4

Choose a tag to compare

@Matteo842 Matteo842 released this 08 Sep 01:56

What's Changed

🎯 Overlay Stability & Improvements

  • Fixed overlay width jitter (#2): The overlay now maintains a stable 3-digit baseline width for FPS and 1% low metrics. The widget no longer shrinks, expands, or jumps horizontally on screen when framerates fluctuate around the 100 FPS boundary (e.g., between 90 and 110 FPS). Higher framerates ($\ge 1000$ FPS) are still dynamically accommodated so numbers are never cut off.
  • Modernized Windows API bindings: Upgraded the windows-rs dependencies to 0.62 and updated Win32 GDI/DWM calls for improved stability and compatibility with the latest Windows updates.
  • Test suite coverage: Added automated unit tests to verify overlay dimension stability across framerate fluctuations and scaling settings.

#2

1.3

1.3

Choose a tag to compare

@Matteo842 Matteo842 released this 15 Jun 01:20

EasyFPS v1.3.0

This release introduces significant performance optimizations—headlined by a new responsive sliding-window FPS counter—native multi-monitor support, overhauled system resource management, and a robust CI/CD and testing suite.


🚀 Performance & Responsiveness

  • Sliding-Window FPS Computation (New): Replaced whole-buffer averaging with a short, configurable time window (FPS_WINDOW_MS = 500ms). The engine now walks backward through recent samples, accumulating frame times until the window is met. This makes the FPS counter drastically faster and highly responsive to real-time framerate fluctuations.
  • Near-Zero Idle CPU Usage: Replaced the sleep(2ms) busy-loop with MsgWaitForMultipleObjectsEx. When idle, CPU consumption drops close to 0% while still maintaining a smooth ~60Hz refresh rate.
  • Event-Driven Overlay Thread: Refactored the overlay thread to block natively on GetMessageW instead of continuously polling the system every 16ms.
  • GDI Font Caching: Fonts are now cached and only recreated when the overlay size changes, rather than being allocated and destroyed on every single WM_PAINT cycle. Enabled CLEARTYPE_QUALITY for much crisper text rendering.
  • Smart Redrawing: The overlay now updates and redraws only when the displayed values actually change, using a lightweight, comparable RenderSignature.
  • Optimized 1% Low Calculation: Upgraded the 1% low algorithmic logic to use select_nth_unstable_by, bringing the performance complexity down to $O(n)$ compared to a full buffer sort.
  • Smart Resource Releasing: PresentMon is now automatically stopped after ~2 seconds if no game is detected in the foreground, completely freeing up system resources.

🖥️ Multi-Monitor Support

  • Dynamic Monitor Positioning: Fullscreen detection and overlay positioning are now bound to the actual monitor where the active window resides (MonitorFromWindow + GetMonitorInfoW), removing the restriction that forced the overlay onto the primary display only.

🛡️ Robustness & Stability

  • Resilient FPS Capture: The reader thread no longer crashes upon encountering a single read error.
  • Cross-Version PresentMon Tolerance: Enhanced column parsing to be fully tolerant across different PresentMon versions (safely handles both MsBetweenPresents and msBetweenPresents).
  • Native Registry Management: Refactored the Windows startup registry handling to use native Win32 APIs (RegOpenKeyExW, RegSetValueExW, RegDeleteValueW) instead of spawning an external reg subprocess.
  • Opt-in Debug Logging: Switched to an opt-in logging system via the EASYFPS_DEBUG environment variable, preventing the old debug.log file from growing indefinitely.

🛠️ Code Quality, Testing & CI/CD

  • Expanded Test Suite: Added 14 unit tests covering core engine logic, including FPS window tracking, 1% low sample ordering/calculations, header parsing, fullscreen heuristics, settings serialization, colors, and dimensions.
  • Automated CI Workflow: Integrated a GitHub Actions workflow that automatically runs cargo fmt --check, clippy -D warnings, executes tests, and builds release binaries.
  • Codebase Cleanup: Fully translated all Italian code comments to English, resolved outstanding Clippy lints, and introduced clean type aliases for callback functions.
  • Documented Constants: Added comprehensive documentation for internal architecture constants including MAX_SAMPLES and FPS_WINDOW_MS.

⚠️ Note for Developers / Contributors

  • build.rs & Admin Privileges Fix: The Administrator manifest is now embedded only in release builds. This allows cargo test to execute test binaries locally without requiring elevated privileges, resolving the dreaded Windows Error 740.
  • If you need to force elevation during a debug build, you can use the new override flag: EASYFPS_FORCE_MANIFEST=1.
  • Testing Live Data: Because debug builds no longer request admin rights by default, you must run your IDE/terminal as Administrator or compile in --release if you want to test the overlay with live, real-time game capture data.

Contributors

@kRVRKV

1.2

1.2

Choose a tag to compare

@Matteo842 Matteo842 released this 06 May 23:30

v1.2

🐛 Bug Fixes

  • Fixed overlay content being cut off when only FPS is displayed without additional metrics. The overlay width is now fully content-driven instead of being clamped to a fixed size. (#1)
  • Fixed unnecessary bottom padding in the overlay. Height is now calculated precisely from the number of visible lines plus minimal padding, eliminating the dead space below the last metric.
  • Fixed overlay appearing on non-game fullscreen applications such as Windows Explorer, browsers (Chrome, Edge, Firefox), Settings, and other desktop apps. A curated exclusion list of ~25 common non-game processes is now checked before showing the overlay. (#1)

🌐 Localization

  • Unified all UI text to English. The system tray menu ("Impostazioni" → "Settings", "Esci" → "Exit"), tooltip, settings window title, and all error messages are now consistently in English. (#1)

⚡ Performance

  • Optimized GDI font handling in the overlay renderer. The font is now created once per paint cycle and reused across all stat lines, instead of being allocated and destroyed for each individual line.
  • Removed unused ferrisetw dependency, reducing binary size and compile time.

🔧 Code Quality

  • Eliminated unsafe static mut for the tray icon storage. Replaced with a safe Mutex-wrapped newtype pattern (TrayIconHolder) with documented safety invariants.
  • Added Drop implementation for SystemMonitor to automatically release PDH query handles, preventing potential resource leaks on shutdown.
  • Improved debug logging with human-readable timestamps (HH:MM:SS) instead of raw Unix epoch seconds.
  • Deduplicated overlay dimension logic — width and height are now computed in a single calculate_dimensions() function used by both the window positioning and painting code.

1.1

1.1

Choose a tag to compare

@Matteo842 Matteo842 released this 11 Dec 07:58

CPU and GPU usage
Cleaner overlay
immagine

1.0

1.0

Choose a tag to compare

@Matteo842 Matteo842 released this 10 Dec 11:48

First public realase
EasyFPS-commercial