Rotate Image.. Spiel Stockt...
Übersicht

g4ndhiBetreff: Rotate Image.. Spiel Stockt... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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% Wenn bei sowas Werte über 30 msec herauskommen, kannst Du die Suche verfeinern, um die Quelle eizukreisen: BlitzBasic: [AUSKLAPPEN] Global Zeit% 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% |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() mfG, Christoph |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
g4ndhi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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.... |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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ß.... ![]() Aber danke für die nette Hilfe! mfg |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group