Rotate Image.. Spiel Stockt...

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

g4ndhi

Betreff: Rotate Image.. Spiel Stockt...

BeitragDi, Jun 11, 2013 0:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Bin neu hier im Forum.. Habe von c64 Dogfight einen Remake Programmiert. Läuft soweit eigentlich schon alles relativ gut.

Es gibt im Spiel 2 Flieger die ich als Bmp eingeladen habe diese Sollen sich im Spiel im kurvenflug drehen..

Habe bevor die Hauptschleife anfängt die 360 Bilder vorberechnen lassen

For WinkelSPeins = 0 To 359
Spieler1(WinkelSPeins,3) = CopyImage(Player1)
RotateImage Spieler1(WinkelSPeins,3),WinkelSPeins - 90
MidHandle Spieler1(WinkelSPeins,3)
Next


das gleiche noch für den 2ten Flieger

So sie drehen sich auch . blos wenn man beide flieger gleichzeitig dreht und schießt oder manchmal auch ohne schießen dann stockt das manchmal ziehmlich fieß...

Denke an meinen Rechner kanns net liegen i7 8 kerne, gtx 570 8gb speicher....

Laut task manager wird nur ein kern benutzt und der ist bei allen aktionen ziemlich ausgelastet.

Ist dieser befehl auch so langsam..
Und was gibts denn für alternativen kann doch net sein das das so stockt.. z.B. bei CS2D drehen sich ja auch viele schnell und da stockt nix...

mfg....

Bin für jeden Rat dankbar.. bin noch nich so der Profi Programmierer....

Midimaster

BeitragDi, Jun 11, 2013 1:35
Antworten mit Zitat
Benutzer-Profile anzeigen
also zunächst mal, man braucht nicht für jedes Grad ein eigenes Image. Reduzier mal auf 36 Bilder zu je 10 Grad. Die Schummelei bemerkt keiner.

Wenn die Bilder mal gedreht sind verhalten sie sich wie normale Bilder. also ohne Performance Verluste. Deine Probleme müssen von wo anders her stammen.

Setzt doch mal DEBUGLOGs ein und lass Dir dir Zeit in msec ausgeben:

BlitzBasic: [AUSKLAPPEN]
Global Zeit%
....
Repeat
Zeit=MilliSecs()
Cls
...blabla
...blabla
...blabla
DebugLog "Zeitverbrauch"(MilliSecs()-Zeit)
Flip 0
Until KeyHit(1)


Wenn bei sowas Werte über 30 msec herauskommen, kannst Du die Suche verfeinern, um die Quelle eizukreisen:

BlitzBasic: [AUSKLAPPEN]
Global Zeit%
....
Repeat
Zeit=MilliSecs()
Cls
...blabla
DebugLog "Zeitverbrauch"(MilliSecs()-Zeit)
...blabla
...blabla
Flip 0
Until KeyHit(1)


Hat sich der Wert kaum geändert, dann suchst Du in der ersten Hälfte weiter, indem Du DEBUGLOG immer weiter nach oben schiebst.

Ist der Wert jetzt deutlich kleiner, dann liegt Dein Problem in der zweiten Hälfte der Schleife:

BlitzBasic: [AUSKLAPPEN]
Global Zeit%
....
Repeat
Cls
...blabla
Zeit=MilliSecs()
...blabla
...blabla
DebugLog "Zeitverbrauch"(MilliSecs()-Zeit)
Flip 0
Until KeyHit(1)
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

DAK

BeitragDi, Jun 11, 2013 7:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Kanns sein, dass du sie vorberechnest, in der Hauptschleife dann aber wieder RotateImage verwendest? (Glaub ich nicht, von deinem Codesample her, aber nur mal checken)
Gewinner der 6. und der 68. BlitzCodeCompo

Xeres

Moderator

BeitragDi, Jun 11, 2013 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
g4ndhi hat Folgendes geschrieben:
Laut task manager wird nur ein kern benutzt und der ist bei allen aktionen ziemlich ausgelastet.
Dann benutzt du nicht die übliche Timer+Flip(0) Variante. Der Klassiker zum Thema: Hurra, 100 % Auslastung

edit:
g4ndhi hat Folgendes geschrieben:
Und was gibts denn für alternativen kann doch net sein das das so stockt.. z.B. bei CS2D drehen sich ja auch viele schnell und da stockt nix...
CS2D ist doch aber auch BiltzMax, oder nicht? Das benutzt sowieso eine neuere DX bzw. OpenGL Version.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

DAK

BeitragDi, Jun 11, 2013 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@Nur ein Kern wird verwendet: BB hat kein Multithreading, mehr als ein Kern wird also nie ausgenutzt werden.
Gewinner der 6. und der 68. BlitzCodeCompo
 

g4ndhi

BeitragMi, Jun 12, 2013 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Danke für die vielen Antworten..!

Also RotateImage verwende ich nicht weiter sondern nur zum vorberechnen bevor die Schleife anfängt...

Ich Takte die Hauptschleife mit einen Timer auf 60 durchläufe pro sekunde..
Mit den Flip 0 Habe ich auch schon mal rum probiert...

Konnte aber nichts feststellen. Stells mal auf 0 und probier das mit den Debuglogs und zeichne weniger bilder pro Flieger für die drehung...

Danke nochmal für die Antworten...

mal sehen wo der fehler liegt...
 

g4ndhi

BeitragMi, Jun 12, 2013 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Also debug log am schluss der schleife sagt zeitweiße 40 ms an...
zu 80prozent flüssig und dann so kurze stocker mit 40ms

werd die suche mal verfeinern
 

g4ndhi

BeitragMi, Jun 12, 2013 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Es liegt definitiv an der Kollisionsberechnung....

Function kollision()

For i = 1 To 8
If imagesCollide(IMGSCHUSS1,Schuss1img(i,1),SChuss1img(i,2),0,Spieler2(WinkelSPzwei,3)
,posx2,posy2,0) Then (Steht eigentlich in einer Zeile...)

schuss1img(i,3) = 0
schuss1img(i,1) = 0
schuss1img(i,2) = 0
schuss1img(i,4) = 0
gesundheit2 = gesundheit2 - 1
End If

If ImagesCollide (IMGSCHUSS2, Schuss2img(i,1), SChuss2img(i,2),0,Spieler1(WinkelSPeins,3),posx,posy,0) Then
schuss2img(i,3) = 0
schuss2img(i,1) = 0
schuss2img(i,2) = 0
schuss2img(i,4) = 0
gesundheit1 = gesundheit1 - 1
End If


Next

End Function

Midimaster

BeitragDo, Jun 13, 2013 9:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Tatsächlich? Unwahrscheinlich! Wie hoch ist hier der Zeitverbrauch?

Setze die Zeirmessung mal an den Anfang und an das Ende der Funktion:

