2D ziemlich langsam.
Übersicht

SilvioBetreff: 2D ziemlich langsam. |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich hab bei 1553 Bildern immernoch ~126 FPS ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die Bilder lade ich vor der Schleife ![]() 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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Silvio
Dann poste dein Code? |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Silvio |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Aha dann war das das ![]() 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]
Edit: Ich sollte auch sonst was besseres lernen, weil die Bewegung selbst bei keinem Bild stotternd verläuft. |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
"2D langsam" stimmt also nicht.
Benütze Floats ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Silvio |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Silvio |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Silvio |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich kann dir auch nur Draw3D2 empfehlen... ist sauschnell und du hast viel mehr möglichkeiten! | ||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Propellator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Aber wo kann ich denn Draw3D2 lernen. Ich habe es geladen, aber habe jetzt keine Ahnung, wie ich anfangen soll. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group