fmod/studio/system/
profiling.rs

1// Copyright (c) 2024 Lily Lyons
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
7use fmod_sys::*;
8use std::mem::MaybeUninit;
9
10use crate::studio::{BufferUsage, CpuUsage, MemoryUsage, System};
11
12impl System {
13    /// Retrieves buffer usage information.
14    ///
15    /// Stall count and time values are cumulative. They can be reset by calling [`System::reset_buffer_usage`].
16    ///
17    /// Stalls due to the studio command queue overflowing can be avoided by setting a larger command queue size with [`SystemBuilder::settings`].
18    pub fn get_buffer_usage(&self) -> Result<BufferUsage> {
19        let mut usage = MaybeUninit::zeroed();
20        unsafe {
21            FMOD_Studio_System_GetBufferUsage(self.inner, usage.as_mut_ptr()).to_result()?;
22
23            let usage = usage.assume_init().into();
24            Ok(usage)
25        }
26    }
27
28    /// Resets memory buffer usage statistics.
29    ///
30    /// This function resets the buffer usage data tracked by the FMOD Studio System.
31    pub fn reset_buffer_usage(&self) -> Result<()> {
32        unsafe { FMOD_Studio_System_ResetBufferUsage(self.inner).to_result() }
33    }
34
35    /// Retrieves the amount of CPU used for different parts of the Studio engine.
36    ///
37    /// For readability, the percentage values are smoothed to provide a more stable output.
38    pub fn get_cpu_usage(&self) -> Result<(CpuUsage, crate::CpuUsage)> {
39        let mut usage = MaybeUninit::zeroed();
40        let mut usage_core = MaybeUninit::zeroed();
41        unsafe {
42            FMOD_Studio_System_GetCPUUsage(self.inner, usage.as_mut_ptr(), usage_core.as_mut_ptr())
43                .to_result()?;
44
45            let usage = usage.assume_init().into();
46            let usage_core = usage_core.assume_init().into();
47            Ok((usage, usage_core))
48        }
49    }
50
51    /// Retrieves memory usage statistics.
52    ///
53    /// The memory usage `sample_data` field for the system is the total size of non-streaming sample data currently loaded.
54    ///
55    /// Memory usage statistics are only available in logging builds, in release builds memoryusage will contain zero for all values after calling this function.
56    pub fn get_memory_usage(&self) -> Result<MemoryUsage> {
57        let mut usage = MaybeUninit::zeroed();
58        unsafe {
59            FMOD_Studio_System_GetMemoryUsage(self.inner, usage.as_mut_ptr()).to_result()?;
60
61            let usage = usage.assume_init().into();
62            Ok(usage)
63        }
64    }
65}