BlitzBasic: [AUSKLAPPEN]
Function kollision()
locZeit%=MilliSecs()
For i = 1 To 8
If ImagesCollide(IMGSCHUSS1,Schuss1img(i,1),SChuss1img(i,2),0,Spieler2(WinkelSPzwei,3)
.....
.....
Next
DebugLog "Schleife braucht " + (MilliSecs()-locZeit)
End Function


Wenn es wirklich so wäre... Hier Möglichkeiten zu sparen:

Sind wirklich immer alle 8 Schuss unterwegs?

Man könnte eine Variable Schuss1_Raus%(i) bzw Schuss2_Raus%(i) einführen, die gesetzt wird, wenn ein Schuss mit dieser Nr überhaupt unterwegs ist. Dann kann man dies direkt unterhalb von FOR... prüfen und sich so das Collide sparen.

Sehr viel eleganter geht das mit TYPEN... Habt ihr damit schon schon mal experimentiert?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Eingeproggt

BeitragDo, Jun 13, 2013 10:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht hat auch deine Graphikkarte hin und wieder Probleme mit den alten DX7 Befehlen, ImagesCollide ist ohnehin sehr "verdächtig", siehe hier: https://www.blitzforum.de/foru...gescollide

Ich kann mich auch noch erinnern dass ein simples LockBuffer mal 10ms gebraucht hat bei mir... da ist man machtlos wenn die Graphikkarte einfach nicht mehr mitspielt. Sad

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

g4ndhi

BeitragDo, Jun 13, 2013 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Mit imagesOverlap funktioniert es ohne zu ruckeln....
aber is halt nich ganz so genau....

Aber reicht fürs erste mal... Danke darauf wär ich net gekommen das mit collide probleme gibt....


Eine Frage hab ich noch wie kann ich das am einfachsten machen jedes 10te bild zu zeigen...

Vorberechnet habe ich sie jetzt so

For WinkelSPeins = 0 To 35
Spieler1(WinkelSPeins,3) = CopyImage(Player1)
RotateImage Spieler1(WinkelSPeins,3),WinkelSPeins - 90
MidHandle Spieler1(WinkelSPeins,3)
WinkelSPeins = WinkelSPeins + 10
Next

blos im Spiel verändert sich ja der Winkel immer um 1,5 grad.. Grade fällt mir nur ein mit IF aber da muss ich ja 36 If's pro Spieler schreiben... gibts da ne bessere lösung?
 

g4ndhi

BeitragDo, Jun 13, 2013 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ne mit typen hab ich noch nichts probiert....

Meine schwester hat informatik studiert... und schreibt vorwiegen objektorientiert...

wäre schön wenn es sowas ähnliches auf gäbe... weil irgendwie komisch.. in meinen Datenfeld Schuss(i,4)
ist auch ein platz für gibt es oder gibt es nicht. Und drawimage zeichnet nur wenn Schuss(i,4) = 1

ist Schuss(i,4) = 0 setzte ich auch die koordinaten auf null. Fliege ich nun in die Ecke vom Bildschirm bekomm ich einen treffer obwohl gar kein schuss gezeichnet wird weil (i,4) gleich null ist...

Hätte gedacht vll kann man z.B einen Schuss als objekt verwalten mit bestimmten eigenschaften und wenn ein schuss abgegeben wird wird ein objekt aktiviert und sobald treffer oder aus dem rand draußen wieder deaktiviert....

Xeres

Moderator

BeitragDo, Jun 13, 2013 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte benutze Code bzw. Syntax boxen und poste nicht mehrmals hintereinander - editiere stattdessen nach.
Danke.

Types sind sehr zu empfehlen - richtig Objektorientiert kann man in BB nicht programmieren, aber Types kommen dem schon einigermaßen nahe.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragDo, Jun 13, 2013 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
das sind ganz schön viele fragen und baustellen gleichzeitig....

1.
also das mit den 35 statt 359 bilder ist ganz leicht.

Ihr müsst bei RotateImage einfach das Zehnfache des WinkelSPeins% einsetzen:

BlitzBasic: [AUSKLAPPEN]
RotateImage Spieler1(WinkelSPeins,3),WinkelSPeins*10 - 90 


Den echten gemessenen Winkel im Spiel musst du natürlich dann immer durch 10 teilen, damit das richtige Bild gezeichnet wird.



2.
Wenn Du sowieso schon ein 'Flag' Schuss(i,4) hast, das weiß, ob der Schuss existiert oder nicht, dann frage damit doch auch alle zuerst Kollisionen ab. So musst du nicht alle 16 Schüsse testen. Du kannst danach für die wenigen existierenden Schüsse wieder das schönere CollideImage verwenden ohne Performance Probleme zu bekommen.

BlitzBasic: [AUSKLAPPEN]
Function kollision()
locZeit%=MilliSecs()
For i = 1 To 8
If Schuss(i,4)=1
If ImagesCollide(IMGSCHUSS1,Schuss1img(i,1),SChuss1img(i,2),0,Spieler2(WinkelSPzwei,3)
.....
.....
Next
DebugLog "Schleife braucht " + (MilliSecs()-locZeit)
End Function


Den 'Ecke-Treffer' hast Du damit dann auch gleich repariert...



3.
Kennst Du mein TYPE Tutorial?

https://www.blitzforum.de/foru...hp?t=33551
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

g4ndhi

BeitragFr, Jun 14, 2013 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke schon mal für die Antwort! Ne kenne ich nicht. Aber das werde ich mir zu herzen nehmen und beim nächsten Projekt mit Types arbeiten.... Jetzt setze ich erstmal das hier alles um und dann habe ich noch 2 fragen zu meinen Projekt wo ich den Fehler nicht finden kann bzw die Lösung nicht weiß.... Wink

Aber danke für die nette Hilfe!

mfg

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group