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}