Minimap mit Rect ist seeeehr langsam

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

peter_85

Betreff: Minimap mit Rect ist seeeehr langsam

BeitragDo, Mai 23, 2013 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile



[img]user posted image[/img]
 

bjh

BeitragDo, Mai 23, 2013 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
einen kleinen geschwindigkeitsboost könntest du mit einem bild erreichen.
also anstatt rect einfach drawimage benutzen.
 

peter_85

BeitragDo, Mai 23, 2013 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 23, 2013 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 23, 2013 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Vlt. funktioniert Line schneller?
Version: BlitzPlus / Blitz+
 

peter_85

BeitragDo, Mai 23, 2013 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
KnorxThieus hat Folgendes geschrieben:
Vlt. funktioniert Line schneller?


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

BeitragDo, Mai 23, 2013 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, na dann Tschuldigung und ich nehm's zurück.
Version: BlitzPlus / Blitz+

DAK

BeitragDo, Mai 23, 2013 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 23, 2013 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 23, 2013 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink
 

peter_85

BeitragDo, Mai 23, 2013 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

Spark Fountain

BeitragDo, Mai 23, 2013 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 23, 2013 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragFr, Mai 24, 2013 5:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde dir empfehlen die Minimap, sofern sie denn im wesentlichen statisch ist, einmal in ein mit createimage erzeugtes Bild einzurendern und danach nur noch dieses Bild einmal einzuzeichnen. Sollen dann noch Gegnerpositionen oder so eingezeichnet werden kann man dies abschliessend "on-top" tun, also nur die benötigten Pixel ändern.
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

BeitragMo, Mai 27, 2013 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann mich BladeRunner da nur anschließen. Solltest Du nur einen Ausschnitt der Karte zeichnen wollen kannst Du Dir mal Viewport (in Verbindung mit sich ändernder Zeichenposition der Minimap-Grafik) ansehen.
 

peter_85

BeitragDi, Mai 28, 2013 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Mai 28, 2013 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Meinst du sowas:

BlitzBasic: [AUSKLAPPEN]
Dim bild(20)

For i=0 To 10
bild(i)=LoadImage("Bild_0"+ i +".bmp")
Next

?

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

BeitragDi, Mai 28, 2013 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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... Very Happy
 

peter_85

BeitragDi, Mai 28, 2013 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm jetzt scheint es zu funktionieren. Dann hab ich mich vorhin wohl vertippt. Rolling Eyes
 

PhillipK

BeitragDo, Mai 30, 2013 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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%) (
Local tmp$ = ""+value%
If Len(tmp) < min_len Then
For Local i:Int = 0 To Len(tmp)-min_len
tmp = "0"+tmp
Next
EndIf
Return Str+tmp
End Function


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)

For i=0 To 10
bild(i)=LoadImage(FormatString("Bild_", i, 2)+".bmp")
Next

0-9 wird zu 00 bis 09, sowie 10 bleibt 10 undsoweiter Smile

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group