CLS weglassen?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

FOODy

Betreff: CLS weglassen?

BeitragMi, Mai 16, 2007 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute.
Ich hab ne frage zum Grafischem Teil von BlitzMax.
Ich würd gerne nicht jedesmal alles neuzeichnen sondern nur das was wirklich neugezeichnet muss. (z.b. durch umpositionierung oder textänderungen)

Weiß nicht genau wie ich es erklären soll.
Halt zum Beispiel bei einer Tilemap.
Ich würd es gerne so haben das dort nur die Tiles neugezeichnet werden bei denen es änderungen gab oder über denen etwas "übergezeichnet" wurde (z.b. der Spieler).

Mein Problem ist jetzt, dass es manchmal seltsame Sachen zu sehen gibt wenn man das CLS weglässt.

CLS leert (soweit ich weiß) doch einfach "nur" den Backbuffer.
Wenn ich es weglasse kommen beim Fullscreen aber grafische Störungen.


Hier ist ein Beispielcode der bei mir funktioniert, bei nem Freund aber nicht (er hat ne "geforce 6200go with turbocache"):
Code: [AUSKLAPPEN]
SuperStrict
Framework BRL.GLMax2D

Graphics 800,600,0

Local mx:Int,my:Int,tmp_mx:Int,tmp_my:Int
HideMouse
Cls
   SetColor 0,0,0
   DrawRect 0,0,GraphicsWidth(),GraphicsHeight()
   SetColor 255,255,255
Flip
Cls
Flip
Cls
Repeat
   mx=MouseX()
   my=MouseY()
   If tmp_mx<>mx Or tmp_my<>my
      SetColor 0,0,0
      DrawRect tmp_mx-2,tmp_my-2,5,5
      SetColor 255,255,255
      tmp_mx=mx
      tmp_my=my
      DrawOval mx-2,my-2,5,5
      Flip
   EndIf
Until AppTerminate() Or KeyDown(KEY_ESCAPE)


Ob das Beispiel jetzt genug aussagt weiß ich nicht, aber ich hoffe ihr wisst was ich meine...
Freue mich auf jeden hilfreichen post!


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

porcus

BeitragMi, Mai 16, 2007 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst ja statt cls an der Stelle, wo das Tile ist ein Rechteck drüberziehen.
Cls macht ja eigentlich auch nichts anderes, als ein Rechteck von 0,0 bis
zur Breite,Höhe zu ziehen.
*Account deaktiviert*

BtbN

BeitragMi, Mai 16, 2007 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Da kann er auch gleich CLS nehmen, ist nebenbei auch noch schneller.
 

porcus

BeitragMi, Mai 16, 2007 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja aber er will aber anscheinend kein Cls nehmen.
*Account deaktiviert*

BtbN

BeitragMi, Mai 16, 2007 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, er will nicht CLS weg lassen, er will nicht alles neu zeichnen.
Und ob es es nurn überzeichnet oder per CLS weg macht, beides führt dazu, dass er es neu zeichnen muss.

Lunatix

BeitragMi, Mai 16, 2007 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Normal wird ein programm nicht durch CLS langsam sondern durch die sachen die gezeichnet werden... wenns nur tiles sind, klepto's minib3d und schreib dir ne kleine SingleSurface Tilelib=)
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

FOODy

BeitragMi, Mai 16, 2007 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will _kein_ (oder zumindest ein kontrolliertes cls, per Viewportänderung) CLS verwenden damit ich ebend _nicht_ alles Neuzeichnen muss. Very Happy
MiniB3D möchte ich dafür nicht verwenden, wüsste auch nicht wieso es dort besser funktionieren sollte.

Hier ist ein etwas erweitertes Beispiel:
Code: [AUSKLAPPEN]
SuperStrict
Framework BRL.GLMax2D

Graphics 800,600,0,-1

Local mx:Int,my:Int,tmp_mx:Int,tmp_my:Int
HideMouse
Cls
   SetColor 0,0,0
   DrawRect 0,0,GraphicsWidth(),GraphicsHeight()
   SetColor 255,255,255
Flip
Cls
Flip
Cls

Local mode:Byte=1

