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

Alter: 38 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 18.07.2003, 18:45 Titel: |
|
|
Nein, ich kopiere zwar den gesamten Bildschirm vom Videospeicher in den Systemspeicher, damit es aktuell ist, aber die Pixel werden vom Hauptspeicher aus genommen und verrechnet in den AGP geschrieben. Danach wird dann nur dieser geblendete Teil in den Videospeicher(Backbuffer) kopiert. _________________ 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: 49 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 18.07.2003, 23:24 Titel: |
|
|
| Wieso muss du den Videospeicher in den Hauptspeicher kopieren? |
|
| Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 38 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 19.07.2003, 08:07 Titel: |
|
|
Damit die Szene im Hauptspeicher ist, wieder aktuell ist.
Ich verrechne ja immer die Pixel des Sprites im Hauptspeicher mit den Pixel der aktuellen Szene. Und damit das Surface im Hauptspeicher wirklich die aktuelle Szene darstellt, muss ich das vom Backbuffer in den Hauptspeicher kopieren.
Oder sollte ich lieber alle Sprites im Haupts. anlegen und dann anstatt in den Backbuffer in das Haupts.-surface kopieren?
<edit>
Hier ist mal ein anschauliches Beispiel:
Legende:
| Zitat: | a, b, c - Sprites
/ - Spielfigur
\ - Zu blendendes Sprite |
Initialisieren:
| Videospeicher hat Folgendes geschrieben: | a
b
c
/
| Backbuffer hat Folgendes geschrieben: | | -Nix- |
|
| Hauptspeicher hat Folgendes geschrieben: | | \ |
| AGP-Speicher hat Folgendes geschrieben: | | -Nix- |
Szene blitten:
| Videospeicher hat Folgendes geschrieben: | a
b
c
/
| Backbuffer hat Folgendes geschrieben: | bbba
a/aa
aaca |
|
| Hauptspeicher hat Folgendes geschrieben: | | \ |
| AGP-Speicher hat Folgendes geschrieben: | | -Nix- |
Szene in HS aktualisieren:
(Im Hauptspeicher war zuvor nichts von der aktuellen Szene/ bzw. nur die alte Szene gespeichert.)
| Videospeicher hat Folgendes geschrieben: | a
b
c
/
| Backbuffer hat Folgendes geschrieben: | bbba
a/aa
aaca |
|
| Hauptspeicher hat Folgendes geschrieben: | \
bbba
a/aa
aaca |
| AGP-Speicher hat Folgendes geschrieben: | | -Nix- |
Blenden:
(Im AGP wird über die Spielfigur(/) das Zeichen \ geblendet.)
| Videospeicher hat Folgendes geschrieben: | a
b
c
/
| Backbuffer hat Folgendes geschrieben: | bbba
a/aa
aaca |
|
| Hauptspeicher hat Folgendes geschrieben: | \
bbba
a/aa
aaca |
| AGP-Speicher hat Folgendes geschrieben: | bbba
aXaa
aaca |
Backbuffer aktualisieren:
| Videospeicher hat Folgendes geschrieben: | a
b
c
/
| Backbuffer hat Folgendes geschrieben: | bbba
aXaa
aaca |
|
| Hauptspeicher hat Folgendes geschrieben: | \
bbba
a/aa
aaca |
| AGP-Speicher hat Folgendes geschrieben: | bbba
aXaa
aaca |
</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: 49 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 19.07.2003, 21:02 Titel: |
|
|
Okay,
vielleicht reden wir aneiander vorbei. Du willst Alphaeffekte im Spiel nutzen. Um es mal einfach zu machen, nehmen wir an, dass du genau ein halbtransparentes Sprite in den Hintergrund kopieren willst.
Dazu solltest du folgendes machen:
1. Surface für das Sprite im Hauptspeicher anlegen und Sprite laden.
2. Surface für den Hintergrund im Hauptspeicher anlegen und Hintergrund hineinkopieren.
3. Hilfssurface in der Größe des Hintergrunds im AGP-Speicher anlegen.
4. Surface für den Hintergrund im Videospeicher anlegen und den Hintergrund dort hineinladen.
5. Primärsurface und Backbuffer in Videospeicher anlegen.
Ablauf:
1. Hintergrund aus dem Videospeicher in den Backbuffer kopieren
2. Die Pixel des Sprites mit denen, des Hintergrunds (im Systemspeicher) blenden und das Ergebnis im Hilfsurface (im AGP) Speicher ablegen.
3. Den fertig geblendeten Teil des Hilfssurfaces (maximal so groß wie das Sprite) in den Backbuffer kopieren.
4. Flip aufrufen.
Du kopierst also nur die Stellen, die geblendet wurden auf die Grafikkarte. Es gibt überhaupt keinen Grund den Speicher von der Grafikkarte zurückzukopieren, NIE ! Da alles redundant auch im Hauptspeicher vorhanden ist.
Wenn du irgendwann mal sehr viele Sprites blenden willst ist es wahrscheinlich einfacher den gesamten Hilfssurface in den Backbuffer zu kopieren. Aber es wird NIE von der Grafikkarte in den Hauptspeicher kopiert.
Christian |
|
| Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 38 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 20.07.2003, 11:38 Titel: |
|
|
Aber der Hintergrund besteht ja aus der Szene im Backbuffer. Und wie soll denn immer die aktuelle Szene im Surface(Systemspeicher) sein, wenn ich die Sprites in den Backbuffer blitte, aber den Backbuffer dann nicht kopiere?
Ich beschreibe die Situation mal konkreter:
Die Szene besteht jeweils aus verschiedenen Tiles, der Spielfigur, den Gegnern, etc...
Jetzt willich das Sprite eines Schriftzugs über die gesamte Szene blenden.
| Christin Rousselle hat Folgendes geschrieben: | | 1. Hintergrund aus dem Videospeicher in den Backbuffer kopieren |
1. Tiles, etc... in Backbuffer kopieren - kapiert.
| Christin Rousselle hat Folgendes geschrieben: | 2. Die Pixel des Sprites mit denen, des Hintergrunds (im Systemspeicher) blenden und das Ergebnis im Hilfsurface (im AGP) Speicher ablegen.
|
2. Pixel des Schriftzugs im Systemspeicher nehmen.
Aber im Surface(Systemspeicher) für den Hintergrund mit dem geblendet werden soll ist doch noch gar nichts drin oder?
| Christin Rousselle hat Folgendes geschrieben: | 3. Den fertig geblendeten Teil des Hilfssurfaces (maximal so groß wie das Sprite) in den Backbuffer kopieren.
|
Geblendeter Surfaceteil(AGP; Schriftzug über Szene geblendet) in Backbuffer blitten - kapiert.
| Christin Rousselle hat Folgendes geschrieben: | | 4. Flip aufrufen. |
OK, Flip aufrufen - kapiert.
Ich versteh jetzt alles, bis auf den 2. Schritt. Ich hab doch bis jetzt die Szene/den Hintergrund nur im Backbuffer.
Hab ich da jetzt einen Denkfehler?
Könntest du mir das plz nochmal erklären? _________________ 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: 49 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 21.07.2003, 12:26 Titel: |
|
|
| Zitat: | | Aber der Hintergrund besteht ja aus der Szene im Backbuffer. Und wie soll denn immer die aktuelle Szene im Surface(Systemspeicher) sein, wenn ich die Sprites in den Backbuffer blitte, aber den Backbuffer dann nicht kopiere? |
Wofür brauchst du die aktuelle Szene im Hauptspeicher?
| Zitat: |
2. Pixel des Schriftzugs im Systemspeicher nehmen.
Aber im Surface(Systemspeicher) für den Hintergrund mit dem geblendet werden soll ist doch noch gar nichts drin oder? |
Du hast auch den Hintergrund im Systemspeicher (wie auch im Videospeicher). |
|
| Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 38 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 21.07.2003, 20:22 Titel: |
|
|
| Christian Rousselle hat Folgendes geschrieben: | | Wofür brauchst du die aktuelle Szene im Hauptspeicher? |
Weil der Hintergrund mit dem geblendet werden soll doch die aktuelle Szene ist.
| Christian Rousselle hat Folgendes geschrieben: | | Du hast auch den Hintergrund im Systemspeicher (wie auch im Videospeicher). |
Dann muss ich aber die Sprites alle in den Hauptspeicher kopieren(Der Hintergrund fürs Blenden besteht aus der Szene!)
Das habe ich vorhin versucht zu erklären; ich will das eine Sprite mit der gesamten Szene blenden.
| Christian Rousselle hat Folgendes geschrieben: | | 2. Surface für den Hintergrund im Hauptspeicher anlegen und Hintergrund hineinkopieren. |
Der Hintergrund ist nicht irgendeine Bitmap, die ich in ein Surface lade, sondern die gesamte Szene.
Ich erläutere es nochmal kurz:
Ich habe z.B. das Sprite eines Grastiles und das eines Baumtiles.
Nun wird z.B. in der aktuellen Situation wie auf einem Schachbrett Gras- und Baumtile abgewechselt.
Dann habe ich einen Schriftzug, der sich über den ganzen Bildschirm erstreckt.
Nun will ich, dass dieser Schriftzug z.B. zu 50% durchscheint. Die anderen 50% haben die Pixel der Szene.
Und meine eizige Frage, die jetzt noch bleibt, ist, woher und wie jetzt hier plötzlich der Hintergund für die Blendung im Surface des Systemspeichers sein/kommen soll.
PS: Sry, wenn ich auf die Nerven falle, aber ich kapiers einfach nicht
<edit>
Ich zeigs wahrscheinlich morgen Nachmittag mal grafisch
</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: 49 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 21.07.2003, 21:41 Titel: |
|
|
Normalerweise ist das Sprite nicht so groß wie der gesamte Hintergrund. Wenn dass aber doch so ist, dann muss du, wie schon mehrfach erklärt das Blenden im Hauptspeicher machen und den gesamten Hilfssurface aus dem AGP-Speicher in den Backbuffer kopieren.
Christian |
|
| Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 38 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 22.07.2003, 14:49 Titel: |
|
|
Jetzt hab ich’s mal konkret mit Grafiken gemacht:
Mal angenommen, der gesamte Bildschirm hätte eine Auflösung von 200*150
Legende(Farbe zeigt an, in welchem Speicherbereich die beschriebene Grafik sich befindet):
Grafik-/Videospeicher
AGP-Speicher
System-/Hauptspeicher
Dann wäre eine Mögliche Szene im Spiel diese: Szene 1
Eine zweite mögliche Szene wäre dies: Szene 2
Diese beiden Szenen sind nicht in einer Grafik gespeichert, sondern sind während des Zeichenvorgangs aus den folgenden Sprites zusammengesetzt worden:
Sprite 1(Gras)
Sprite 2(Baum)
Sprite 3(Weg)
So ist das Spiel normal. Jetzt kommt noch ein Sprite hinzu: Schriftzug
Dieses Sprite soll nun links oben(Koordinaten 0/0) mit 50% Transparenz über die Szene geblittet bzw. geblendet werden.
Für die Berechnung der neuen geblendeten Pixel benötigt man die Pixel des Sprites(Schriftzugs) und die der Szene
Bei dieser Berechnung werden jetzt mal einfach beide (R-,G- und B-)Pixelwerte zusammengezählt, durch 2 geteilt und wieder in eine COLORREF-Variable umgewandelt.
Die errechneten Pixel werden nun in einem Surface gespeichert. Dieses müsste nun bei der 1. Szene dies hier enthalten.
Dieses Surface wird nun in den Backbuffer kopiert und enthält folgendes:
Bei Szene 1
Bei Szene 2
Und damit ich jetzt nicht irgendwelche Blendungen mit weiß(o.Ä.) erhalte, wie hier zu sehen, und damit es bei beiden Szenen 1 und 2 (+ alle anderen Szenen) funktioniert, braucht man für die Blendung die Pixel der aktuellen Szene.
Aber was war vorhin in deiner Beschreibung(deinen Beschreibungen )mit Hintergrund gemeint? Ich dachte eigentlich, die aktuelle Szene. Sonst gibt es keinen Hintergrund.
Ich glaube, das beruht auf einem Missverständnis, was dieses „Hintergrundsurface“ im Hauptspeicher angeht. Ich bitte um Korrektur, falls damit nicht die aktuelle Szene gemeint ist. _________________ 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: 23.07.2003, 16:49 Titel: |
|
|
Hi, obwohl ich noch ein blutiger Anfänger bin, wage ich es jetzt mal hier reinzufunken.
Ich glaube Christian ist davon ausgegangen, dass als Hintergrund ein großes Bild vorliegt, aus dem dann immer ein Auschnitt auf den Bildschirm geblittet wird. In dem Fall müsstest du es nicht in den Hauptspeicher zurückkopieren, weil sich der Hintergrund ja nie ändert, es wird nur immer ein anderer Teil angezeigt.
In kann jetzt nur Vermutungen anstellen, wie man es mit Tiles macht, aber wenn du die Tiles im Hauptspeicher hast, kannst du dir doch dort genauso wie im Videospeicher dein aktuelles Hintergrundbild zusammenbauen (oder besser noch, nur den Teil den du fürs Blending brauchst), dann eben Blenden, rein in den AGP-Speicher und dann ab damit in den Backbuffer.
Ich hoffe ich lieg da jetzt nicht falsch und trage nur noch mehr zur Verwirrung bei...
-chewie |
|
| Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 49 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 23.07.2003, 17:05 Titel: |
|
|
@Chewie: Daumen hoch Genauso meine ich es. Ich hoffe du wirst besser verstanden als ich.  |
|
| Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 38 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 23.07.2003, 18:01 Titel: |
|
|
Gut, jetzt glaube ich, es zu verstehen
Das war wohl alles ein Missverständnis.
Genau das habe ich vor ein paar Posts gefragt.
| The Lord of Programming hat Folgendes geschrieben: | Damit die Szene im Hauptspeicher ist, wieder aktuell ist.
Ich verrechne ja immer die Pixel des Sprites im Hauptspeicher mit den Pixel der aktuellen Szene. Und damit das Surface im Hauptspeicher wirklich die aktuelle Szene darstellt, muss ich das vom Backbuffer in den Hauptspeicher kopieren.
Oder sollte ich lieber alle Sprites im Haupts. anlegen und dann anstatt in den Backbuffer in das Haupts.-surface kopieren? |
Als dann keine Antwort darauf kam, habe ich die Idee wieder verworfen.
Na ja, is ja jetzt auch egal. Ich versuchs jetzt mal so, wie gesagt  _________________ 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: 49 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 23.07.2003, 18:07 Titel: |
|
|
| Zitat: |
Oder sollte ich lieber alle Sprites im Haupts. anlegen und dann anstatt in den Backbuffer in das Haupts.-surface kopieren? |
Wobei du die Sprites die keine Transparenzeffekte haben, auch im Videospeicher halten kannst.
Christian |
|
| Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 38 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 24.07.2003, 10:34 Titel: |
|
|
Ich hab jetzt doch noch mal ne Frage.
Der Ablauf wäre ja jetzt so:
1: Sprites(Sys) in Backbufferersatz(Sys) kopieren.
2: Bei jedem Blendvorgang:
3: {
4: Backbufferersatz(Sys) und Blendsprite(Sys) verrechnen und in Alphasurface(AGP) setzen.
5: Alphasurface(AGP) in Backbuffer(Vid) kopieren.
6: }
7: Flip aufrufen
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.
Wäre es da nicht sinnvoller, das so zu machen?
1: Sprites(Sys) in Backbufferersatz(Sys) kopieren.
2: Bei jedem Blendvorgang:
3: {
4: Backbufferersatz (Sys) und Blendsprite(Sys) verrechnen und wieder in Backbufferersatz(Sys) setzen.
5: }
6: Backbufferersatz(Sys) in Alphasurface(AGP) kopieren.
7: Alphasurface(AGP) in Backbuffer(Vid) kopieren.
8: Flip aufrufen
Hier wäre jetzt alles im Backbuffer zu sehen: Alle Sprites + geblendete Ausschnitte.
Außerdem wäre eine doppelte Überblendung möglich, da bei der ersten Version immer nur die Szene ohne Blendung als Blendhintergrund genommen wird.
Was wäre in Zeile 6 & 7 am Besten?
So wie’s ist
oder statt mit BltFast den Backbufferersatz(Sys) zu kopieren, die Pixel
mit LockSurface einzeln nehmen und ins Alphasurface(AGP) setzen
oder die beiden Schritte zusammenfassen. D.h. Backbufferersatz(Sys) direkt in
Backbuffer(Vid) kopieren? _________________ 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: 49 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 24.07.2003, 11:12 Titel: |
|
|
Ich verstehe den Unterschied zwischen den beiden Methoden nicht. Außerdem verstehe ich nicht, was du damit
| 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.
|
sagen willst.
Christian |
|
| 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
|