Struct ElapsedQuery
pub struct ElapsedQuery { /* private fields */ }
dep_miniquad
only.Expand description
ElapsedQuery
is used to measure duration of GPU operations.
Usual timing/profiling methods are difficult apply to GPU workloads as draw calls are submitted
asynchronously effectively hiding execution time of individual operations from the user.
ElapsedQuery
allows to measure duration of individual rendering operations, as though the time
was measured on GPU rather than CPU side.
The query is created using ElapsedQuery::new()
function.
use miniquad::graphics::ElapsedQuery;
// initialization
let mut query = ElapsedQuery::new();
Measurement is performed by calling ElapsedQuery::begin_query()
and
ElapsedQuery::end_query()
query.begin_query();
// one or multiple calls to miniquad::GraphicsContext::draw()
query.end_query();
Retreival of measured duration is only possible at a later point in time. Often a frame or couple frames later. Measurement latency can especially be high on WASM/WebGL target.
// couple frames later:
if query.is_available() {
let duration_nanoseconds = query.get_result();
// use/display duration_nanoseconds
}
And during finalization:
// clean-up
query.delete();
It is only possible to measure single query at once.
On OpenGL/WebGL platforms implementation relies on EXT_disjoint_timer_query
extension.
Implementations§
§impl ElapsedQuery
impl ElapsedQuery
pub fn new() -> ElapsedQuery
pub fn begin_query(&mut self)
pub fn begin_query(&mut self)
Submit a beginning of elapsed-time query.
Only a single query can be measured at any moment in time.
Use ElapsedQuery::end_query()
to finish the query and
ElapsedQuery::get_result()
to read the result when rendering is complete.
The query can be used again after retriving the result.
Implemented as glBeginQuery(GL_TIME_ELAPSED, ...)
on OpenGL/WebGL platforms.
Use ElapsedQuery::is_supported()
to check if functionality is available and the method can be called.
pub fn end_query(&mut self)
pub fn end_query(&mut self)
Submit an end of elapsed-time query that can be read later when rendering is complete.
This function is usd in conjunction with ElapsedQuery::begin_query()
and
ElapsedQuery::get_result()
.
Implemented as glEndQuery(GL_TIME_ELAPSED)
on OpenGL/WebGL platforms.
pub fn get_result(&self) -> u64 ⓘ
pub fn get_result(&self) -> u64 ⓘ
Retreieve measured duration in nanonseconds.
Note that the result may be ready only couple frames later due to asynchronous nature of GPU
command submission. Use ElapsedQuery::is_available()
to check if the result is
available for retrieval.
Use ElapsedQuery::is_supported()
to check if functionality is available and the method can be called.
pub fn is_supported() -> bool
pub fn is_supported() -> bool
Reports whenever elapsed timer is supported and other methods can be invoked.
pub fn is_available(&self) -> bool
pub fn is_available(&self) -> bool
Reports whenever result of submitted query is available for retrieval with
ElapsedQuery::get_result()
.
Note that the result may be ready only couple frames later due to asynchrnous nature of GPU command submission.
Use ElapsedQuery::is_supported()
to check if functionality is available and the method can be called.
pub fn delete(&mut self)
pub fn delete(&mut self)
Delete query.
Note that the query is not deleted automatically when dropped.
Implemented as glDeleteQueries(...)
on OpenGL/WebGL platforms.
Trait Implementations§
§impl Clone for ElapsedQuery
impl Clone for ElapsedQuery
§fn clone(&self) -> ElapsedQuery
fn clone(&self) -> ElapsedQuery
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreimpl Copy for ElapsedQuery
Auto Trait Implementations§
impl Freeze for ElapsedQuery
impl RefUnwindSafe for ElapsedQuery
impl Send for ElapsedQuery
impl Sync for ElapsedQuery
impl Unpin for ElapsedQuery
impl UnwindSafe for ElapsedQuery
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> ByteSized for T
impl<T> ByteSized for T
Source§const BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Source§fn byte_align(&self) -> usize ⓘ
fn byte_align(&self) -> usize ⓘ
Source§fn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Source§impl<T, R> Chain<R> for Twhere
T: ?Sized,
impl<T, R> Chain<R> for Twhere
T: ?Sized,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> ExtAny for T
impl<T> ExtAny for T
Source§fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Source§impl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
Source§const NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Source§fn mem_align_of_val(&self) -> usize ⓘ
fn mem_align_of_val(&self) -> usize ⓘ
Source§fn mem_size_of_val(&self) -> usize ⓘ
fn mem_size_of_val(&self) -> usize ⓘ
Source§fn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true
if dropping values of this type matters. Read moreSource§fn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self
without running its destructor. Read moreSource§fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Source§unsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§fn mem_as_bytes(&self) -> &[u8] ⓘ
fn mem_as_bytes(&self) -> &[u8] ⓘ
unsafe_slice
only.§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Hook for T
impl<T> Hook for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out
indicating that a T
is niched.