Position vom BackBuffer im Speicher

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

ChristianK

Betreff: Position vom BackBuffer im Speicher

BeitragDi, März 18, 2008 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit BackBuffer( ) bekommt man ja bekanntlich das Handle zum BackBuffer ( = Position im Speicher ).

Allerdings muss ich den BackBuffer eindeutig identifizieren können, deshalb dachte ich mir, man könnte den Abstand vom Programmbeginn zum BackBuffer ermitteln.
In etwa so: backbuffer = programm_adresse + 123
So könnte man die relative Position des BackBuffers bekommen, nämlich immer 123 Bytes vom Programmstart.

Die Frage ist nur, wie man an die Adresse des Programms kommt, oder ob man besser eine andere Adresse als Anhaltspunkt verwenden sollte.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Dreamora

BeitragDi, März 18, 2008 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
da hat es 2 ziemlich gravierende Fehler in der Überlegung:

1. Ist das nur das Mapping des Backbuffers in den System RAM, nicht der Backbuffer selbst. Der ist nämlich im VRAM wozu du keine Pointer erhälst. Das heisst die Adresse muss nicht zwingend immer gleich bleiben.
2. Kann ein System mehr als einen Backbuffer haben (flipchain), womit das ganze noch brüchiger wird.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

ChristianK

BeitragDi, März 18, 2008 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das, was BackBuffer( ) zurück gibt ( = Zeiger auf eine Struktur ), existiert sowieso nie im VRAM, sondern nur ein Teil davon.

Code: [AUSKLAPPEN]
-> BackBuffer-Handle ( RAM )
          -> Daten ( RAM )
          -> ...
          -> DirectDraw Surface = "richtiger" BackBuffer ( VRAM )

Das Handle zu dieser Struktur ist sicher, das steht fest. Hab ich auch schon getestet. Smile

Zu 2.: Blitz3D hat soweit ich weiss immer nur einen BackBuffer.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Dreamora

BeitragDi, März 18, 2008 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
1. der Backbuffer ist immer zu 100% im VRAM, was du ausliest ist nur ein replica davon. Backbuffer im System RAM würde heissen 50%+ performance verlust da datadownload von GPU extrem langsam ist!

2. Nö tut es nicht und das kann ich dir garantieren und die ganzen Anfänger die meinten, das wenn man was in den backbuffer zeichnet, 2x flip macht, es wieder da sein würde auch Smile
B3D kann jedoch nicht steuern wieviele Buffer es hat, das stimmt. Das kannst du nur via Treiber. 3 sind heute eigentlich normal. Blitz rendert nur net ewig voraus bzw. kickt de hinteren buffer immer wieder weil es sonst hässliche mauslag probleme gibt wie sie B3D als auch BM mehrfach ja hatten
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

ChristianK

BeitragDi, März 18, 2008 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Dass der Backbuffer im VRAM liegt, ist schon klar. Aber BackBuffer( ) beschreibt nicht den Backbuffer, in den gerendert wird und auch kein Replika, sondern Daten im RAM, die wiederum den echten Backbuffer enthalten.

2. Wie viele Buffer in Wirklichkeit existieren, dürfte doch eigentlich keine Rolle spielen, solange Blitz nur 2 ( Front und Back ) erstellt -> die Positionen im Speicher werden nicht durcheinander gebracht.

Was der Treiber macht, ist mir ziemlich egal, solange ich die Position vom BackBuffer bekomme. Smile
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Dreamora

BeitragDi, März 18, 2008 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Wie gesagt, es gibt keinen "echten" Backbuffer im RAM. Der Backbuffer sind die Daten die nach dem Wechsel der Flipchain Position auf dem Bildschirm zu sehen sein werden und die sind per definition auf der Grafikkarte -> VRAM, nicht im RAM. DX repliziert jedoch die daten wenn du dynamische Texturen nimmst, damit Lookups nicht zu lange dauern.

2. Darüber hat Blitz keinerlei kontrolle. Es requested den Buffer und Requested den Wechsel in der Flipchain, das wars. Des kann die maximalanzahl buffer nicht setzen, das ist DX9.
Deswegen versagen auch alle die Codes die davon ausgehen das es nur 2 Buffer sind denn ausser auf Intel Onboard und anderen extrem langsamen Karten ist dies ganz einfach nicht der Fall. Auf meiner 8800GTS sind es 3 weil ich TrippleBuffering enforced habe, sonst könnten es bis 8 sein
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

ChristianK

BeitragDi, März 18, 2008 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, du hast nicht ganz verstanden, was ich meine. Smile
Ich versuch's mal anders auszudrücken.

1. Mit BackBuffer( ) -> der Blitz-Funktion und Backbuffer -> der Speicherbereich im VRAM meine ich zwei verschiedene Dinge. Die Daten, die sich im VRAM befinden, interessieren mich nicht. Ich will den Wert, den die Funktion BackBuffer( ) zurückgibt, bekommen, ohne die Funktion aufzurufen. Oder genauer gesagt, einen Offset vom Programmstart ( ? ) bis zum BackBuffer( ).

