fmod/studio/system/
profiling.rs

1// Copyright (c) 2024 Melody Madeline 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};
11use crate::{FmodResultExt, Result};
12
13#[cfg(doc)]
14use crate::studio::SystemBuilder;
15
16impl System {
17    /// Retrieves buffer usage information.
18    ///
19    /// Stall count and time values are cumulative. They can be reset by calling [`System::reset_buffer_usage`].
20    ///
21    /// Stalls due to the studio command queue overflowing can be avoided by setting a larger command queue size with [`SystemBuilder::settings`].
22    pub fn get_buffer_usage(&self) -> Result<BufferUsage> {
23        let mut usage = MaybeUninit::zeroed();
24        unsafe {
25            FMOD_Studio_System_GetBufferUsage(self.inner.as_ptr(), usage.as_mut_ptr())
26                .to_result()?;
27
28            let usage = usage.assume_init().into();
29            Ok(usage)
30        }
31    }
32
33    /// Resets memory buffer usage statistics.
34    ///
35    /// This function resets the buffer usage data tracked by the FMOD Studio System.
36    pub fn reset_buffer_usage(&self) -> Result<()> {
37        unsafe { FMOD_Studio_System_ResetBufferUsage(self.inner.as_ptr()).to_result() }
38    }
39
40    /// Retrieves the amount of CPU used for different parts of the Studio engine.
41    ///
42    /// For readability, the percentage values are smoothed to provide a more stable output.
43    pub fn get_cpu_usage(&self) -> Result<(CpuUsage, crate::CpuUsage)> {
44        let mut usage = MaybeUninit::zeroed();
45        let mut usage_core = MaybeUninit::zeroed();
46        unsafe {
47            FMOD_Studio_System_GetCPUUsage(
48                self.inner.as_ptr(),
49                usage.as_mut_ptr(),
50                usage_core.as_mut_ptr(),
51            )
52            .to_result()?;
53
54            let usage = usage.assume_init().into();
55            let usage_core = usage_core.assume_init().into();
56            Ok((usage, usage_core))
57        }
58    }
59
60    /// Retrieves memory usage statistics.
61    ///
62    /// The memory usage `sample_data` field for the system is the total size of non-streaming sample data currently loaded.
63    ///
64    /// Memory usage statistics are only available in logging builds, in release builds memoryusage will contain zero for all values after calling this function.
65    pub fn get_memory_usage(&self) -> Result<MemoryUsage> {
66        let mut usage = MaybeUninit::zeroed();
67        unsafe {
68            FMOD_Studio_System_GetMemoryUsage(self.inner.as_ptr(), usage.as_mut_ptr())
69                .to_result()?;
70
71            let usage = usage.assume_init().into();
72            Ok(usage)
73        }
74    }
75}