Domanda

In segnalazioni di errori da parte di alcuni che ho visto molto spesso seguente comportamento:. IDirect3DVertexBuffer9 :: Lock non riesce, il codice di errore restituito è D3DERR_NOTAVAILABLE

Una volta che questo accade, molto spesso (ma non sempre) è seguita da CreateTexture o CreateVertexBuffer guasto con D3DERR_OUTOFVIDEOMEMORY errore.

Quali sono le possibili cause di fallimento vertex buffer di blocco? Potrebbe spazio di indirizzi di memoria virtuale esaurita, o cosa?

È stato utile?

Soluzione

In base alla risposta DIRECTXDEV di Chuck Walbourn da Microsoft, oltre il "fuori di spazio di indirizzi" Un'altra causa potrebbe essere "fuori pool di pagina".

  

In alternativa, in Windows XP questo potrebbe indicare che hanno colpito i limiti della memoria del kernel di paging piscina. In genere questo accade quando si crea un sacco di risorse Direct3D (texture, ecc.)

Facciamo creare un sacco di risorse Direct3D.

Altri suggerimenti

Questo è quello che ho postato per DirectXDev:;)

  

Hai controllato la quantità di memoria   applicazione sta utilizzando? (Essere sicuri di   selezionare la colonna della memoria virtuale in   Task Manager!). La mia ipotesi è   di problemi di frammentazione di memoria   causando a, come lei suggerisce, corsa   di spazio di indirizzi.

     

Si potrebbe, tuttavia, essere un pilota bug ...

Il debug runtime fornire tutte le informazioni utili?

Modifica: L'unica altra cosa che posso pensare è che la memoria di apertura si è esaurita. Non so come funziona con PCIExpress ma su AGP si può impostare la dimensione di apertura. Non ho idea di come controllare se è pieno comunque. Ho il sospetto che l'errore che state vedendo sta segnalando che il suo pieno. State facendo un sacco di serrature con la bandiera Scarta? Se è così la sua possibile che questi stanno creando tonnellate di nuove assegnazioni in apertura e sta causando a corto di memoria di là. Si tratta di indovinare il lavoro puro però.

Mi piacerebbe indovinare che se questo sta accadendo solo con alcuni utenti sono quelli sulle macchine di fascia più bassa. Se le cose funzionano lentamente, poi si può finire con un sacco di dati nel buffer nel buffer dei comandi. Questo renderà il controllo lag e "potrebbe", a occhio e croce, portare al problema che si sta vedendo. Si consiglia di provare a fare che il comando tampone non viene mai troppo a lungo. Se assicurarsi il primo blocco di ogni frame viene fatto senza il flag scarto (cioè flag impostato a 0), allora ciò provocherà gasdotto di stallo finché il buffer vertex è stata emessa e portare il buffer posteriore comando in sincronia con voi. Ciò provoca un rallentamento del comando buffer non sarà in grado di appianare i picchi di frame rate facilmente ...

Comunque ... questo è solo una supposizione!

La questione sollevata circa la memoria è valido. Abbiamo bisogno di alcuni dettagli sulla chiamata di blocco () per essere sicuri, ma , per esempio, se è nel pool predefinito e se è dinamica (D3DLOCK_DISCARD flag passato), è ben possibile che il driver cerca di trovare un pezzo non utilizzata della memoria di ritorno (perché il doppio o triplo buffer internamente) e non riesce a causa, come si scopre se stessi subito dopo, la memoria video è esaurita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top