Encontré una fuga en una aplicación Direct3D mía, y terminé corrigiéndola, pero creo que la causa de la fuga se debió a mi incomprensión de cómo Direct3D maneja su memoria e interfaces.¿Cómo funciona exactamente el manejo de la memoria (es decir, la función Release) con Direct3D?
no he sido capaz de encontrar un artículo/tutorial definitivo sobre el mismo (indique uno si tiene uno), pero por lo que he reunido, funciona como tal:
- Cada vez llama al método
Get
, se incrementa el número de referencias para el objeto devuelto. Entonces, si llamo alGetRenderTarget
, la superficie que se está procesando tiene su recuento de referencia incrementado. - Llamar a
Release
en la interfaz disminuye su número de referencia. Estos dos primeros puntos combinados significan esencialmente: cada vez que obtienes una interfaz, libérala una vez que hayas terminado con ella. - Cuando el recuento de referencias llega a 0, la instancia se elimina.
No estoy del todo seguro de si esto es correcto, pero parece funcionar en la práctica. Si alguien pudiera aclarar/confirmar cómo funciona, sería genial.
P.S, ¿hay alguna protección implementada en la liberación de interfaces? Llamar al Release
en cualquier número de veces en el búfer posterior no parece causar ningún daño (lo cual es bueno, pero no estoy seguro de por qué no lo hace).
Excelente respuesta, gracias. Nunca volvería a llamar a 'Release' más de una vez en la práctica, solo estaba preguntando por qué no se rompió el programa cuando estaba tratando de resolver esto y lo intenté. – Jengerer