2D ziemlich langsam.

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Silvio

Betreff: 2D ziemlich langsam.

BeitragMi, Feb 22, 2012 10:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ein kleines Testprogramm geschrieben, mit welchem ich auf Knopfdruck Objekte erstellen oder löschen kann. Für jedes Objekt wird ein 32x32 Bild angezeigt. Bei wenigen Bildern läuft das noch einigermaßen, aber wenn das dann mehr als 20 werden, dann wird es kritisch.
Ich hab gelesen, dass 2D langsamer ist, als 3D. Ich möchte aber ein 2D Spiel schreiben. Ich suche die ganze Zeit schon nach Tutorials oder ähnlichem, aber habe keinen Erfolg. Hat jemand einen Tipp für mich ?

Xeres

Moderator

BeitragMi, Feb 22, 2012 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann sein, das du etwas falsch machst, 20 Bilder sollten kein Problem darstellen.
Mit 3D nutzt man die Grafikkarte aus, selbst wenn man nur 2D anzeigen möchte. Draw3D2 für Blitz3D ist sehr empfehlenswert, wenn du nicht auf Blitzmax umsteigen willst. Bilder mit Transparenz und die beliebige Rotation möchte ich wirklich nicht mehr missen.
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

BeitragMi, Feb 22, 2012 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
da machst du sicherlich was falsch! 20 Bilder in 32x32 machen sich nicht mal bemerkbar in der Performance!

Wie lange ist denn der Code? Stell ihn doch hier rein.

Möglicherweise lädst Du die Bilder nicht vor der Hauptschleife, sondern immer wieder innerhalb der Hauptschleife? Eine der häufigsten Ursachen für solche heftigen Einbrüche.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Mi, Feb 22, 2012 11:19, insgesamt 2-mal bearbeitet

ozzi789

BeitragMi, Feb 22, 2012 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab bei 1553 Bildern immernoch ~126 FPS Rolling Eyes

Code: [AUSKLAPPEN]
Graphics 1024,768,32,2


image=CreateImage(32,32)
SetBuffer ImageBuffer(image)
For x=0 To 31
   For y=0 To 31
      Color Rand(0,255),Rand(0,255),Rand(0,255)
      Plot x,y
   Next
Next
Color 255,255,255

SetBuffer BackBuffer()

Type obj
   Field x
   Field y
End Type

counter=0

While Not KeyHit(1)
   Cls
      md=MouseDown(1)
      md2=MouseDown(2)
      
      mx=MouseX()
      my=MouseY()
      If  md
         o.obj=New obj
         o\x=mx
         o\y=my
         counter=counter+1
      EndIf

      For o.obj = Each obj
         DrawImage image,o\x,o\y
         If mx>o\x And mx<o\x+32 And my>o\y And my<o\y+32 And  md2
            Delete o.obj
            counter=counter-1
         EndIf
      Next
      
      MSC=MilliSecs()
      If MSC>MTS Then
      MTS=MTS+1000: FPS=FRM: FRM=1
      If MSC>MTS+2000 Then MTS=MSC
      Else: FRM=FRM+1: End If
   
      Text 0,0,"Images beeing renderd: "+counter +"     FPS:"+FPS
      
   Flip 0
Wend
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Silvio

BeitragMi, Feb 22, 2012 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Bilder lade ich vor der Schleife Very Happy
Wenn ich alle Bilder mit den Pfeiltasten herumbewege, dann fühlt es sich bei 20 Bildern ganz leicht spürbar langsamer an, als bei nur einem Bild. Je mehr Bilder, desto größer der Unterschied.
Kann mir bitte kurz jemand sagen, wie ich hier Blitzcode anzeige, dann kann ich ein paar Sachen besser zeigen.

Xeres

Moderator

BeitragMi, Feb 22, 2012 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Unter den Smilies gibt es ein "BB" kästchen, einfach anklicken und da deinen Code einfügen.
Code: [AUSKLAPPEN]
[syntax="bb"]Dein Code[/syntax]

BlitzBasic: [AUSKLAPPEN]
Dein Code
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)
  • Zuletzt bearbeitet von Xeres am Mi, Feb 22, 2012 12:14, insgesamt einmal bearbeitet

ozzi789

BeitragMi, Feb 22, 2012 12:13
Antworten mit Zitat
Benutzer-Profile anzeigen
@Silvio

Dann poste dein Code?
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Silvio

BeitragMi, Feb 22, 2012 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha dann war das das Very Happy
Ich bin neu hier...
Ich teste das mal direkt.

hier tu ich bei jedem Schleifendurchgang die Variable move_zahl um 1 erhöhen und abfragen wie die gerade ist. So senke ich die Bewegungsgeschwindigkeit, weil die Bilder sonst ja bei jedem Durchgang um 1 Pixel verschoben werde. Daran liegt das ganze wohl. Ich bin erst gerade auf frameunabhängiges Programmieren umgestiegen sozusagen, deshalb ist das noch so primitiv.
BlitzBasic: [AUSKLAPPEN]

