Laden...

GDI und DirectX Hybrid

Erstellt von userid11997 vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.166 Views
U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 15 Jahren
GDI und DirectX Hybrid

Moin,
wie kann ich trotz DirectX auf dasselbe Fenster zusätzlich mit der GDI zeichnen , ich baue nämlich ein Spiel und das wäre für die Minimap ganz genial , wenn ich diese als Image per DrawImage(...) auf das Device setzen könnte.

Ich Render in der Methode

protected ovveride onPaint(object sender,PaintEventArgs e)
{
Render(); //Render-Methode von DirectX
Draw(e); //Meine Methode für zeichen Operationen
this.Invalidate();
}

Nun ist es aber so , dass ich , wenn ich einfach e.Graphics.DrawImage(Image.FromFile(...),0,0);
aufrufe , das Image auf dem Fenster flackert wie ein Feuer in nem Kamin.
Wie kann ich das ganze Flackerfrei zeichnen?

1.002 Beiträge seit 2007
vor 15 Jahren

Hallo Pria,

Stichwort double buffering.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 15 Jahren

Ne , klappt nicht , dann flackert das DirectX-device ebenfalls mit.
So intelligent das zu probieren war ich ja auch schon.

Ich hab ne andere Lösung gefunden. Ich hab ein neues Form erstellt und als TopMost definiert , dannach habe ich es genau über meiner Rendering-Form angeordnet und als TransparenceKey die Farbe des Hintergrundes dieser Form definiert.Wenn ich nun auf diesem Form zeichne , was Flackerfrei funktioniert , da hier der DoubleBuffer wieder verwendet werden kann , wird das Image auf dem Transparenten Frame dargestellt und unter diesem wird auf meinem DX-Frame gerendert.
Klappt wunderbar und vor allem flüssig.

Ich gebe zu , dass es nicht die beste Lösung ist , aber durchaus eine funktionale.
Trotzdem danke an alle , die hier helfen wollten.

M
22 Beiträge seit 2006
vor 15 Jahren

Du könntest versuchen eine Textur zu erstellen und anschließend davon über die Surface an ein Graphics Objekt zu kommen - dann kannst du auf dieses Zeichnen, und es selbst wiederrum in DX zeichnen.

Bedingung: Die Texture muss nen passendes Texture-Format haben.

U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 15 Jahren

Ich denke ich belibe doch bei meiner Lösung , da brauch ich dann nicht wieder in meinem Quellcode rumpfuschen. Trotzdem danke.

I
1.739 Beiträge seit 2005
vor 15 Jahren
kleine Anmerkung

Mir ist da bei deinem Code etwas aufgefallen:

this.Invalidate();
in der onPaintmethode ist einfach nicht gut. Damit ruft sich die Paintmethode noch mal selbst auf.

1.130 Beiträge seit 2007
vor 15 Jahren

Statt der Textur kann man auch auf den backbuffer zeichnen: Costum GUI - auf dem Gerätekontext pinsel
allerdings muss dann bei jedem Rendern auch der Gdi-teil neu gezeichnet werden.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 15 Jahren

Das ist schon so recht wirksam , dass garantiert mir eine permanente Aktualität des Gerenderten , da sich die Geschwindigkeit an die FPS-Rate des Rechners anpasst.
(Bei mir zwischen 260 und 560)

S
54 Beiträge seit 2007
vor 15 Jahren

Also Invalidate an den falschen Stellen führt bei mir immer zu flackern. Grad vorhin wieder gehabt. In der onpaint methode wird es wohl dazu führen das diese direkt nochmal angeleiert wird, falls invalidate() , das element dieser on paint methode neu zeichnen lässt, wird es wohl ein endloser kreislauf und sich das ganze hochschaukeln bis zum anschlag und es eben dann flackert. Invalidate macht ja nur dann ein Sinn denke ich, wenn das Programm an der Stelle sonst kein Invalidate machen würde oder Invalidate eines bestimmten Bereiches oder Elements oder ohne Childs usw. Aber wenns nu nicht mehr flackert ist ja auch gut.