 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 24.07.2003, 12:27 Titel: |
|
|
Die erste Methode setzt die errechneten Pixel gleich in den AGP und kopiert dann den AGP ausschnitt in den Backbuffer.
Die zweite Methode setzt die Pixel in den Systemspeicher. Und kopiert dann zum Schluss(!) den gesamten Backbufferersatz(Sys) in den echten Backbuffer(Vid)
Zitat: | Aber hier wären dann am Schluss nur die geblendeten Teile am Bildschirm zu sehen, da sich die sonstigen Szenenausschnitte(bzw. die Szene ohne Blendung) nur im Backbufferersatz(Sys) befinden.
|
D.h. folgendes:
Zuerst ist der Backbuffer und der Backbufferersatz leer.
Dann werden die Sprites alle (statt wie normal in den Backbuffer) in den Backbufferersatz kopiert. Backbuffer ist immernoch leer.
Beim Blending wird doch nur das Rechteck in dem die Blendung stattfindet berechnet, in AGP gespeichert und in den Backbuffer kopiert.
Backbuffer enthält jetzt nur das geblendete Rechteck.
Deshalb muss entweder (1. Methode)der gesamte Hintergrund(was hier immer der aktuellen Szene entspricht) in beiden Surfaces sein(Im Sysspeicher für die schnelle Berechnung und im Vidspeicher, damit man die ungeblendeten Teile auch sieht) oder die Berechnung(2. Methode) in einem Surface durchgeführt werden und am Schluss das gesamte Surface kopieren.(Auch wieder im Sysspeicher für die schnelle Berechnung und im Vidspeicher, damit man die ungeblendeten Teile auch sieht)
<edit>
Bevor wir wieder aneinander vorbeireden : Kannst du bitte einmal diese Methode mit variablem Blendinghintergrund wie ich oben so beschreiben, damit es klappt?
</edit> _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 24.07.2003, 14:21 Titel: |
|
|
Zitat: | Die erste Methode setzt die errechneten Pixel gleich in den AGP und kopiert dann den AGP ausschnitt in den Backbuffer.
Die zweite Methode setzt die Pixel in den Systemspeicher. Und kopiert dann zum Schluss(!) den gesamten Backbufferersatz(Sys) in den echten Backbuffer(Vid)
|
AGP Speicher ist Systemspeicher. Ist halt nur der Bereich, auf den die Grafikkarte zugeifen kann. Du solltest nicht Systemspeicher in den Grafikspeicher kopieren, lieber AGP->Videomemory.
Christian |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 24.07.2003, 18:59 Titel: |
|
|
Ich habs jetzt mal nach folgendem Ablauf gemacht:
1: Sprites in Backb.-ersatz blitten
2: Bei jedem Blendvorgang:
3: {
4: Backb.-ersatz und Blendsprite verrechnen und in Backbufferersatz setzen.(Jeweils mit Locksurface)
6: }
7: Gesamter Backb.-ersatz in Alphasurface blitten
8: Gesamtes Alphasurface in Backbuffer blitten
9: Flip aufrufen
Es funktioniert zwar, aber es ist doch immer noch sehr langsam. Ohne Blendung ca. 14 FPS.
1: Geschwindigkeitssteigerung durch Haupt->Haupt
4: Geschwindigkeitssteigerung durch Pixel nehmen u. setzen in Haupt
7,8: Direkte Kopie von Haupt->Video vermeiden. AGP als Übergangssurface nutzen.
Die erste Methode geht nicht, weil nachher im Backbuffer nix drin ist.
Sprites -> Backb.-ersatz
Geblendeter Teil -> AGP-Surface
AGP-Surface -> Backbuffer
Backbuffer= geblendete Teile - sonst nix _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 24.07.2003, 19:09 Titel: |
|
|
Was hast du denn für eine Auflösung/Farbtiefe?
Ich kann mir nicht vorstellen, dass es so langsam ist, wenn du es richtig machst. Versuche doch mal bitte GENAU folgendes:
1. Surface in der Größe des Hintergrunds im Videomemory erstellen und Hintergrund hineinkopieren.
2. Surface in der Größe des Hintergrunds im Systemspeicher erstellen und
Hintergrund hineinkopieren.
3. Surface in der Größe des Hintergrunds im AGP-Speicher erstellen - NICHTS hineinkopieren.
4. Ein Surface für ein Sprite im Systemmemory erstellen.
Du machst jetzt nichts weiter, als eine Möglichkeit vorzusehen, das Sprite auf dem Bildschirm hin- und herzubewegen. Der Ablauf ist jetzt folgender:
1. Hintergrund aus dem Videospeicher in den Backbuffer kopieren.
2. Sprite mit Hintergrund im Systemspeicher blenden und Ergebnis in den AGP-Speicher blenden
3. Den Teil des AGP-Speichers in den Backbuffer kopieren (kann nur so groß sein, wie das Sprite)
4. Flip aufrufen.
Wenn das nicht so schnell läuft wie deine Bildwiederholfrequenz, machst du was falsch.
Christian |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 24.07.2003, 19:20 Titel: |
|
|
Ach so
Heißt das(da der Hintergrund jedesmal anders ist und aus den Tiles besteht), dass ich alle Sprites zweimal erstellen muss(1x Systemsp. & 1x Videosp.) und zweimal Blitten muss(1x alle Tiles&Sprites in Hauptsp.-surface & 1x alle Tiles&Sprites wie gewöhnlich in Backbuffer)?
Dann müsste man natürlich nicht mehr den gesamten Backbuffer/Backbufferersatz aktualisieren.
Aber das erhöht wahrscheinlich die Ladezeiten .
Ist es da am günstigsten(beim Initialisieren), die Sprites im Videomem zu erstellen, Grafik reinladen und dann in 2. Surface(Hauptsp.) kopieren? Oder andersherum? _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 25.07.2003, 10:47 Titel: |
|
|
Hey, also die Tiles wirst du schon im Haupt- und im Vidmem brauchen. Das ist sicher resourcenfreundlicher, als die immer hin und her zu kopieren. Bei den Sprites kommts halt drauf an...Sprites, die immer mit dem Hintergrund geblendet werden müssen, brauchst du dann nur im Hauptspeicher, und Sprites, die immer nur auf den Backbuffer draufkopiert werden, eben nur im Vidmem. So hab ich das verstanden.
-chewie |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 25.07.2003, 11:51 Titel: |
|
|
Mit dem Kopieren hab ich ja gemeint, beim Initialisieren kopieren. Das ist schneller, wenn man nicht mehr die ganzen Daten aus einer Grafikdatei holen muss.(Bei *.jli ists vielleicht sogar noch langsamer )
Chewie hat Folgendes geschrieben: | Sprites, die immer mit dem Hintergrund geblendet werden müssen, brauchst du dann nur im Hauptspeicher,... |
Das stimmt. Aber soweit ich das verstanden habe, braucht man sonst alle Sprites, die zusammen den Blendinghintergrund ergeben in beiden Speichern, weil sie ja auch in zwei Surfaces kopiert werden(Backbuffer im Videosp. und Backbufferersatz im Hauptsp.)
Irgendwie funzt das aber nicht. Ich glaube, das liegt an dem Alpha-/Hilfssurface
Nach n bisschen rumprobieren hab ich herausgefunden, dass die Sprites richtig in Hilfssurface und Backbuffer kopiert werden.
Ich habe mal, anstatt die Pixel zu errechnen, einfach mal das Sprite, das geblendet werden soll, ins Alphasurface(AGP) kopiert und dann diesen Teil dann in den Backbuffer. Komischerweise hat man nix von dem Sprite gesehen.
Ist vielleicht an folgender Initialisierung des Alphasurfaces irgendwas falsch, oder fehlend?
Oder muss man da noch den Code mit dem Colorkey(Im Buch wars AFAIK die Funktion CreateSprite) hinzufügen?
Code: | //Alphasurface anlegen
// Oberflächenbeschreibung
DDSURFACEDESC2 SurfDesc;
ZeroMemory(&SurfDesc, sizeof(SurfDesc));
SurfDesc.dwSize = sizeof(SurfDesc);
// Caps, Höhe und Breite sollen berücksichtigt werden
SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_NONLOCALVIDMEM;
SurfDesc.dwWidth = 800;
SurfDesc.dwHeight = 600;
// Oberfläche anlegen
if(FAILED(DDObjektzeiger->CreateSurface(&SurfDesc,&DDAlphaSurface,NULL)))
{
return 0;
} |
Ich schick nachher mal den Blendingcode _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 25.07.2003, 12:51 Titel: |
|
|
Zitat: | Mit dem Kopieren hab ich ja gemeint, beim Initialisieren kopieren. Das ist schneller, wenn man nicht mehr die ganzen Daten aus einer Grafikdatei holen muss. |
ok, verstehe, wenn das schneller geht, dann kopier sie halt rüber, ansonsten, wenn das Spiel etwas länger initialisiert, würde es ja wahrscheinlich auch nicht so stören...
Zitat: | Aber soweit ich das verstanden habe, braucht man sonst alle Sprites, die zusammen den Blendinghintergrund ergeben in beiden Speichern, weil sie ja auch in zwei Surfaces kopiert werden(Backbuffer im Videosp. und Backbufferersatz im Hauptsp.) |
Ganz genau. So hab ich das auch verstanden und so soll es glaub ich auch verstanden werden .
Ob an dem Code was faul ist, kann ich nicht sagen, da kann dir der Christian sicher besser helfen. Überprüfe mal deine RECT-Definitionen,
vielleicht kopierts du einfach einen falschen Bereich in den Backbuffer... |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 25.07.2003, 13:02 Titel: |
|
|
ich hab grad in der MSDN nachgeschaut und folgendes gefunden:
Zitat: | DDSCAPS_OFFSCREENPLAIN:
This surface is any offscreen surface that is not an overlay, texture, z-buffer, front-buffer, back-buffer, or alpha surface. It is used to identify plain surfaces.
|
Vielleicht liegts daran...das wird doch eine Alphasurface, oder?[/b] |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 25.07.2003, 13:05 Titel: |
|
|
Nein, das wird keiner, dass will/muss der Lord ja gerade selber machen.
Christian |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 25.07.2003, 15:27 Titel: |
|
|
Der Blendingcode:
Fbreite ist die Breite des Grafikausschnittes, der gezeichnet werden soll.
Fhohe ist die Höhe des Grafikausschnittes, der gezeichnet werden soll.
xpos und ypos sind die Koordinaten des Sprites am Bildschirm
sur ist eine Indexzahl für Surfaces
Wenn bei Get- oder SetPixelSurface –2 übergeben wird, wird das Hilfssurface(Hauptsp.) angesprochen; bei –1 das Alphasurface(AGP) und sonst der Index des Surfaces(Hauptsp.)
Code: |
for(int x=0; x<Fbreite; x++)
{
for(int y=0; y<Fhohe; y++)
{
//Pixel des Hilfssurfaces(Systemspeicher) nehmen
COLORREF bildschirm=GetPixelSurface(-2,xpos+x,ypos+y);
//Pixel des Sprites(Systemsp.) nehmen
COLORREF pixel=GetPixelSurface(sur,Fx+x,Fy+y);
if(pixel!=cColorkey[sur])
{
//Berechnungen
}
//Neue Pixelfarbe ins Alphasurface(AGP) speichern
SetPixelSurface(-1,xpos+x,ypos+y,pixel);
}
}
RECT SRect;
SRect.left = xpos;
SRect.right = xpos+Fbreite;
SRect.top = ypos;
SRect.bottom = ypos+Fhohe;
//Geblendeter Szenenausschnitt zurück in den Backbuffer kopieren
DDHinterbuffer->BltFast(xpos,ypos,DDAlphaSurface,&SRect,DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
|
Kann hier irgendjemand einen Fehler entdecken? _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 26.07.2003, 12:21 Titel: |
|
|
OK, jetzt funzt es. Ich hatte wohl doch einen Fehler bei den Rects. Aber es ist immer noch ziemlich langsam. Ohne irgendeine Blendung zwischen 10 und 20 FPS. Mit Blendung ungefähr 6 FPS.
Das Bild ist ca. 350*50 Pixel groß und die Auflösung 800*600.
Ich poste mal die ganzen Drawcodes. Vielleicht könnt ihr da eine Geschwindigkeitsbremse entdecken:
Code: | //Draw-funktion
//Sprite im Videomem in Backbuffer kopieren
DDHinterBuffer->BltFast(xpos,ypos,DDSpriteSurface[ss],&SRect,DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
//Sprite im Sysmem in Hilfssurface im Sysmem kopieren
DDHilfsSurface->BltFast(xpos,ypos,DDSystemSurface[ss],&SRect,DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
|
Code: | //Clear-funktion
//Backbuffer leeren
DDHinterPuffer->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&BlitFX);
//Surface im Sysmem leeren
DDHilfsSurface->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&BlitFX);
//Surface im AGP leeren
DDAlphaSurface->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&BlitFX); |
Code: | //Blending-funktion
for(int x=0; x<Fbreite; x++)
{
for(int y=0; y<Fhohe; y++)
{
//Pixel des Hilfssurface(Systemspeicher) nehmen
COLORREF bildschirm=GetPixelSurface(-2,xpos+x,ypos+y);
//Pixel des Sprites(Systemsp.) nehmen
COLORREF pixel=GetPixelSurface(ss,Fx+x,Fy+y);
//Berechnungen
//Pixel in Alphasurface(AGP) setzen
SetPixelSurface(-1,xpos+x,ypos+y,pixel);
}
}
RECT SRect;
SRect.left = xpos;
SRect.right = xpos+Fbreite;
SRect.top = ypos;
SRect.bottom = ypos+Fhohe;
//Geblendeter Szenenausschnitt zurück in den Backbuffer kopieren
DDHinterBuffer->BltFast(xpos,ypos,DDAlphaSurface,&SRect,DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY); |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 27.07.2003, 16:22 Titel: |
|
|
ich weiss leider nicht, wieso es bei dir so langsam läuft, aber ich hab ne Frage, die hier ganz gut dazupasst...
Wenn ich ein Scrolling mache, wo ich spaltenweise den Hintergrund aus einer Surface im Systemspeicher kopieren will, sollte ich da auch zuerst in den AGP-Speicher kopieren und von dort in den Vidmem? Ich mein, das wäre ja ein überflüssiger Kopiervorgang, oder ist Sysmem->Vidmem wirklich sooo langsam, dass es sich wieder auszahlt? Oder sollte ich mein gesamtes Hintergrundbild überhaupt gleich im AGP-Speicher anlegen?
-chewie |
|
Nach oben |
|
 |
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 27.07.2003, 18:03 Titel: |
|
|
ich denk Video-speicher; denn das hintergrund-bild wird ja normalerweise bei jedem frame geblittet. warum kommst du aud die idee den erst in den AGP zu machen??? beim spaltenweisen blitten wird die CPU nicht benötigt. wenn du dann z.B. eine 1600*600 oberfläche zum scrollen hast, dann blittest einen gewißen teil eben nicht. das hat aber nichts mit der CPU zu tun, daher hat es kein sinn das in den AGP zu verschieben wenn ich mich nicht irre. |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 27.07.2003, 18:20 Titel: |
|
|
ok, das macht sinn...auf die idee mit dem agp-speicher bin ich eben durch diesen thread gekommen, da wurde erwähnt, dass die grafikkarte schneller drauf zugreifen kann, aber solange ich nichts blende, müsste es ja wirklich egal sein...
aber ich hab schon ein neues Problem:
ich wollte es eigentlich mit BltFast machen, bis ich draufgekommen bin, dass das ja eine DirectDraw funktion ist ....wie kopiere ich denn jetzt mit DX9 vom Sysmem in Vidmem?
@lord: sry, dass ich deinen thread 'hijacke', ich bin auch gleich weg  |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|