Seite 1 von 2

DrawImage zu lahm????

Verfasst: 25.12.2004 23:12
von Leo
Hi,

für mein aktuelles Projekt, einen Map Editor benutz ich folgenden Code Schnipsel um die Map auf einem ImageGadget anzuzeigen:

Code: Alles auswählen

  If Editor_RedrawMap = 1
    For Y = 0 To 1
      For X = 0 To MapInfo\Width
        For Z = 0 To MapInfo\Height
          Select Y
            Case #Layer_Underground
              UseImage(#ImageID_Underground)
            Case #Layer_Objects
              UseImage(#ImageID_Objects)
          EndSelect
          If Map(X,Z,Y)\X <> -1
            Map(X,Z,Y)\TempImageID = CreateClippedImage(Map(X,Z,Y)\X*#TileWidth,Map(X,Z,Y)\Y*#TileHeight,#TileWidth,#TileHeight,ImageID())
          EndIf 
        Next 
      Next
    Next
    
    UseImage(#ImageID_MapOld)
    StartDrawing(ImageOutput())
    For Y = 0 To 1
      For X = 0 To MapInfo\Width
        For Z = 0 To MapInfo\Height
          If Map(X,Z,Y)\X <> -1
            DrawImage(UseImage(Map(X,Z,Y)\TempImageID),X*#TileWidth,Z*#TileHeight)
            FreeImage(Map(X,Z,Y)\TempImageID)
          EndIf 
        Next
      Next
    Next
    StopDrawing()
    
    SetGadgetState(#Image_Map,UseImage(#ImageID_MapOld))
    
    Editor_RedrawMap = 0
  EndIf 
Editor_RedrawMap wird bei linkem Mausklick auf eins gesetzt...

CreateClippedImage Prozedur:

Code: Alles auswählen

Procedure CreateClippedImage(X,Y,Width,Height,ImageID)
  Img = CreateImage(#PB_Any,Width,Height)
  UseImage(Img)
  StartDrawing(ImageOutput())
  DrawImage(ImageID,-X,-Y)
  StopDrawing()
  ProcedureReturn Img 
EndProcedure
Doch das ganze ist vieeel zu langsam.. Könnt ihr mir helfen??

P.S.: Ich muss die ganzen For/Next schleifen 2 mal aufrufen weil man ja kein StartDrawing in nem StartDrawing aufrufen kann.. :([/code]

Verfasst: 25.12.2004 23:20
von GPI
normal, da GDI.

Nimm Openwindowedscreen und sprites.

Verfasst: 25.12.2004 23:34
von Leo
GPI hat geschrieben:normal, da GDI.

Nimm Openwindowedscreen und sprites.
Naja ich will halt resizable.. wenn es ne procedure zum resizen von windowedscreens gäb dann würd ichs sofort benutzen

edit: soll ichs vielleicht mit dc auf window versuchen?
edit: vielleicht kennt hier jemand den rpg maker 2k .. ich frag mich wie der das regelt.. der läuft auf jeden fall auch in ner scroll area.. ?

Verfasst: 26.12.2004 00:37
von Kaeru Gaman
PB Hilfe zu OpenWindowedScreen() hat geschrieben:Öffnet einen neuen Bildschirm entsprechend den angegebenen Parametern auf dem angegebenen Fenster 'WindowID'. Ist 'AutoStretch' gleich 1, dann wird die Größe des Bildschirmbereichs automatisch angepasst, wenn sich die Fenstergröße ändert.
ich persönlich würde einen fullscreen nem window vorziehen, aber das ist geschmackssache...

Verfasst: 26.12.2004 00:41
von Leo
Kaeru Gaman hat geschrieben:
PB Hilfe zu OpenWindowedScreen() hat geschrieben:Öffnet einen neuen Bildschirm entsprechend den angegebenen Parametern auf dem angegebenen Fenster 'WindowID'. Ist 'AutoStretch' gleich 1, dann wird die Größe des Bildschirmbereichs automatisch angepasst, wenn sich die Fenstergröße ändert.
XD

Danke :DDD

Verfasst: 26.12.2004 00:51
von Leo
Naja aber da wird jetz der windowed screen auf dei ganze fenstergröße resizet, aber ich brauch ja noch platz für die tilesets etc :(

Verfasst: 26.12.2004 11:58
von PMV
öhm ... diese Funktion funktioniert nicht so, das bei vergrößerung oder verkleinerung mehr Pixel zur verfügung stehen, sondern die verhandenen umgerechnet werden. Also die Auflösung bleibt die selbe, es erscheint lediglich alles nur vergrößert oder verkleiniert ... gibt je nach verwendung nicht ganz so prikelnde Ergebnisse /:-> ... das Prob hab ich mal gehabt

Aber fals dich das nicht stört oder gar dir vorteile verschaft, ists ja ok, wollt nur drauf hinweißen :D .

Und zu Screen ... wenn du nicht al zu viele Sprites hast, die angezeigt werden müssen, dann könnteste ja jedes mal den Screen neu erstellen und die paar Sprites neu laden, so hab ich das bei nem Chatfenster gelöst, bei wenig Sprites fällt dies dem User nicht auf, da es immer noch schnell genug ist. Rein Theoretisch könnteste auch alles dafür immer noch in Images laden und dann mit DrawImage() arbeiten. Da du mit den Grafiken ja anscheinend eh nichts besonderes machen willst, wäre das eventuell auch ne möglichkeit. Müsste halt ausgetestet werden ;-)

MFG PMV

Verfasst: 26.12.2004 16:21
von Serge
Leo hat geschrieben:
GPI hat geschrieben:normal, da GDI.

Nimm Openwindowedscreen und sprites.
Naja ich will halt resizable.. wenn es ne procedure zum resizen von windowedscreens gäb dann würd ichs sofort benutzen

edit: soll ichs vielleicht mit dc auf window versuchen?
edit: vielleicht kennt hier jemand den rpg maker 2k .. ich frag mich wie der das regelt.. der läuft auf jeden fall auch in ner scroll area.. ?
Er wurde ja auch nicht in PB programmiert :)
Wie PMV schon sagte, funktioniert das reziseScreen anders als es sich manche denken ;)
Ich kenn mich mit Images nicht so aus, und weis nicht in wiefern die Folgende Idee auch mit Images Realisierbar wäre:
Man zeichnet die ganzen Tiles einmal auf und zeichnet sie nicht jedesmal neu sondern immer nur das neu veränderte Tile.
Bei Sprites könnte man dies einfach lösen, indem man die Tiles auf ein Bildschirmgroßes Sprite zeichnet und dann das Sprite anzeigt und wenn da ein neuer Tile gesetzt wird, man einfach nur das Tile neu auf das Sprite zeichnet.

Verfasst: 26.12.2004 17:02
von Zaphod
verstehe ich das richtig, dass du immer erst das gesamte level zeichnest und dann den bereich den du zur anzeige brauchst rausclippst? dann ist es doch kein wunder das es langsam ist, währe es auch mit sprites. zeichne doch einfach immer nur den bereich den du brauchst.

Verfasst: 27.12.2004 11:51
von Lebostein
Die ganzen Drawing-Befehle sind lahm (und dann wird noch behauptet, PureBasic sei schnell, naja...).

Schon alleine der Befehl Startdrawing() bremst den Rechner aus. Er sollte nur möglichst nur einmal benutzt werden. Am schlimmsten ist aber der Box-Befehl. Laaaangsaaaam. Lieber in der Laufzeit mit CreateSprite() und UseBuffer() eine Box erzeugen, dass ist hundertmal schneller...

...also ich versuche die Drawing-Befehle möglichst immer zu vermeiden.