Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

119
Vistas
Desechar automáticamente los modelos 3D una vez fuera de la vista

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:

  • modelos GLTF
  • 2 modelos en el contenedor
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

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

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda