ein 3-eck im canvas-fenster veschieben.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

ein 3-eck im canvas-fenster veschieben.

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ein 3-eck im canvas-fenster veschieben.

Beitrag 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.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: ein 3-eck im canvas-fenster veschieben.

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ein 3-eck im canvas-fenster veschieben.

Beitrag von NicTheQuick »

Ich wüsste nichts was schneller ist als die weiße Box.
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: ein 3-eck im canvas-fenster veschieben.

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: ein 3-eck im canvas-fenster veschieben.

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ein 3-eck im canvas-fenster veschieben.

Beitrag 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.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: ein 3-eck im canvas-fenster veschieben.

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ein 3-eck im canvas-fenster veschieben.

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: ein 3-eck im canvas-fenster veschieben.

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