Para ahorrar memoria en mi aplicación, he decidido deshacerme de cualquier modelo 3D que escape a la vista de la cámara. Para hacer esto, utilicé un método que detecta si la cámara puede ver la posición del modelo (usando model.position ). El siguiente código está dentro de mi bucle animate .
const frustum = new THREE.Frustum(); const matrix = new THREE.Matrix4().multiplyMatrices(test.camera.projectionMatrix, test.camera.matrixWorldInverse); frustum.setFromProjectionMatrix(matrix); let earthContainerPos = { ...earthContainer.position }; //spread syntax removes reference to container position earthContainerPos.z += 10; //to ensure its only disposed once completely out of view (since .position is the center of the model) if (!frustum.containsPoint(earthContainerPos)) { //check if container in view of camera console.log('Out of view') earthContainer.dispose(); //dispose of the model - I thought .dispose would work since its being rendered by a webGL renderer (from the docs) but it didnt };El método funciona para detectar cuándo mi modelo está fuera de la vista, pero por alguna razón el método de eliminación de mi contenedor (que contiene 2 modelos 3D) no funciona. ¿Tengo que deshacerme de todo o hay un método de desecho más dinámico?
Detalles del modelo:
contenedortierra.dispose();
Si earthContainer es una instancia de Object3D , su código producirá un error de tiempo de ejecución. Los métodos dispose() solo existen para clases seleccionadas como BufferGeometry , Material , Texture o WebGLRenderTarget .
Además, no creo que su enfoque de llamar a dispose() cuando un objeto 3D se pierde de vista tenga sentido. El motor se asegura automáticamente de representar solo los objetos cuando están dentro de la vista frustum. Eso es más efectivo que lo que haces, ya que puede generar costosos efectos de ping-pong. Lo que significa que desasigna recursos que podrían asignarse nuevamente en los siguientes marcos. Y este ir y venir puede producir una sobrecarga notable. Por ejemplo, si llama a dispose() en un material, es posible que se elimine su sombreador respectivo. Si sabe que tiene que renderizar un objeto con este material nuevamente, se requiere una nueva compilación, lo cual es una operación costosa.
Le sugiero que solo llame a dispose() si su aplicación no requiere un recurso nuevamente. Más información sobre dispose() en la siguiente guía:
https://threejs.org/docs/index.html#manual/en/introduction/How-to-dispose-of-objects