DrawImage zu lahm????

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

DrawImage zu lahm????

Beitrag 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]
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

normal, da GDI.

Nimm Openwindowedscreen und sprites.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag 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.. ?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Zuletzt geändert von Kaeru Gaman am 26.12.2004 00:42, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag 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
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag 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 :(
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Serge
Beiträge: 66
Registriert: 20.09.2004 20:44
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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.
Antworten