2. Auch in DirectDraw(7) hat man Kontrolle über Front- und Backbuffer. Sogar mehr als in DirectX 9, wenn man die GDI-Kompatibilität und so weiter beachtet. Man erstellt zwei Surfaces, bemalt eines von beiden und flippt sie dann. Was der Grafikkarten-Treiber daraus letzendlich macht, sollte egal sein, weil ich sowieso nicht auf den VRAM zugreifen will / kann.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Dreamora

BeitragDi, März 18, 2008 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Einmal wirst du das sowieso aufrufen, von daher ...
Allerdings bin ich mir nicht sicher das der Wert konstant bleibt. Der Ort im RAM wo der Backbuffer zu finden sein wird, wird ja von DX gemanaged, nicht von Blitz.

2. DirectDraw ist dummerweise rein 2d. Ich bin eigentlich davon ausgegangen, das du wirkliche hardware meintest (da du ja backbuffer sagtest, 2D hat keinen backbuffer nur nen offscreen zeichenbereich), was nur mit Graphics3D der fall ist denn DirectDraw läuft nicht auf der grafikkarte sondern der CPU.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

ChristianK

BeitragDi, März 18, 2008 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Der Wert bleibt konstant, das ist sicher. Smile

2. Das stimmt so nicht: DirectDraw ist komplett hardware-beschleunigt. Außerdem macht es keinen Unterschied, ob man 3D oder 2D verwendet, denn 3D setzt auf 2D auf ( seit DirectX 8 nicht mehr ). Der Teil, in dem Front- und BackBuffer erstellt werden, ist bei 2D und 3D identisch.

Aber ich will hier auch nicht über DirectX diskutieren, sondern nur wissen, wie man an die Daten ran kommt. Smile

Anderes Beispiel:
Ich möchte die aktuell mit "Color" gesetzte Farbe ermitteln. Die befindet sich an einer bestimmten Position im RAM, die absolut gesehen immer anders ist, relativ zum Programmbeginn aber immer gleich sein muss. Wie komm ich da jetzt ran?
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Dreamora

BeitragDi, März 18, 2008 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
1. OK dann kannst du das potentiell so missbrauchen Smile

2. DirectDraw war mal hardware beschleunigt. Seit ~GF3 haben 3D Karten keine 2D beschleunigung mehr, weswegen der Spass auch langsamer ist als auf TNT2 und so. Heutzutage ist einzig und allein Direct3D noch hardware beschleunigt, weswegen es in den meisten Fällen sinnvoll ist 2D durch 3D zu machen (BM, Draw3D etc). Aber ja, das ist für das Problem wohl irrelevant, ging nur darum, das es in DX nicht 1 Backbuffer hat sondern bis zu 8 Backbuffer im 3D Modus.


Such den anfang des programmes im RAM mit der windows api und addier deinen offset.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

ChristianK

BeitragMi, März 19, 2008 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal zu 2.: Smile
Mag sein, dass alte Grafikkarten relativ gesehen DirectDraw schneller verarbeiten, aber DirectDraw nutzt immer noch die Grafik-Hardware. Wenn du echte Prozessor-Grafik-Geschwindigkeit willst, vergleich mal DirectDraw mit Windows GDI und du wirst einen "kleinen" Unterschied feststellen. Wink
Laut dxdiag ist die DirectDraw-Beschleunigung bei mir auch eingeschaltet ...

Zum eigentlich Problem:
An die Start-Adresse komm ich schon, nur bin ich mir nicht sicher, ob man sich darauf verlassen kann, oder ob man nicht besser einen anderen Anhaltspunkt nimmt.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Dreamora

BeitragMi, März 19, 2008 8:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du dir sicher bist, dass der Offset konstant ist zum Anfang des Programmes, dann kannst du das so machen.

Probleme werden dann jedoch vermutlich in jedem Fall die 64Bit Windowsversionen. Nicht weil da der Offset anders wäre, sondern weil vor allem Vista 64 den Zugriff nicht gestatten könnte womit es mit MAV abkratzt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

ChristianK

BeitragDo, März 20, 2008 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mich jetzt doch dafür entschieden, den BackBuffer nicht automatisch erkennen zu lassen, weil er scheinbar bei Version 1.98 und 1.99 an unterschiedlichen Stellen ist. Dann bräuchte ich zwei verschiedene Versionen meiner DLL.

Aber trotzdem vielen Dank für deine Hilfe. Smile
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Dreamora

BeitragFr, März 21, 2008 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist klar.
Die Runtimelibrary hat sich geändert.

Sollte aber sonst weder in neueren noch in älteren ein problem sein.
FastImage hatte das gleiche problem, warums ne 1.99 und ne 1.98 version davon gibt Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group