Seite 1 von 1
ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 09:10
von funkheld
Hallo, guten Tag.
Ich möchte bitte im Canvasfenster eine Grafik verschieben von links nach rechts.
Es soll flimmerfrei sein. Da muss man ja wohl irgendwie im Hintergrund zeichnen und dann in den Vordergrund bringen.
Wie funktioniert das mit einem Canvasfensfer
Danke.
Gruss
Re: ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 09:24
von NicTheQuick
Alles, was zwischen StartDrawing() und StopDrawing() steht, wird auf einmal gezeichnet. Wenn es also flimmefrei sein soll, darfst du pro Schleifendurchlauf nur einmal StartDrawing und einmal StopDrawing aufrufen. Dann ist es schon automatisch flimmerfrei.
Re: ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 10:07
von funkheld
Ja danke.
Das ist ja dann mit dem Canvasfenster einfach geregelt.
Wie kann man das Canvasfenster am schnellsten löschen, ohne eine ganze weiße Box zu zeichnen , wenn es gelöscht werden soll?
Danke.
GRuss
Re: ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 10:54
von NicTheQuick
Ich wüsste nichts was schneller ist als die weiße Box.
Re: ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 10:57
von Bisonte
funkheld hat geschrieben:... ohne eine ganze weiße Box zu zeichnen , wenn es gelöscht werden soll?
Gar nicht.
Die einzigen Möglichkeiten sind entweder nur den Bereich löschen, in dem man neu zeichnen möchte (per Box,Circle oder ähnliches) oder eine andere Farbe als Weiss nehmen.
Wenn z.B. dein Fensterhintergrund schwarz ist, und man das Canvas sowieso schwarz einfärben möchte.... ist Weiss eine schlechte Wahl

Re: ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 11:51
von funkheld
Ja danke.
Ich habe jetzt einen buffer gefunden für das Canvas:
Global buffer.l,pitch.l,PixelFormat.l,zaehler.l
........
StartDrawing(CanvasOutput(#canv))
Buffer = DrawingBuffer()
Pitch = DrawingBufferPitch()
PixelFormat = DrawingBufferPixelFormat()
For zaehler=0 To 480000 Step 3
PokeL(buffer+zaehler,$ffff00)
Next
Stopdrawing()
.........
-----------------------------------------------------
Wer kann mir bitte einmal die Forschleife in den Purebasic-ASM-Code umsetzen?
Sie ist mit Pokel schon schnell mit den löschen des Canvas. Vielleicht geht es mit Asm noch etwas schneller.
Danke.
GRuss
Re: ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 12:29
von NicTheQuick
Ich nehme stark an, dass es mit 'Box()' wesentlich schneller geht. Wieso also so kompliziert? ASM ist hier wahrlich überrissen.
Und nutze in Zukunft bitte die Code-Tags.
Re: ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 12:32
von funkheld
Mit Pokel geht es schon schneller wie mit Box.
Bei Box tritt ab und zu eine Verzögerung ein, als wenn etwas kurzfristig ausbremst.
Darum möchte ich es mit ASM auch mal testen ?
Gruss
Re: ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 13:56
von STARGÅTE
Nun ja, wenn du alles nur erdenkliche bei "deinem For-Schleifen-Versuch" Ignorierst, wie den Pitch und dass du immer ein Byte zu viel schreibst, dann kann er durchaus schneller und falscher werden.
Ach und bitte gewöhne dir an, immer Integers zu nutzen, keine Longs.
Ich nutze auch ein eines Box() und habe damit keine Probleme ("Verzögerung oder Flackern").
Wenn man allerdings flüssige Bewegnugen darstellen möchte, sollte man doch lieber zum Screen wechseln.
Re: ein 3-eck im canvas-fenster veschieben.
Verfasst: 30.03.2016 20:10
von funkheld
Ja das war es.
Hatte einen Tipp bekommen von dem FASM.
Dieses ist 2x schneller wie der Boxbefehl um ein Canvas auszufüllen :
Code: Alles auswählen
StartDrawing(CanvasOutput(#canv))
buffer = DrawingBuffer()
!MOV ebx,dword [v_buffer]
!Repeat 160000
!MOV dword [ebx],$ff0000
!add ebx,3
!End Repeat
StopDrawing()
oder auch dieses:
Code: Alles auswählen
!MOV ebx,dword [v_buffer]
!MOV ecx,160000
!nextbyte:
!MOV dword [ebx],$00ff00
!add ebx,3
!dec ecx
!TEST ecx, ecx
!JNZ nextbyte
Gruss