DrawImage sehr langsam???

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

gochx

Betreff: DrawImage sehr langsam???

BeitragSa, Aug 18, 2007 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

bin absoluter Anfänger in BMax, aber hab hierzu keine richtige Anleitung gefunden:

Ich lade Bilder zu Beginn meines Spiels (also vor der Hauptschleife) mit

Code: [AUSKLAPPEN]
 Global My_bild:Timage=LoadImage( "bild.bmp" )


Also so wie's in den meisten tutorials steht. Wenn ich diese bilder nun in der hauptschleife mit

Code: [AUSKLAPPEN]
 DrawImage(My_bild, X, Y)


lade, funktioniert das zwar perfekt, ist aber sehr langsam Crying or Very sad .


Mein Spiel soll aus gleichartigen Blöcken bestehen die geweils 25x25 pixel groß sind. Schon bei mehr als 20 Blöcken geht die grafik aber ziemlich in die Knie. Ganz schlimm wird's, wenn ich versuche davor ein hintergrundbild zu zeichnen.

Klar, mein Rechner ist alt und langsam, aber ich mache doch bestimmt einen grundlegenden Fehler, oder?

Danke
Gochx

hamZta

Administrator

BeitragSa, Aug 18, 2007 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein paar Infos mehr wären ganz nett.

Schreibe die wichtigsten technischen Daten deines Rechners auf, ausserdem wäre ein bisschen mehr Sourcecode sicherlich hilfreich.

hamZta
Blog.

gochx

BeitragSa, Aug 18, 2007 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Also der Code sieht ungefähr so aus:

Code: [AUSKLAPPEN]

Graphics 800,600,0 'Set graphics mode
SetMaskColor 0,0,0 'Black is the default anyway

'-------------Bilder laden--------------------------'

Global My_Blue:Timage=LoadImage( "blue.bmp" )
Global My_Yellow:Timage=LoadImage( "yellow.bmp" )
Global My_Green:Timage=LoadImage( "green.bmp" )
Global My_Red:Timage=LoadImage( "red.bmp" )
Global My_Mitte:Timage=LoadImage( "mitte.bmp" )
Global My_Back:Timage=LoadImage( "back.bmp" )
Global My_bluegreen:Timage=LoadImage( "bluegreen.bmp" )
Global My_white:Timage=LoadImage( "white.bmp" )
Global S_nomove=LoadSound("nomove.wav")
Global S_rowclear=LoadSound("rowclear.wav")
Global S_blocdown=LoadSound("blocdown.wav")
Global S_turn=LoadSound("turn.wav")


MidHandleImage( My_blue)
MidHandleImage( My_yellow)
MidHandleImage( My_green)
MidHandleImage( My_red)
MidHandleImage( My_bluegreen)
MidHandleImage( My_white)
MidHandleImage( My_Mitte)
MidHandleImage( My_Back)


'==============Beginn Hauptschleife==================='

While Not KeyDown(Key_Escape)

SetRotation(0)
DrawImage(My_Back, 400, 300)


'--------------Blöcke zeichnen--------------------'

DrawImage(My_Mitte, 500,300)

For sXX = 1 To 14
For sX = 1 To 8
   If Array1[sX,sXX,0]>0
      ArrX=sX-1+rowshift
      If (arrX>8) arrX=arrX-8
         X = whichX (arrX,sXX)
      Y = whichY (arrX,sXX)
      SetRotation((360/8)*(arrX-1))
      
      If array1[sX,sXX,0]=1 DrawImage(My_blue, X,Y)
      If array1[sX,sXX,0]=2 DrawImage(My_green, X,Y)
      If array1[sX,sXX,0]=3 DrawImage(My_red, X,Y)
      If array1[sX,sXX,0]=4 DrawImage(My_yellow, X,Y)
      If array1[sX,sXX,0]=5 DrawImage(My_white, X,Y)
      If array1[sX,sXX,0]=6 DrawImage(My_bluegreen, X,Y)
   End If

Next
Next

Flip;Cls
Wend


whichX und whichY sind Funktionen mit denen ich die koordinaten ermittle. Das Beispiel ist natürlich nur nen Ausschnitt, aber vom Prinzip funktioniert das bei mir so. Er zeichnet ja auch richtig, nur ist zu langsam.

Mein Rechner ist nen Pentium mit glaub 500 MB Ram. Ich denk daran kanns aber nicht liegen. Hab schon einige Blitzbasic spiele gespielt, die einwandfrei laufen. z.B. Stranded II und so...
Das hier ist ja wirklich nur einfachste 2D Grafik ohne Extras. Das muss doch gehen!

