PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NotSupportedException bei schreiben in einem GraphicsStream (Managed Direct X)


XYT
2005-01-24, 19:01:05
Hi,
immer wenn ich die vom VertexBuffer in den Stream schreiben möchte
kommt die "NotSupportedException " Meldung.
Hier ist der Code:

m_VertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored),
counter, m_Device, Usage.None,
CustomVertex.TransformedColored.Format, Pool.Default);
GraphicsStream stream = m_VertexBuffer.Lock(0,0,0);
if(stream.CanWrite==true)
{
MessageBox.Show("Kann in den Stream schreiben");
}
try
{
stream.Write(verts);
MessageBox.Show("Daten in den Stream geschrieben");
}
// weiterer Code

Die Meldung das er in den Stream schreiben kann wird immer ausgeben, aber
die Meldung das sie tatsächlich geschriebe wurde erscheint nie.
Woran liegt das?

Demirug
2005-01-24, 19:21:17
Welche MDX Version benutzt du den genau?

XYT
2005-01-24, 19:44:51
Ich benutze die Version 9.0 C.

Demirug
2005-01-24, 19:55:32
Ich benutze die Version 9.0 C.

Das meine ich nicht. Bei MDX wird anders gezählt. Da gibt es im Prinzip mit jedem neuen SDK auch eine neue Version.

Ich frage weil ich einen Bug an der Stelle eigentlich gemeldet habe und er inzwischen beseitigt sein soll.

XYT
2005-01-24, 20:07:54
In dem Ordner "C:\WINDOWS\Microsoft.NET\Managed DirectX" ist der Ordner
v9.02.2904 , also müsste es die Version 9.02.2904 sein.

Demirug
2005-01-24, 20:14:54
In dem Ordner "C:\WINDOWS\Microsoft.NET\Managed DirectX" ist der Ordner
v9.02.2904 , also müsste es die Version 9.02.2904 sein.

Das könnte die aus dem Sommer SDK sein.

Versuche mal bei der Größe ("sizeToLock" ) anstelle von 0 die wirkliche Größe in Byte anzugeben. Das war der Workaround für den Bug.

XYT
2005-01-24, 22:03:26
Hi,
GraphicsStream stream = m_VertexBuffer.Lock(0,counter,LockFlags.None) ;

hat nichts geholfen.Gibt es noch andere Ursachen?

Demirug
2005-01-24, 22:19:35
Hi,
GraphicsStream stream = m_VertexBuffer.Lock(0,counter,LockFlags.None) ;

hat nichts geholfen.Gibt es noch andere Ursachen?

Der Bug ist in der Version die du hast auch entfernt. Gerade eben überprüft.

Der Code ist soweit dann eigentlich in Ordnung. Die Ursache muss also an einer anderen Stelle liegen.

Bei dem SDK liegt im Utilities Verzeichniss ein Programm namens dbmon.exe. Damit kann man sich Fehlermeldeungen der DX Debug Runtime anschauen. Diese aktiviert man über die DirectX Einstellungen in der Systemsteuerung.

Also am besten mal auf die Debug-Runtime umstellen. dbmon starten und dann dein Programm nochmal laufen lassen. In dem dbmon Fenster sollte dann mit etwas Glück der Grund für das Problem stehen.

XYT
2005-01-24, 22:54:40
Das Fenster zeigt mir an:

2428: Direct3D9: (INFO) :Direct3D9 Debug Runtime selected.
2428: D3D9 Helper: Enhanced D3DDebugging disabled; Application was not compiled
with D3D_DEBUG_INFO
2428: Direct3D9: (INFO) :======================= Hal HWVP device selected
2428:
2428: Direct3D9: (INFO) :HalDevice Driver Style 9
2428:
2428: Direct3D9: :BackBufferCount not specified, considered default 1
2428: Direct3D9: :DoneExclusiveMode
2428: Direct3D9: (WARN) :Vertexbuffer created with POOL_DEFAULT but WRITEONLY no
t set. Performance penalty could be severe.
2428: Direct3D9: :====> ENTER: DLLMAIN(037e36a0): Process Detach 0000097c, tid=0
0000b18
2428: Direct3D9: (INFO) :MemFini!
2428: Direct3D9: (ERROR) :Memory still allocated! Alloc count = 81
2428: Direct3D9: (ERROR) :Current Process (pid) = 0000097c
2428: Direct3D9: (ERROR) :Memory Address: 003442cc lAllocID=1 dwSize=000047f8, R
eturnAddr=037e34c8 (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 0034adcc lAllocID=9 dwSize=000014ac, R
eturnAddr=037dc2cb (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 0034c29c lAllocID=10 dwSize=00000008,
ReturnAddr=037dc36b (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 0034c2cc lAllocID=11 dwSize=00001140,
ReturnAddr=037e1741 (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 0034d5b4 lAllocID=20 dwSize=000006bc,
ReturnAddr=037ef3b3 (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 003494a4 lAllocID=22 dwSize=00001878,
ReturnAddr=037e45bd (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 003493fc lAllocID=24 dwSize=00000008,
ReturnAddr=037e46ee (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 03a40064 lAllocID=26 dwSize=00003508,
ReturnAddr=037e34c8 (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 0034dc94 lAllocID=27 dwSize=00000198,
ReturnAddr=037e34c8 (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 0034de54 lAllocID=28 dwSize=00000030,
ReturnAddr=037e34c8 (pid=0000097c)
2428: Direct3D9: (ERROR) :Memory Address: 03a43594 lAllocID=29 dwSize=00001020,
ReturnAddr=037e34c8 (pid=0000097c)
2428: Direct3D9: (ERROR) :Total Memory Unfreed From Current Process = 54296 byte
s
2428: Direct3D9: :====> EXIT: DLLMAIN(037e36a0): Process Detach 0000097c

Demirug
2005-01-24, 23:14:32
OK, demanch liegt es nicht an DirectX selbst. Von welchem Datentype ist den die Variable "verts"?

XYT
2005-01-25, 16:35:36
"Verts" ist ein "CustomVertex.TransformedColored" Array

XYT
2005-01-25, 18:56:59
There is not enough room in this stream to write this data.

verts = new CustomVertex.TransformedColored[maxwidth*maxheight*20];

Der Array hat aktuell eine Anzahl von 300*321*20=1926000 Elementen.
Wieviel kann den ein Stream nur aufnehmen?

Demirug
2005-01-25, 21:17:51
Die Grösse sollte kein Problem sein auch wenn man das ganze später nicht auf einmal rendern kann. Allerdings habe ich einen anderen Verdacht.

Welchen Wert hat den die Variable counter beim erzeugen des Vertexbuffers?

XYT
2005-01-26, 07:26:24
Counter hat den Wert 558158 und Verts hat den Wert 1553440 Elemente.
Ich habs jetzt mal mit:


m_VertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored),
verts.Length, m_Device, Usage.None,
CustomVertex.TransformedColored.Format, Pool.Default);

versucht aber es klappt immer noch nicht.

Demirug
2005-01-26, 07:52:43
Counter hat den Wert 558158 und Verts hat den Wert 1553440 Elemente.
Ich habs jetzt mal mit:


m_VertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored),
verts.Length, m_Device, Usage.None,
CustomVertex.TransformedColored.Format, Pool.Default);

versucht aber es klappt immer noch nicht.

Das kann nicht funktionieren da der Vertexbuffer viel zu klein für die Datenmenge ist.

So müsste es gehen:

m_VertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored),
verts.Length*CustomVertex.TransformedColored.StrideSize, m_Device, Usage.None,
CustomVertex.TransformedColored.Format, Pool.Default);

XYT
2005-01-26, 17:02:15
Vielen Dank Demirug jetzt funktioniert es wie soll.