Repeat
   mx=MouseX()
   my=MouseY()
   If KeyHit(KEY_SPACE) mode=Not mode
   If mode
        tmp_mx=mx
        tmp_my=my
      Cls
      SetColor 255,255,255
      DrawText "(1)FPS: "+GetFps(),0,0
     
      SetColor 255,0,0
      DrawOval 128,128,128,128
      SetColor 255,255,255
     
      DrawOval mx-2,my-2,5,5
   Else
      SetColor 0,0,0
      DrawRect 0,0,128,20
      SetColor 255,255,255
      DrawText "(0)FPS: "+GetFps(),0,0
   
      If tmp_mx<>mx Or tmp_my<>my
   
         SetColor 0,0,0
         DrawRect tmp_mx-2,tmp_my-2,5,5
         SetColor 255,255,255
   
      If tmp_mx>=128 And tmp_mx<=256 And tmp_my>=128 And tmp_my<=256
         SetColor 255,0,0
         DrawOval 128,128,128,128
         SetColor 255,255,255
      EndIf
     
         tmp_mx=mx
         tmp_my=my
         DrawOval mx-2,my-2,5,5
      EndIf
   EndIf
   Flip
Until AppTerminate() Or KeyDown(KEY_ESCAPE)

Function GetFps:Int()
   Global fps:Int
   Global count:Int
   Global time:Int
   If MilliSecs()>time
      fps=count
      count=0
      time=MilliSecs()+1000
   Else
      count:+1
   EndIf   
   Return fps
EndFunction



Gruß,
FOODy


EDIT:
Also mode 1 ist mit CLS und mode 0 ohne.
Mit der leertaste ändert ihr den Modus.
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

Dreamora

BeitragMi, Mai 16, 2007 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du irgend etwas zeichnest, das sich ändert, dann musst du CLS oder komplett übermalen.

Da es nicht sinnvoll möglich ist, in einen Texturebuffer zu zeichnen (BM hat keine Images), gehen solche tricks wie "1x tiles zeichnen restliche zeit den gesamten backdrop" nicht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

mull

BeitragDo, Mai 17, 2007 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Es werden glaub ich nur die Adressen der Buffer getauscht.

Was du auf den Backbuffer ohne löschen zeichnest, zeichnest du auf die Grafik des vorhergegangenen Backbuffer.

Was du jetzt siehst(Frontbuffer) wird beim nächsten Flip der Backbuffer u.s.w

Ich habe das mal mit einem selbsterstellten Button gemacht, den habe ich nur bei jedem 2ten Frame gesehen.

BladeRunner

Moderator

BeitragDo, Mai 17, 2007 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz einfache Frage: Wieso willst Du das ?
Du wirst durch irgendwelche Teilzeichnungslösungen kaum einen spürbaren Speedvorteil erlangen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

FOODy

BeitragDo, Mai 17, 2007 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@mull:
Daran liegt das nicht wirklich.
Hatte auch schon versucht nur den Frontbuffer zu verwenden, gab aber das gleiche Resultat im Vollbild.


@Bladerunner:
Bei normalen Grafischen Anwendungen braucht das Zeichnen am meisten Zeit und wenn dann jedesmal nur stückweise neugezeichnet wird (und wieder nur die benötigten bereiche) dann wird es schon automatisch schneller laufen. (und ich denke nicht das es kaum spürbar sein wird, wobei das auch relativ dazu ist wieviele bereiche sich jedesmal ändern)

Ich hab nicht viel mit Java gemacht, aber da gab es diese Imagebuffer.
Sowas in der art brauche ich auch in Blitzmax.
Oder sind die Imagebuffer in Java genauso "langsam" wie die Pixmaps in Blitzmax?



Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

mahe

BeitragDo, Mai 17, 2007 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Du müsstest die Zeichenbefehle immer doppelt ausführen:

Einmal zeichnen.
"Flipen"
Dann noch einmal dasselbe zeichnen
und gleich darauf die Neuerungen zeichnen.

Nach jedem "flip" also erst wieder alles alte und dann erst das neue zeichnen.

Allerdings ist dann wahrscheinlich (je nach Anwendung) der Geschwindigkeitsvorteil weg.


Richtige Imagebuffer wie in den vorhergehenden BlitzVersionen gibt es in BlitzMax nicht.
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group