Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 27.01.2004, 20:15 Titel: Lange Aufbauzeit |
|
|
Hallo
Ich erstelle die Welten wo sich der Player bewegt auf verschiedenen Grafiken auf einem Surface. Vorher werden in einem Array die Werte der Grafiken gespeichert und somit wird per D3DXLoadSurfaceFromFile immer ein anderer teil eines bildes ausgeschnitten und aufs Surface gemalt. Jedoch hat es verdammt lange ladezeiten, bei noch nicht mal so grossen Maps. Aber bei anderen rpg's die man z.b. mit dem rpg maker erstellt sind die Welten ja viel grösser und es lädt nicht so lange. Verwende ich die Falsche Technik?
THX |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 28.01.2004, 07:09 Titel: |
|
|
Also
1. die meisten RPGs benutzen Tile maps. Diese werden dann einzeln in den front/back buffer geblittet.
2. Das mit dem ausschneiden. wie machst du das ? du kansnt ja auch der Blit funktion 2 rects übergeben, die angeben, wohin welche bereiche des Surface geblittet werden. |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 28.01.2004, 07:14 Titel: |
|
|
Ja ich benutze ja auch Tilemaps... Nur gehts irre lange um die zu erstellen.
Mit LoadFromSurface kann man ja auch nur Teile einer Datei kopieren. Und das mach ich halt mit ner Rect Struktur die sich , je nach dem welcher Wert ein Tiles im Array hat, verändert. Und mit dem in den Frontbuffer kopieren hab ich kein Problem das geht schnell. Nur das aufbauen der Tilemap dauert zu lange. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 28.01.2004, 11:58 Titel: |
|
|
Sehe ich das richtig das du jedes Tile als Bibliothek aus der Tilemap in ein Array lädst ? Um so dann deine Landschaft mit der Bibliothek auszubauen ?
Dann ist es ja klar das er solange braucht. Kopiere doch einfach nur den benötigten Tile direkt aus der Tilemap in den Backbuffer. Das spart dann noch Ressorcen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 28.01.2004, 13:47 Titel: |
|
|
ne das array bestimmt welches teil geladen werden soll, die werden dann alle zusammen auf ein map surface getan und , dann auf den backbuffer gezeichnet , natürlich nur ein ausschnitt davon (bildschirm). Die Arrays kann ich dann wieder verwenden für die Kollisionserkennung. Also denkt ihr ich sollte die Map garnet zuerst auf ein Surface zeichnen Sondern gerade nur das was man braucht? Das wird schwierig... |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 28.01.2004, 13:53 Titel: |
|
|
Na das Tileset lädst du als textur irgendwo hin, ganz normal. Und ja nach dem was in deinem Array steht kopierst du das benötigte tile aus der textur auf die zeichenfläche. Leider wird das dadurch dann langsamer weil du bestimmt über 100 Tiles pro Frame renderst. Dafür führst du bestimmt für jedes Tile einen extra Zeichenbefehl aus, und das kostet bei DX ziemlich viel Leistung.
Viel Besser wäre wenn du alle gleichen Tiles in einem Rutsch zeichnest. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 01.02.2004, 20:25 Titel: |
|
|
Also ich habs jetzt mal so probiert nur eine Pixelreihe hineinzukopieren wenn ich mich bewege doch sogar das stockt dann kurz , wegen nur einer Reihe.. Ich benutze ja StretchRect, liegt es vielleicht an dem? Ist das zu langsam? Und mit Stretchrect kann man ja leider nicht direkt in den Backbuffer schreiben so muss ich immer zuerst auf ein anderes Surface zeichnen. Könnt ihr mir irgend ne andere Funktion empfehlen?
Ah ja geht es eigentlich schneller , etwas zu zeichnen wenn es in einem Surface ist anstatt aus ner file auf der HD? |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 01.02.2004, 21:12 Titel: |
|
|
Beni5 hat Folgendes geschrieben: | Ah ja geht es eigentlich schneller , etwas zu zeichnen wenn es in einem Surface ist anstatt aus ner file auf der HD? |
Wie willst du es den aus einem File zeichnen ohne Surface?
Oder meinst du, ob es schneller ist, wenn man alles zuerst in ein Surface blittet, bevor es in den Backbuffer kommt? _________________ 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 |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 01.02.2004, 21:48 Titel: |
|
|
Man kann mit D3DXLoadSurfaceFromFile direkt aus bildern laden. Und jetzt hab ich es so gemacht das er genau nur das aus der file lädt das gezeichnet werden muss. Und jetzt wollte ich halt wissen ob es nicht schneller wäre diese tiles die mir zur verfügung stehen zuert auf ein surface zumalen und von dort zu kopieren anstatt aus der bilddatei.
Ich vermute langsam das liegt an der Funktion StretchRect , die ist doch einfach zu lahm. Es gibt schon en mächtigen ruck wenn ich nur 600 Pixel auf das Surface kopiere...
Ich bräuchte ne funktion mit der Ich direkt in den Backbuffer schreiben kann. Aber mit StretchRect geht das nicht, könnt ihr mir da was empfehlen? |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 04.02.2004, 17:06 Titel: |
|
|
Ich denke nicht, dass StretchRect zu langsam ist um 600 Pixel pro Frame zu kopieren und StretchRect kann soweit ich weiss auch direkt auf den Backbuffer kopieren.
Christian |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 04.02.2004, 17:31 Titel: |
|
|
Komisch , aber bei mir gibts nen heftigen Ruck wenn ich 15 quadrate mit Seitenlänge 40 Pixel hineinkopiere...
Ich denke es liegt irgendwie daran das diese 600 Pixel aus mehreren stücken besteht und dies zu lange geht. Aber bei anderen spielen wird das ja auch so gemacht.
Hilfe! |
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 04.02.2004, 20:27 Titel: |
|
|
Beni5 hat Folgendes geschrieben: | Man kann mit D3DXLoadSurfaceFromFile direkt aus bildern laden. Und jetzt hab ich es so gemacht das er genau nur das aus der file lädt das gezeichnet werden muss. Und jetzt wollte ich halt wissen ob es nicht schneller wäre diese tiles die mir zur verfügung stehen zuert auf ein surface zumalen und von dort zu kopieren anstatt aus der bilddatei. |
versteh ich das richtig, du lädst jeden durchlauf mit D3DXLoadSurfaceFromFile() die bilder neu? wenn ja, dann liegts sicher daran..also beim hochfahren 1x alles in eine surface laden und von dort kopieren. |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 04.02.2004, 20:36 Titel: |
|
|
Ne , bis jetzt hab ich es mit loadsurfacefromfile auf ein MapSurface gemalt , 1x und dann in BeginScene immer den Bildschirmausschnitt (800*600) vom MapSurface dargestellt. |
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 04.02.2004, 20:54 Titel: |
|
|
wie hast du alle tiles gespeichert und wie bringst du sie auf den bildschirm? ich checks immer noch nicht.
aja, und mit stretchrect kann man ohne probleme direkt in den backbuffer zeichnen. |
|
Nach oben |
|
|
Beni5 Super JLI'ler
Alter: 36 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 04.02.2004, 22:00 Titel: |
|
|
Also:
Zuerst wird das Level gemacht das ist ein Array in der Form: TILES[20][20] , das heisst es sind 20 auf 20 tiles in der map. Da ich eine Auflösung von 800*600 verwende , hab ich es so gemacht das jedes Tile eine grösse von 40*40 Pixel hat. Und jetzt kann man jedem Tile einen Wert zuweisen z.b. TILES[1][1]=1; das heisst das Tile ganz links oben hat den Wert 1. So nun hab ich eine funktion geschrieben die jedes teil liest und denn Wert überprüft. Wenn der Wert 1 ist hab ich gemacht das ein Rect so berechnet wird das die 1. Textur im Tileset ausgewählt wird und dann an Position 1,1 auf ein MapSurface gezeichnet wird. Und so entsteht dann die ganze Welt. Später wird dann in BeginScene() immer nur das gezeichnet was man sieht , von der map.
Tja und das lädt jetzt auf meinem amd 1,5 ghz so 5 sekunden lang am Anfang das heisst auf nem längsämeren pc dauert das dann schon sehr lange , und das ist schade da in 3d Spielen oder z.b. in Diablo wesentlich grössere Grafiken geladen werden müssen und das auch net so lange geht. Nun ich könnte ja nur das zeichnen was man sieht ohne es zuerst auf das MapSurface zu zeichnen. Das ist ja schön und gut, aber es gibt nen grossen ruck wenn ich eine Reihe tiles hineinkopiere und das ist unbrauchbar. Und mein grösster Wunsch wäre es jetzt das so umzusetzen das alles wie bisher aussieht aber die Ladezeit kürzer ist :-/.
Ich kann wenn ihr wollt auch noch funktionen hier zeigen , wie ich das mache vielleicht hilft das ja. |
|
Nach oben |
|
|
|