simi

BeitragSa, Aug 18, 2007 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn ich das so anschaue, sollte doch das wirklich schön micht 60FPS laufen..... Bau doch mal einen FPS-Zähler ein und verwende vielleicht mal Flip 0....
 

battlegorge

BeitragSa, Aug 18, 2007 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
In deinem Code finde ich keinen grösseren Fehler.
Drawimage ist eigentlich sehr schnell.
2000 oder mehr Objekte oder Tiles sind auch auf langsameren PCs kein Problem!
Wieviele ms braucht dein Programm um einen frame zu berechen?
 

Dreamora

BeitragSo, Aug 19, 2007 6:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wenn du dann die FPS misst, bau flip 0 ein statt flip weil du sonst nur die bildschirmwiederholungsrate erhälst
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

gochx

BeitragSo, Aug 19, 2007 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die Hilfe.

Das mit flip 0 hab ich nicht ganz kapiert. Bei mir meldet er da "to many function parameters".

Nichts desto trotz hab ich mal einen Framezähler eingebaut, der so aussieht:

Code: [AUSKLAPPEN]

framestart=MilliSecs() 'vor der Hauptschleife

'---Hauptschleife:

If (frames<1000)
fratime = MilliSecs()-framestart
frames=frames+1
framil=fratime/frames
frasec=(frames*1000)/fratime
End If


Die Zahlen sind eigentlich eindeutig. Ohne das Hintergrundbild liegt frasec, also Frames/Sekunde bei 11, danach sogar nur bei 4. Also entsprechend braucht er ca 80 oder eben 250 Millisekunden für einen Durchlauf der Hauptschleife.

Zum Test hab ich diesen Zähler auch mal in das Demoprogramm plot.bmx eingebaut. Das müsste ja eigentlich sehr schnell gehen. Der komplette Code sieht dann so aus:


Code: [AUSKLAPPEN]

' plot.bmx

' plots a cosine graph
' scrolls along the graph using an incrementing frame variable

Graphics 640,480

frames=0
framestart=MilliSecs()

While Not KeyHit(KEY_ESCAPE)

If (frames<200)
fratime = MilliSecs()-framestart
frames=frames+1
framil=fratime/frames
frasec=(frames*1000)/fratime
End If


   Cls
   For x=0 To 640
      theta=x+frame
      y=240-Cos(theta)*240
      Plot x,y
   Next
   frame=frame+1
   
   DrawText "Frames: " + frames, 20, 280
        DrawText "Frametime:" + fratime , 20, 350
        DrawText "FrameMil:" + framil , 20, 400
        DrawText "FrameSec:" + frasec , 20, 450
   
   Flip
Wend


Ergebnis: ca. 20 Frames pro Sekunde, 50ms pro Frame.

Vielleicht hab ich ein Problem mit meinem Grafikkartentreiber oder so. Läuft BMax standardmäßig immer mit OpenGL oder kann man das umschalten?
 

Dreamora

BeitragSo, Aug 19, 2007 10:13
Antworten mit Zitat
Benutzer-Profile anzeigen
du benutzt nicht evtl die Demo?
Falls doch: Hat keinen Zweck, die Demo basiert auf fast 1.5 jahre altem Code auf Windows und hat nur wenig bis nichts mit der aktuellen BM Version zu tun.
Sie ist langsam, instabil und bugverseucht.
Sie dient lediglich dem was der Name sagt: Antesten der Sprache.
Mehr kannst du damit nicht machen, etwas "ernsthafteres" damit zu starten wäre nutzlos da Teile des Codes inkompatibel sind mit der aktuellen BM Version


Von deinen FPS her würd ich sagen, dass du ne grottige Grafikkarte hast die sich mit OpenGL noch weniger verträgt. (BM hat keinen 2D Modus, alles was du siehst ist 3D gerendert und in 2D projiziert)


Würd auch erklären, warum du nirgends ein Strict hast welcher wohl einer der wichtigsten Befehle ist und ohne welchen der Code eigentlich inakzeptabel ist (wegen einigen Optimierungen Seitens BM, die ohne Strict / SuperStrict nicht aktiv sind)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

gochx

BeitragSo, Aug 19, 2007 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
du benutzt nicht evtl die Demo?


