CLS weglassen?
Übersicht

![]() |
FOODyBetreff: CLS weglassen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da kann er auch gleich CLS nehmen, ist nebenbei auch noch schneller. | ||
porcus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja aber er will aber anscheinend kein Cls nehmen. | ||
*Account deaktiviert* |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich will _kein_ (oder zumindest ein kontrolliertes cls, per Viewportänderung) CLS verwenden damit ich ebend _nicht_ alles Neuzeichnen muss. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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ɹɹǝ, |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group