If KeyDown(17) Then

move_zahl = move_zahl + 1

If move_zahl > 3 Then

move = 1
move_zahl = 0

Else

move= 0

EndIf

For b.Gegner_1 = Each Gegner_1
b\y_coord = b\y_coord - (move * SchleifenZeit)
Next

EndIf



Edit: Ich sollte auch sonst was besseres lernen, weil die Bewegung selbst bei keinem Bild stotternd verläuft.

ozzi789

BeitragMi, Feb 22, 2012 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
"2D langsam" stimmt also nicht.
Benütze Floats um sanfte Bewegungen zu realisieren
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Silvio

BeitragMi, Feb 22, 2012 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte noch fragen:
Ich messe ja die Zeit, die das Programm brauch, um durch den Code zu gehen. Diese Zeit multipliziere ich dann mit einer Zahl. Kann es da nicht sein, dass bei der Messung manchmal etwa 0 rauskommt und das Bild dann nicht bewegt wird?
Und wenn ich Floats benutze, wo wird dann ein Bild mit x = 10.5 gezeichnet? Wird das gerundet?

Xeres

Moderator

BeitragMi, Feb 22, 2012 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Computer sind schnell - es kann natürlich sein, dass ein Schleifendurchlauf weniger als eine ganze Millisekunde braucht.
BB übernimmt überall das Konvertieren von Variablen, wo es nötig/möglich ist, Float wird automatisch zu Int gecastet.
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)
 

Silvio

BeitragMi, Feb 22, 2012 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal als Test ein paar Zahlen ausprobiert. Es wird ganz normal auf- und abgerundet. Also 1.5 ist 2 und 1.4 ist 1. Das bringt mir ja nix. Da bekomm ich keine Geschwindigkeit kleiner als 1 Pixel pro Schleifendurchlauf hin. Wie macht ihr das denn?

Xeres

Moderator

BeitragMi, Feb 22, 2012 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast eine Float Variable, zu der du Werte kleiner 1 hinzu addieren kannst. Die benutzt du zum zeichnen. Dabei wird die Variable zwar gerundet, aber sie behält ja ihren Wert bei - irgendwann ist sie dann gleich/größer x.5 und das Bild wird ein Pixel weiter gezeichnet. Probiers aus.
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)
 

Silvio

BeitragMi, Feb 22, 2012 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha habe meinen Fehler gefunden. Im Type-Field von allen Objekten die bewegt werden waren die Positionen als ganze Zahlen festgelegt. So wurde dann immer gerundet, auch wenn ich Zahlen kleiner als 1 addiert habe. Es läuft auch ziemlich flüssig und es ist eigentlich kein Unterschied zwischen 5 und 100 Objekten festzustellen. Danke für die Tipps. Dann wäre das Problem erstmal aus der Welt geschafft.

Iguan

BeitragMi, Feb 22, 2012 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann dir auch nur Draw3D2 empfehlen... ist sauschnell und du hast viel mehr möglichkeiten!
 

PacMani

BeitragMi, Feb 22, 2012 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Außerdem fällt man oft auch darauf rein, "fälschlicherweise" Graphics() anstatt Graphics3D() zu nutzen (selbst wenn du nur Bilder zeichnen willst). Graphics3D ist bei den neuen Grafikkarten deutlich schneller, keine Ahnung, wie vermurkst die Treiber heute alle sind, um mit Graphics() nicht mehr klar zu kommen.

Xeres

Moderator

BeitragMi, Feb 22, 2012 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Treiber sind in Ordnung, das Problem liegt eher am veraltetem DirectDraw...
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)

Propellator

BeitragMi, Feb 22, 2012 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
keine Ahnung, wie vermurkst BlitzBasic ist, um mit Graphics() nicht mehr klar zu kommen.

Fixed that for you.

Und meine Erfahrung war, dass Graphics() schneller ist als Graphics3D. Kann aber durchaus Treiberabhängig sein.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.
 

PacMani

BeitragMi, Feb 22, 2012 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, DirectDraw ist natürlich auch veraltet (was an Microsofts Softwarepolitik liegt, was ich aber noch am meisten verstehen kann. Wer will schon seine alten Software-Liebchen am Leben erhalten), und damit eben auch Blitz3D. Aber es gibt eben auch Treiber, die behaupten, sie müssen DirectDraw nicht mehr richtig unterstützen, nur noch Auflösungen bis 800x600 runter oder gar 1024x768, oder eben garkeine Initialisierung einer DX7-Schnittstelle ermöglichen (Intel hat hier ja am häufigsten geschlachtete Treiber ausgeliefert, die das nicht mehr können).
 

Silvio

BeitragDo, Feb 23, 2012 3:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber wo kann ich denn Draw3D2 lernen. Ich habe es geladen, aber habe jetzt keine Ahnung, wie ich anfangen soll.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group