Minimap mit Rect ist seeeehr langsam
Übersicht

peter_85Betreff: Minimap mit Rect ist seeeehr langsam |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
ich hab gestern mal etwas herumgespielt und ein Programm erstellt, das mir eine Welt aus 6000 Blöcken zusammensetzt und dann ein paar Höhlen hineinrechnet (siehe Bild). Nun wollte ich eine Minimap erstellen und habe das über Rect gemacht (jeden Block in einer Größe von 3 Pixeln in Rect gemalt), also werden bei jedem Rechendurchlauf 6000 Rechtecke gemalt. Das ist leider langsam, nur fällt mir aktuell nichts besseres ein??? Ich könnte das auch nur einmal alle paar Sek. berechnen - aber dann ruckelt es alle paar Sekunden kurz - auch nicht wünschenswert. Bin wie immer für alle Hinweise dankbar. ![]() [img] ![]() |
||
bjh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
einen kleinen geschwindigkeitsboost könntest du mit einem bild erreichen.
also anstatt rect einfach drawimage benutzen. |
||
peter_85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mir ist grad noch eingefallen, dass ich jede Sekunde nur 200 oder 300 der Berechnungen vornehmen könnte. Bleibt aber noch das Problem mit dem dauerhaften Zeichnen der REchtecke wegen Cls. Wenn man das berechnete und die gezeichneten Rechtecke vielleicht in einer Bilddatei speichern könnte und lädt diese nach ein paar Sekunden (wenn alle Berechnungen für die 6000 Blöcke fertig sind). Meint Ihr das wär eine Lösung? Irgendwie müssen die das in den Strategiespielen ja hinbekommen haben vor 10-20 Jahren.... | ||
peter_85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi bjh,
ich verstehe nicht ganz? Du meinst sicher nicht 6000 Mal DrawImage benutzen, oder? Ich gehe mal davon aus, dass Du es so meinst wie ich mit meinem zweitem Post? Ich hab grad nur keine Ahnung wie ich ein Bild immer weiter male, und dann lade(o.k., das laden bekomm ich hin, aber wie mach ich das mit dem Bild malen?). |
||
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vlt. funktioniert Line![]() |
||
Version: BlitzPlus / Blitz+ |
peter_85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
KnorxThieus hat Folgendes geschrieben: Vlt. funktioniert Line
![]() In der Hilfe steht, das Rect bis zu 1500% schneller sein soll. Deswegen soll man für einfache Linien auch eher Rect verwenden. (laut Hilfe) |
||
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achso, na dann Tschuldigung und ich nehm's zurück. | ||
Version: BlitzPlus / Blitz+ |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stichwort WritePixelFast.
Zuerst wirfst du ein LockBuffer auf den BackBuffer, dann zeichnest du mit dem WritePixelFast alles was du zeichnen willst und dann kommt noch ein UnlockBuffer auf den BackBuffer und fertig. Gerade wenn du eh nur simple Formen zeichnest, die du leicht mit WritePixelFast machen kannst, kannst du da extrem was an Geschwindigkeit rausholen. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
peter_85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
DAK hat Folgendes geschrieben: Stichwort WritePixelFast.
Zuerst wirfst du ein LockBuffer auf den BackBuffer, dann zeichnest du mit dem WritePixelFast alles was du zeichnen willst und dann kommt noch ein UnlockBuffer auf den BackBuffer und fertig. Gerade wenn du eh nur simple Formen zeichnest, die du leicht mit WritePixelFast machen kannst, kannst du da extrem was an Geschwindigkeit rausholen. thx, da seh ich mir diese Befehle gleich mal an. |
||
bjh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wenn man ein rechteck mit rect zeichnet, ist das langsamer als wenn man es als bild zeichnet.
das meinte ich und es ist auch so. ![]() |
||
peter_85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also pixelwritefast scheint wirklich sehr schnell zu sein. Da ich immer nur einen Pixel zeichnen kann, muss ich für jedes Kästchen in der Minimap 9 Pixel zeichnen und das 6000 Mal - und es läuft deutlich schneller.
Leider steig ich nicht wirklich bei der Farbgebung durch, den Text der Hilfe kapier ich nicht. Wie wandel ich denn einen Color Wert von 200,20,40 um? Und ich versteh auch nicht, warum die Minimap durchsichtig ist (was nicht schlimm ist), aber auch bei verstellen des Alphawertes bleibt sie immer gleich stark durchsichtig. "wenn man ein rechteck mit rect zeichnet, ist das langsamer als wenn man es als bild zeichnet. das meinte ich und es ist auch so. " O.k., danke. Ich dachte immer ein Bild zeichnen wär langsamer. Wieder was gelernt. Edit: Das mit der Transparenz hat sich geklärt. ![]() |
||
![]() |
Spark Fountain |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: O.k., danke. Ich dachte immer ein Bild zeichnen wär langsamer. Wieder was gelernt.
Ja, das wirkt auf den ersten Blick paradox. Der Grund ist allerdings der, dass BlitzBasic das Bild einfach einmal in den Speicher lädt und dann immer wieder "reproduziert", also auf die Speicheradresse zugreift und die Bildinformationen irgendwo auf den Monitor packt. Bei Rect hingegen muss wirklich jedes Mal ein neues Rechteck berechnet werden, d.h. egal ob die alle gleich aussehen, sie werden immer von Grund auf neu gezeichnet. (Bitte korrigiert mich, falls ich das falsch erklärt haben sollte.) |
||
Gewinner der MiniBCC's #11, #13 und #28 |
peter_85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bildgebung hab ich jetzt auch begriffen (über die Suche findet man einen sehr guten Eintrag), alle Fragen wurden also geklärt! thx nochmal
Edit: Meinte Farbgebung |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde dir empfehlen die Minimap, sofern sie denn im wesentlichen statisch ist, einmal in ein mit createimage![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kann mich BladeRunner da nur anschließen. Solltest Du nur einen Ausschnitt der Karte zeichnen wollen kannst Du Dir mal Viewport![]() |
||
peter_85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nochmal Danke für die guten Tipps. Grad hab ich leider noch ein anderes Problem: wie kann ich verschieden durchnummerierte Bilder laden? Ich hab es so probiert, aber das klappt leider nicht:
LoadImage ("bild_0"+i+".bmp") ich möchte z.B. bild_01 bis bild_09 laden. Sicher gibt es auch dafür eine Möglichkeit, ich habe es mit der "Print"-Methode probiert, aber offenbar sieht die Lösung anders aus. |
||
![]() |
Dicker Hobbit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meinst du sowas:
BlitzBasic: [AUSKLAPPEN] Dim bild(20) ? Meiner Meinung nach würde es so funktionieren. Alternativ könntest du auch die Bilder in ein Bild zusammenfassen und dann BlitzBasic: [AUSKLAPPEN] LoadAnimImage() verwenden. |
||
ein_Anonymer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dim bild(8)
For i=1 to 9 bild(i-1)= loadimage("bild_0"+i+".bmp") Next So müsste das eigentlich funzen. Oh, da war ich wohl ein paar Sekunden zu langsam... ![]() |
||
peter_85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm jetzt scheint es zu funktionieren. Dann hab ich mich vorhin wohl vertippt. ![]() |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein - Ja, Jain.
Du hast dich nicht vertippt, sondern was vergessen: wenn du BlitzBasic: [AUSKLAPPEN] "hallo"+1 schreibst, wird das ganze zu folgendem: hallo1 Du wolltest allerdings "01" anhängen - was nur geht, wenn du eine 0 mit in den String einbaust. Denn: Beim konvertieren der integerzahl wird die "führende null" nicht mit übernommen, da sie praktisch gesehen nicht existitent ist. Wenn du das ganze erweitern willst, sodass du bild_01 bis bild_99 laden kannst, musst du da wieder was drehen: Zb eine kleine format-funktion, welche string+zahl annimmt und die 0en mit einfügt. BlitzBasic: [AUSKLAPPEN] Function FormatString$(Str$, value%, min_len%) ( Ich hoffe das ist BB syntax und BB befehle :-/ Ansonsten sollte die logik erkennbar sein: durch "min_len" lässt sich die länge der string-zahl bestimmen. Für dein beispiel würdest du also wie folgt das ganze aufrufen: BlitzBasic: [AUSKLAPPEN] Dim bild(20) 0-9 wird zu 00 bis 09, sowie 10 bleibt 10 undsoweiter ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group