PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : managed DirectX: Access Violation bei SetTexture() bei window Resize


Elemental
2007-03-18, 19:16:01
Hallo,
ich spiel gerade mit den Beispielen von Tom Miller's Bch zu managed direct x 9.
Jetzt hab ich beim ersten Beispiel für Texturen, wo sich drehende Würfel mit Texturen gezeichnet werden, eine Exception, die ich nicht verstehe.


protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
device.Clear(ClearFlags.Target, Color.CornflowerBlue, 1.0f, 0);

SetupCamera();

device.BeginScene();
device.VertexFormat = CustomVertex.PositionTextured.Format;
device.SetStreamSource(0, vb, 0);

// Draw our boxes
DrawBox(angle / (float)Math.PI, angle / (float)Math.PI * 2.0f, angle / (float)Math.PI / 4.0f, 0.0f, 0.0f, 0.0f, tex);
DrawBox(angle / (float)Math.PI, angle / (float)Math.PI / 2.0f, angle / (float)Math.PI * 4.0f, 5.0f, 0.0f, 0.0f, tex1);
DrawBox(angle / (float)Math.PI, angle / (float)Math.PI * 4.0f, angle / (float)Math.PI / 2.0f, -5.0f, 0.0f, 0.0f, tex2);

DrawBox(angle / (float)Math.PI, angle / (float)Math.PI * 2.0f, angle / (float)Math.PI / 4.0f, 0.0f, -5.0f, 0.0f, tex1);
DrawBox(angle / (float)Math.PI, angle / (float)Math.PI / 2.0f, angle / (float)Math.PI * 4.0f, 5.0f, -5.0f, 0.0f, tex2);
DrawBox(angle / (float)Math.PI, angle / (float)Math.PI * 4.0f, angle / (float)Math.PI / 2.0f, -5.0f, -5.0f, 0.0f, tex);

DrawBox(angle / (float)Math.PI, angle / (float)Math.PI * 2.0f, angle / (float)Math.PI / 4.0f, 0.0f, 5.0f, 0.0f, tex2);
DrawBox(angle / (float)Math.PI, angle / (float)Math.PI / 2.0f, angle / (float)Math.PI * 4.0f, 5.0f, 5.0f, 0.0f, tex);
DrawBox(angle / (float)Math.PI, angle / (float)Math.PI * 4.0f, angle / (float)Math.PI / 2.0f, -5.0f, 5.0f, 0.0f, tex1);

device.EndScene();

device.Present();

this.Invalidate();
}

private void DrawBox(float yaw, float pitch, float roll, float x, float y, float z, Texture t)
{
angle += 0.01f;

device.Transform.World = Matrix.RotationYawPitchRoll(yaw, pitch, roll) * Matrix.Translation(x, y, z);
device.SetTexture(0, t);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 12);
}


Wenn man das Form, in dem die Anwendung läuft, resized, dass kommt eine Exception beim Aufruf von SetTexture():
"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

Wenn ich SetTexture() auskommentiere gehts wunderbar :confused:

Ich weiss, dass das device geresettet wird beim resize, aber hat das mit dem Problem hier was zu tun?

mfG

Demirug
2007-03-18, 19:22:23
Wahrscheinlich. Ich kenne das Beispiel aus dem Buch leider nicht. Kannst du mal die Zeile mit der die Textur erzeugt wurde posten?

Elemental
2007-03-18, 19:25:19
public void InitializeGraphics()
{
// Set our presentation parameters
PresentParameters presentParams = new PresentParameters();

presentParams.Windowed = true;
presentParams.SwapEffect = SwapEffect.Discard;

// Create our device
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);

vb = new VertexBuffer(typeof(CustomVertex.PositionTextured), 36, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default);
vb.Created += new EventHandler(this.OnVertexBufferCreate);
OnVertexBufferCreate(vb, null);

