The camera half of the render-on-change decision: has the view that the
next render would draw changed since the last frame that was actually
rendered?
A view is the camera object itself (the ortho toggle swaps it), its world
matrix, its projection matrix and the drawing-buffer size (a resize or a
DPR step clears the canvas and changes every pixel). Those 34 numbers are
compared against the copy taken at the last render, in a preallocated
Float64Array — the check runs on every loop tick, so it allocates
nothing.
camera.updateMatrixWorld() runs before the read. The render calls it
anyway (and the per-frame depth-sort pass already does), so it changes no
pixel; without it a camera moved through position / quaternion since
the last render would still report the stale world matrix of that render.
The camera half of the render-on-change decision: has the view that the next render would draw changed since the last frame that was actually rendered?
A view is the camera object itself (the ortho toggle swaps it), its world matrix, its projection matrix and the drawing-buffer size (a resize or a DPR step clears the canvas and changes every pixel). Those 34 numbers are compared against the copy taken at the last render, in a preallocated
Float64Array— the check runs on every loop tick, so it allocates nothing.camera.updateMatrixWorld()runs before the read. The render calls it anyway (and the per-frame depth-sort pass already does), so it changes no pixel; without it a camera moved throughposition/quaternionsince the last render would still report the stale world matrix of that render.