Doch, hab noch genau 11 Tage, danach wollt ich über den Kauf entscheiden. Wie gesagt, ich bin absoluter Anfänger und hatte eigentlich nur versucht die Sprache anzutesten und ob ich damit auch wohin komm. Eigentlich funktioniert mein kleines Testspiel bis auf die Geschwindigkeitsprobleme auch perfekt (bin richtig stolz drauf was man in genau drei Tagen BMax lernen kann Cool ).

Dreamora hat Folgendes geschrieben:
Falls doch: Hat keinen Zweck, die Demo basiert auf fast 1.5 jahre altem Code auf Windows und hat nur wenig bis nichts mit der aktuellen BM Version zu tun. Sie ist langsam, instabil und bugverseucht.


Ok, dann kann die Kaufversion ja nur besser sein.

Dreamora hat Folgendes geschrieben:
Von deinen FPS her würd ich sagen, dass du ne grottige Grafikkarte hast die sich mit OpenGL noch weniger verträgt.


Auch hier ja, hab ja wie gesagt nen alten Rechner. Allein an der Karte kanns aber wirklich nicht liegen. Wie gesagt, andere vorkompilierte Programme funktionieren echt gut. Liegt wahrscheinlich dann doch an der Demoversion.

Dreamora hat Folgendes geschrieben:
Würd auch erklären, warum du nirgends ein Strict hast welcher wohl einer der wichtigsten Befehle ist und ohne welchen der Code eigentlich inakzeptabel ist


Ok, werds mir für meinen weiteren Lernprozess merken. Hab ich zwar in den Tutorials gelesen, aber in den Beispielen ist das bei der Demo glaub weitestgehend nicht so.


Also danke für die Mühen, hab nicht damit gerechnet, dass das an der Demoversion liegen könnte. Werds dann wohn doch besser gleich mit der Vollversion versuchen.
 

Dreamora

BeitragSo, Aug 19, 2007 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Hauptgrund warum vorkompiliertes schneller läuft ist weil mit 1.16 ein DX Modul dazu kam ... das hilft im Falle von OpenGL "inkompatibler" oder einfach Onboard Hardware (Intel, S3, SiS) dann doch beträchtlich Smile

Solltest du dich zum kauf entscheiden wird das ganze bedeutend schneller werden Smile

Kannst ja mal im Module Board Vertex Mapeditor.de.vu Modul ansehen, da ist ein Sample drin ... das würde ich empfehlen mal anzusehen (SNES Zelda map), damit du ein Gefühl dafür bekommst was Tilesystem mässig mit der Kaufversion möglich ist. Smile

Aber find ich gut, dass du obwohl du nur die Demo antestest und nur 3 Tage damit geübt hast, dennoch soviel Eigeninitiative zeigst etc Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

gochx

BeitragSo, Aug 19, 2007 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den tipp. Sieht wirklich gut aus und funktioniert auch bei meiner Grafikkarte einwandfrei.

Dann werd ich wohl mal mein Konto plündern und die Vollversion bestellen. Mein Interesse an BlitzMax ist auf jeden Fall geweckt Very Happy

gochx

BeitragFr, Aug 24, 2007 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also zur Ergänzung für alle die ein ähnliches Problem haben:

Ich hab soeben den Download Link zu meiner eigenen BlitzMax Vollversion bekommen. Nach der Installation und den entsprechenden Updates bin ich wirklich begeistert Very Happy
Mein Spiel läuft einwandfrei und die Geschwindigkeit ist wirklich top. Hätte nicht gedacht, dass die Veränderungen gegenüber der Demoversion noch soviel aus meiner alten Kiste rausholen können.

Das einzige was ich nicht versteh ist warum die dann so ne alte Demoversion überhaupt online stellen. Ist für jeden der ernsthaft Interesse hat zunächst irritierend. Naja....
 

Dreamora

BeitragFr, Aug 24, 2007 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wird leider niemand je verstehen.
Verschiedene User (darunter auch ich immer wieder ma) haben BRL schon darauf aufmerksam gemacht, dass die BM Demo die für Windows erhältlich ist, schon seit nem Jahr nichts mehr mit Blitz zu tun hat und ob sie diese nicht entweder endlich updaten oder entfernen könnten.

Derzeit taugen bestenfalls die OSX Versionen was aber selbst die sind noch veraltet, zb haben sie noch die alte TList und TMap implementation und einige nicht unwichtige Fixes im Kern und GC fehlen da auch noch.

Hoffen wir von daher Mal das es mit der nächsten Version auch ne neue Demo gibt aufgrund der bis anhin angekündigten neuen Dingen wie Reflection, der neuen IDE etc.
Wann die Version hingegen kommt ist ne andere Frage ^^
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group