tex = new Texture(device, new Bitmap(this.GetType(), "puck.bmp"), Usage.Dynamic, Pool.Default);
tex1 = new Texture(device, new Bitmap(this.GetType(), "banana.bmp"), Usage.Dynamic, Pool.Default);
tex2 = new Texture(device, new Bitmap(this.GetType(), "ground.bmp"), Usage.Dynamic, Pool.Default);
}


Ok, ich habs gecheckt. Beim device.Reset() werden auch die Texturen disposed.
Jetzt erzeuge ich beim Event "DeviceReset" die Texturen neu. Aber die Performance ist ja echt grottig...
Na mal schauen; im nächsten Kapitel kommen Index-Buffers. Vielleicht wirds dann besser.

mfG

Demirug
2007-03-18, 19:26:38
Ok, ich habs gecheckt. Beim device.Reset() werden auch die Texturen disposed.
Jetzt erzeuge ich beim Event "DeviceReset" die Texturen neu. Aber die Performance ist ja echt grottig...
Na mal schauen; im nächsten Kapitel kommen Index-Buffers. Vielleicht wirds dann besser.

mfG

Die Texturen sollten aber nur dann disposed werden wenn sie im Default pool erzeugt wurden.

PS: Du bist dir bewusst das managed DX eigentlich Tod ist?

Elemental
2007-03-18, 19:37:13
PS: Du bist dir bewusst das managed DX eigentlich Tod ist?

Wieso denn?

Demirug
2007-03-18, 19:44:11
Wieso denn?

Weil die Weiterentwicklung zugunsten des XNA Frameworks eingestellt wurde. Support wird zwar weiterhin geleistet aber man darf halt nicht mehr auf Erweiterungen hoffen. So wird definitive keine .Net 2.0 und auch keine 64 Bit Version mehr kommen.

Elemental
2007-03-18, 19:52:52
Mist, hab das Buch schon paar Jahre hier rumliegen...

Elemental
2007-03-19, 07:01:17
Ist das das XNA Framework einfach ein umbenanntes "Managed Direct X" ?

mfG

edit:
Ich ziehe die Frage zurück ;)


http://msdn2.microsoft.com/en-us/xna/aa937793.aspx

Managed DirectX

Q: Is the XNA Framework different from Managed DirectX (MDX)?
A: Yes. The XNA Framework is a completely different set of technologies targeted at game developers. It does share similarities based on the fact that the underlying technologies are still based on DirectX. The XNA Framework also leverages other technologies such as XACT and X/Input.

Q: Will there be any more improvements to Managed DirectX 2.0?
A: The Managed DirectX 2.0 beta libraries were declared deprecated in April 2006, and expired on October 5th, 2006. If you have an enterprise application that was materially impacted by this expiration, please send email to xna@microsoft.com .

Q: Does the XNA Framework replace Managed DirectX?
A: The XNA Framework has a managed API for working with hardware on the Xbox 360 and Windows. This API subsumes much of the functionality that previously existed in the MDX 2.0 beta.

Q: Does MDX 1.1 support development with the .NET Framework 2.0?
A: MDX1.1 is fully compatible with the .NET Framework 2.0.

Q: What does this all mean regarding Managed DirectX (MDX) 1.1?
A: MDX 1.1 is in sustained engineering mode, and will not have any new functionality added to it. If you have a gaming scenario that needs a specific feature found only in MDX 1.1, please let us know and we will consider it for the XNA Framework.

Q: Will my MDX 1.1 code run inside the XNA Framework?
A: Please refer to this migration guide that describes how to migrate MDX 1.1 code to the XNA Framework.

Q: I’m a game studio and I have made a significant tools investment on MDX 1.1, does this mean Microsoft will not support MDX 1.1 anymore?
A: Microsoft will continue to support MDX 1.1 as per our standard support policy. Once the XNA Framework ships we will provide guidance on how to move from MDX 1.1 to the XNA Framework