2D Drawing: StartDrawing()/StopDrawing() bremsen aus

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: 2D Drawing: StartDrawing()/StopDrawing() bremsen aus

Beitrag von Danilo »

walbus hat geschrieben:

Code: Alles auswählen

...

StartDrawing(ImageOutput(#Image_3))
*buffer_3=DrawingBuffer()
StopDrawing()

StartDrawing(ImageOutput(#Image_2))
*buffer_2=DrawingBuffer()
StopDrawing()

...
Drawing-Funktionen funktionieren nur innerhalb StartDrawing() und StopDrawing().
Dazu gehören auch die Buffer-Befehle - die sind nach StopDrawing() nicht mehr gültig.

Auf Windows funktioniert das zufällig, auf dem Mac läuft kein einziger der Codes
von Christian+, mk-soft und walbus.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: 2D Drawing: StartDrawing()/StopDrawing() bremsen aus

Beitrag von NicTheQuick »

Ach krass. Das wusste ich gar nicht. Also kann man es mit Purebasic-internen Mitteln gleich vergessen auf mehreren Bildern gleichzeitig zu hantieren. Man muss also das Bild vorher immer in bspw. ein 2D-Array kopieren, dann darauf arbeiten und anschließend wieder zurück kopieren?
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: 2D Drawing: StartDrawing()/StopDrawing() bremsen aus

Beitrag von Christian+ »

Also, dass man DrawingBuffer() nur innerhalb der StartDrawing und StopDrawing Befehle aufrufen kann ist klar. Aber ich dachte immer DrawingBuffer gibt einfach den Speicherbereich zurück an dem sich das Bild im RAM befindet. Dieser sollte sich dann ja nicht verändern egal ob StopDrawing aufgerufen wird oder nicht. Bist du dir sicher, dass es daran liegt, dass der Code bei dir auf dem Mac nicht läuft? Was bekommst du denn als Fehlermeldung? Unter Windows und Linux Funktioniert der Code Problemlos es ist wenn also ehr so, dass Mac OS sich an dieser Stelle anders verhält wieso auch immer. Schade, dass ich keinen Mac habe um sowas mal zu Testen.
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
walbus
Beiträge: 137
Registriert: 03.03.2013 20:50

Re: 2D Drawing: StartDrawing()/StopDrawing() bremsen aus

Beitrag von walbus »

Ja, ich dachte mir schon, dass dieser Thread etwas länger wird :mrgreen:

Dass die Puffer Schieberei "unsauer" ist, sollte nicht der letzte Stand der Erkenntnis bleiben, ist auch nix neues, insoweit.

Schön wäre eine "saubere" Lösung dieser Problematik !

Wem fällt was ein ?
How ?

Das umschalten mit StartDrawing() ist eben nicht immer schnell genug, Fakt, Punkt.....

Will ich zB. ein Bild mit Bordmitteln analysieren und die Resultate grafisch auf einem zweiten Bild sichtbar machen, gibt es nur die Möglichkeit beide Bilder nebeneinander auf eine Plane zu legen und mit Offset´s zu arbeiten um das Umschalten zu vermeiden.

Über Array´s, zwischenspeichern, na, weniger innovativ, das Zielbild ist ja an sich schon eines, dieses Doppelgemoppel und Bitgefummel kostet Zeit und Nerven.

Es ist auch nicht Jedermann´s Sache sich mit Peek und Poke durch die Bitplanes zu schrauben, einfach ist anders.

Auch elegant ist anders !

Gruss Werner
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: 2D Drawing: StartDrawing()/StopDrawing() bremsen aus

Beitrag von Danilo »

Christian+ hat geschrieben:Also, dass man DrawingBuffer() nur innerhalb der StartDrawing und StopDrawing Befehle aufrufen kann ist klar. Aber ich dachte immer DrawingBuffer gibt einfach den Speicherbereich zurück an dem sich das Bild im RAM befindet. Dieser sollte sich dann ja nicht verändern egal ob StopDrawing aufgerufen wird oder nicht.
Innerhalb StartDrawing()/StopDrawing() sollte sich das im Rahmen der Dokumentation auf allen
Systemen gleich verhalten. Das schliesst auch ein das DrawingBuffer() mal 0 zurückgeben kann.
Ist zumindest so dokumentiert.
PB Help hat geschrieben:Hinweis: Die Zeichenoperationen beginnen immer mit dem Aufruf von StartDrawing() und werden mit StopDrawing() abgeschlossen.
Für mich ist das Zufall, wenn der DrawingBuffer() nach einem StopDrawing() noch weiter gültig ist.
Das ist so nicht dokumentiert, und mMn Zufallsprogrammierung. Irgend welche anderen Befehle
können diesen Pointer jederzeit ungültig machen. ResizeImage() / FreeImage() / LoadImage() / usw.,
aber auch beliebige Sprite- oder Screen-funktionen, wenn DrawingBuffer() auch mit Screen-/SpriteOutput()
auf einem bestimmten System funktioniert. Ist eben Zufall.

Die Hilfe zu DrawingBuffer() meint sogar noch:
Diese Funktion muss erneut aufgerufen werden, wenn andere Befehle dieser Befehls-Bibliothek seit der letzten Pixel-Manipulation verwendet wurden.
D.h. selbst innerhalb dem gleichen StartDrawing() / StopDrawing() kann der Buffer-Pointer schon
ungültig werden. Einfach nur dadurch, dass man weitere 2D Drawing Funktionen aufruft.

Nur so als kurze Erklärung was ich dazu denke, da ich keine Lust habe das weiter zu diskutieren.
Es steht Dir natürlich frei das weiterhin zu benutzen, solange es noch geht... ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
walbus
Beiträge: 137
Registriert: 03.03.2013 20:50

Re: 2D Drawing: StartDrawing()/StopDrawing() bremsen aus

Beitrag von walbus »

Na, nix für ungut, aber so weit waren wir schon...
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: 2D Drawing: StartDrawing()/StopDrawing() bremsen aus

Beitrag von Danilo »

walbus hat geschrieben:Na, nix für ungut, aber so weit waren wir schon...
Du schon, aber das ist die Antwort an Christian+. :)


Du redest von "Bordmitteln". Meinst Du damit PB-Bordmittel, also schliesst z.B. WinAPI aus?
Dann musst Du wohl zwei StartDrawing() in zwei separaten Threads starten um gleichzeitig
an beide Buffer zu kommen. Aber soweit waren wir ja auch schon... ;)
Ohne Threads vielleicht über 2 DLLs/Shared Libs, die jeweils ihre eigenen Image-Objekte
haben und diese manipulieren können.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
walbus
Beiträge: 137
Registriert: 03.03.2013 20:50

Re: 2D Drawing: StartDrawing()/StopDrawing() bremsen aus

Beitrag von walbus »

Bei Bordmitteln, halt ohne API und Libs.

Durch die Cross Plattform Unterstützung sind halt Restriktionen oder auch diverse Kollisionen ev. schon mal nicht vermeidbar.

Defakto, zu dem Problem hier, es geht entweder unsauber oder gar nicht !

Jedoch war die Fragestellung ganz klar definiert und SBond im Vorfeld von mir bereits informiert das es nur unsauber geht.

Gruss Werner
Antworten