@threlte/core
useStage
Tasks are part of Threlte’s Task Scheduling System. For details on how to use stages and tasks, see the scheduling tasks page.
The hook useStage
can be used to create or retrieve a stage.
Stages are groups of tasks. They are executed in a specific order.
Creating a Stage
useStage
will create a stage if it does not exist yet, or return the existing
stage if it does.
const { renderStage } = useThrelte()
// All tasks added to the stage `afterRenderStage`
// will be executed after the tasks of the stage `renderStage`.
const afterRenderStage = useStage('after-render', {
after: renderStage
})
Be aware that useStage
never removes a stage as that’s usually not needed. If a stage
is created once in your Threlte app, it’s available throughout the app’s lifetime. If
you want to remove a stage, you can do so by calling removeStage
on the scheduler instance
returned by useThrelte
.
A stage decides when and how its tasks are executed. By default, a stage will
execute its tasks on every frame. You can change this behavior by passing a
callback
option to useStage
. This callback will be called every frame. The
first argument delta
is the time elapsed since the last frame. The second
argument runTasks
is a function that when invoked will run all the tasks of
the stage in their respective order. You can use it to run the tasks only when
needed (e.g. when a condition is met) or to run them multiple times. If a number
is passed as the first argument to runTasks, the tasks will receive that as the
delta.
const { renderStage } = useThrelte()
const conditionalStage = useStage('after-render', {
after: renderStage,
callback: (delta, runTasks) => {
// This callback will be called every frame. The first argument is the time elapsed
// since the last frame. The second argument is a function that will run all the
// tasks of the stage. You can use it to run the tasks only when needed (e.g. when
// a condition is met) or to run them multiple times. If a number is passed as the
// first argument to runTasks, the tasks will receive that as the delta.
if (condition) {
runTasks()
}
}
})
Examples
Implement Performance Profiling
This component will implement
three-perf. It expects you to call a
function perf.begin()
before any frame callbacks are executed and perf.end()
after all frame callbacks have been executed, including rendering. Assuming our
app didn’t add any other stages, we add a stage that runs before Threlte’s
mainStage
(making it the
first stage) and another stage that runs after Threlte’s
renderStage
(making it
the last stage). We then call perf.begin()
in a task of the first stage and
perf.end()
in a task of the second stage.
<script>
import { useStage, useTask, useThrelte } from '@threlte/core'
import { ThreePerf } from 'three-perf'
const { renderer, mainStage, renderStage } = useThrelte()
const perf = new ThreePerf({
anchorX: 'left',
anchorY: 'top',
domElement: document.body,
renderer
})
const beforeMainStage = useStage('three-perf-begin', {
before: mainStage
})
useTask(() => {
perf.begin()
}, { stage: beforeMainStage })
const afterRenderStage = useStage('three-perf-end', {
after: renderStage
})
useTask(() => {
perf.end()
}, { stage: afterRenderStage })
</script>