amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Probs mit DoubleBuffering [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2002-08-13, 10:48 h

Micha1701
Posts: 938
User
Hallo zusammen!

Ich hab grad ein Problem mit dem DoubleBuffering unter der graphics.library.

Das Programm öffnet einen Screen und darin ein Fenster. Zusätzlich wird noch eine Bitmap für den Screenbuffer und eine Bitmap für ein Bild alloziiert. Nachdem die 2. Bitmap in einen RastPort eingetragen wurde, wird auf diese gezeichnet. Mittels ChangeVPBitMap() wird dann die 2. Bitmap im Viewport eingetragen und der Screen gewechselt (das eigentliche Doublebuffering).

Zum Schluß wird auf den rechten Mausklick gewartet, alles geschlossen und freigegeben.

Und hier gibts das Problem. Wenn ich mit CloseScreen() den Screen schließe, gibt es ein Speicherproblem. Das CLI Kommando "avail" gibt direkt danach aus, daß ich noch -780MB frei hätte.... Die Speicherlisten sind demnach korrupt was in einem Absturz direkt oder kurze Zeit später resultiert....

Ich habe bereits die ursprüngliche Bitmap wieder in die Screenstruktur eingebaut (mittels ChangeVPBitMap() oder auch per ScrollVP()) und es einfach mal so gelassen. Aber dennoch schmiert mir das Programm an der Stelle ab....

Kann mir da jemand von Euch helfen?

- Den Quelltext, der hier stand hab ich mal wieder entfernt. -
- Wer ihn haben will (bzw. wer mir helfen möchte) dem kann -
- ich ihn gerne zumailen. Zu finden ist der Quelltext auch -
- auf der amiga-c yahoogroup (nur für Mitglieder). -


--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ Dieser Beitrag wurde von Micha1701 am 15.08.2002 editiert. ]

[ - Answer - Quote - Direct link - ]

2002-08-13, 10:58 h

westpdmkids
Posts: 168
User
irgendwer hat so eine geile Signatur:
"Cool Coders don't need to comment ... "

Bitte nicht negativ auffassen aber schreib am Besten ein paar mehr Kommentare rein (im unteren Teil)damit man genauer weiss, wo was passieren soll (geht dann schneller mit der Fehlersuche).

Ach ja, deaktiviere mal die Smileys :-)


--
Windows crashes to provide us with fresh air ...

[ Dieser Beitrag wurde von westpdmkids am 13.08.2002 editiert. ]

[ - Answer - Quote - Direct link - ]

2002-08-13, 11:14 h

Micha1701
Posts: 938
User
Hi!

OK, hab ein paar mehr Kommentare eingebaut (ab CloseWindow()).
Den Teil wo der Fehler auftritt hab ich mal Rot markiert (Anfang und Ende)...

Wenn noch was kommentiert werden soll, dann sag bescheid ;-)

Ach ja, die Smilies sind jetzt auch weg....
(Hab den Button glatt übersehen)

--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu





[ Dieser Beitrag wurde von Micha1701 am 13.08.2002 editiert. ]

[ - Answer - Quote - Direct link - ]

2002-08-15, 08:47 h

Micha1701
Posts: 938
User
Hi Leute!

Ist denn hier keiner, der mir bei meinem Problem helfen kann oder der schon mal ein Programm mit Doublebuffering auf CGX und P96 geschrieben hat?

Ich benötige unbedingt ein Programm, was doublebuffering kann und gleichzeitig IDCMP Messages empfangen (also über ein Fenster).

Hab schon verschiedene Möglichkeiten versucht, binaber bisher immer dran gescheitert:

RtgMaster.lib:
SwitchScreen() (funktionierte nur auf P96)

AmigaOS:
ScrollVP() (hab ich nicht zum laufen bekommen)
MakeScreen() und RethinkDisplay() (hab ich nicht zum laufen bekommen)
ChangeVPBitMap() (hab ich nicht zum laufen bekommen)
ChangeScreenBuffer() (läuft nur auf CGX)
SuperBitmap mit ScrollLayer() (ist mir zu langsam)

chunkyppc.lib:
keine Möglichkeit der IDCMP-Abfrage...

Hat jemand das schon mal auf einem der oben genannten Arten auf beiden GFX-Systemen zum laufen gebracht?

Gibts irgenwas was ich vergessen habe?
--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu





[ Dieser Beitrag wurde von Micha1701 am 15.08.2002 editiert. ]

[ - Answer - Quote - Direct link - ]

2002-08-15, 09:18 h

thomas
Posts: 7718
User

Wenn du etwas Geduld hättest, ich habe mir vorgenommen, das mal auszuprobieren. Aber zu sowas Langwierigem komme ich meistens nur am Wochenende.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Answer - Quote - Direct link - ]

2002-08-15, 09:35 h

tokai
Posts: 1071
User
also ich habe zu Hause auch ein DB-Beispiel für CGX, dass switcht aber auch nur Screens. Aber bei Interesse maile ich es dir mal vorbei! :)

Vielleicht entsteht das Problem aber schon früher.... versuche doch mal Sicherheits-if's bei den ganzen Alloc's einzubauen... z.B.: habe ich in Erinnerung das du ein File öffnest und einfach davon ausgeht, dass das klappt:

code:
Open(file,"name.file")
Read(file,buffer,size)
Close(file);


sollte generell so ausschaun:

code:
if ( Open(file,"name.file) )
{
    lenght = Read(file,buffer,size);

    if (lenght<size)
    {
        /* error handling */
    }

    Close(file)
}
else
{
    PrintFault(IoErr(),"name.file");
    exit();
}


Ist zwar alles mehr Schreibarbeit, aber du kannst sicher gehen, dass du nicht schon vorher wild im Speicher rumschreibst. :)


tokai

[ Dieser Beitrag wurde von tokai am 15.08.2002 editiert. ]

[ Dieser Beitrag wurde von tokai am 15.08.2002 editiert. ]

[ - Answer - Quote - Direct link - ]

2002-08-15, 10:05 h

Micha1701
Posts: 938
User
Danke für das Angebot, schick mir das Prog mit Code mal zu M.Lanser@t-online.de. Das mit den Fehlerchecks ist klar, es gibt auch Progs, wo ich alles überprüfe ;) . Aber wenn ich nur was ausprobieren will, was dann in einem anderem Code reinsoll, dann lass ich das manchmal weg...

Während dem Debuggen kann ich allerdings sehen, daß alles einwandfrei lief.... (bis zum Fehler, den ich nicht weg krieg)
--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Answer - Quote - Direct link - ]

2002-08-15, 13:02 h

MagicSN
Posts: 238
User

Hi!

>RtgMaster.lib:
>SwitchScreen() (funktionierte nur auf P96)

Stimmt nicht. Du musst nur sichergehen, dass unter CGX *nur*
die rtgCGX.library als Sublibrary installiert ist (rtgmaster
identifiziert P96 anhand der Existenz irgendwelcher Libs von P96,
falls nun CGX und P96 parallel installiert sind und sowohl
rtgCGX als auch rtgP96 installiert werden, koennte faelschlich unter
CGX die P96 Methode - die dort nicht funktioniert - verwendet werden).

>AmigaOS:
>ScrollVP() (hab ich nicht zum laufen bekommen)

Schau mal im Warp3D Dev Archiv nach. Da ist glaub ein Beispiel
mit dabei. Oder im MiniGL Source, der ja auch DBuf macht.

>MakeScreen() und RethinkDisplay() (hab ich nicht zum laufen bekommen)

Vergiss das. Laeuft nicht auf Grafikkarte.

>ChangeVPBitMap() (hab ich nicht zum laufen bekommen)

Schau in den MiniGL Source :)

>chunkyppc.lib:
>keine Möglichkeit der IDCMP-Abfrage...

Stimmt nicht. Ein Teil der Struktur, die OpenGraphics liefert,
enthaelt Screen und Window des geoeffneten Displays, ueber das Du
dann IDCMP machen kannst.

Steffen

[ - Answer - Quote - Direct link - ]

2002-08-15, 13:31 h

Micha1701
Posts: 938
User
Zitat:
Original von MagicSN:

Hi!

>RtgMaster.lib:
>SwitchScreen() (funktionierte nur auf P96)

Stimmt nicht. Du musst nur sichergehen, dass unter CGX *nur*
die rtgCGX.library als Sublibrary installiert ist (rtgmaster
identifiziert P96 anhand der Existenz irgendwelcher Libs von P96,
falls nun CGX und P96 parallel installiert sind und sowohl
rtgCGX als auch rtgP96 installiert werden, koennte faelschlich unter
CGX die P96 Methode - die dort nicht funktioniert - verwendet werden).


Hab ich schon überprüft, ist nur die rtgCGX installiert. Bei Switch wird nicht komplett geswitcht, sondern der 2. Buffer ist um einen halben Screen versetzt nach unten....

Die anderen Sachen schau ich mir noch mal an, Danke!


--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Answer - Quote - Direct link - ]

2002-08-15, 13:50 h

tokai
Posts: 1071
User
Zitat:
Original von Micha1701:
Danke für das Angebot, schick mir das Prog mit Code mal zu M.Lanser@t-online.de. Das mit den Fehlerchecks ist klar, es gibt auch Progs, wo ich alles überprüfe ;) . Aber wenn ich nur was ausprobieren will, was dann in einem anderem Code reinsoll, dann lass ich das manchmal weg...



Dachte ich mir schon! :) Aber manchmal liegt in soetwas die Lösung eines Problems... ist mir auch schon passiert :)


Den source maile ich dir natürlich vorbei!


[ - Answer - Quote - Direct link - ]

2002-08-16, 10:43 h

Micha1701
Posts: 938
User
doppelter Post gelöscht...





[ Dieser Beitrag wurde von Micha1701 am 16.08.2002 editiert. ]

[ - Answer - Quote - Direct link - ]

2002-08-16, 10:47 h

Micha1701
Posts: 938
User
Hi!

Ich habs hingekriegt! Das war wohl ein Problem mit den Rastports... ich hatte sie nicht richtig initialisiert... :rotate:

Aber nu funktionierts... 8)

Hab da aber noch ein kleines problem mit den temporären RastPorts die zum Zeichnen verwendet werden. Wenn ich die Funktion BltMaskBitMapRastPort() verwende werden die Grenzen des Ziel RastPorts nicht beachtet und einfach weiter gezeichnet. Zum Glück liegt hinter der Bitmap noch eine zweite Bitmap die auch mir ist. Daher gibts keinen Absturz (vorher gab es aber welche als es noch andersrum war, und ich hab mich gefragt warum :lach: ).

Gemerkt hab ich es, als das Programm auf den sichtbaren Screen (oben)malte, als es eigentich auf den nichtsichtbaren (unten) krizeln sollte. Auch sieht man Grafiken auf der linken Seite im Screen die eigentlich außerhalb des Screen rechts gezeichnet hätten werden müssen.

Wie kann ich dafür sorgen, daß die RastPort Grenzen beachtet werden? Oder wie setze ich welche in einem temporären Rastport ohne dazugehörigen Layer (in dem stehen ja die Grenzen bzw. die Größe)?

--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu





[ Dieser Beitrag wurde von Micha1701 am 16.08.2002 editiert. ]

[ - Answer - Quote - Direct link - ]

2002-08-16, 12:43 h

thomas
Posts: 7718
User

Ein normaler Rastport macht kein Clipping. Du mußt die Layers.library verwenden, wenn Clipping gemacht werden soll.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Answer - Quote - Direct link - ]

2002-08-18, 11:05 h

Micha1701
Posts: 938
User
Mit der Layers.library kann ich doch nur neue Layer erstellen. Und das sind doch Fenster oder Screens (also sichtbare Elemente...).

Wie kann ich das denn für nicht sichtbare Bitmaps verwenden?
--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Answer - Quote - Direct link - ]

2002-08-18, 14:22 h

thomas
Posts: 7718
User

bitmap = AllocBitMap(width,height,depth,BMF_CLEAR);
layerinfo = NewLayerInfo();
layer = CreateUpfrontLayer(layerinfo,bitmap,0,0,width,height,LAYERSIMPLE,NULL) ;
rastport = layer->rp;

Die Layers.library hat nichts mit sichtbar, unsichtbar, Fenstern oder Intuition zu tun. Sie ist einzig und allein zum Clippen da.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Answer - Quote - Direct link - ]

2002-08-18, 20:24 h

Micha1701
Posts: 938
User
Danke!

Werds direkt mal ausprobieren!

--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Answer - Quote - Direct link - ]

2002-08-27, 11:41 h

Micha1701
Posts: 938
User
Hi!

Zitat:
Original von thomas:

bitmap = AllocBitMap(width,height,depth,BMF_CLEAR);
layerinfo = NewLayerInfo();
layer = CreateUpfrontLayer(layerinfo,bitmap,0,0,width,height,LAYERSIMPLE,NULL) ;
rastport = layer->rp;


Danke für den Tip! Es hat geklappt. Allerdings wird bei CreateUpfrontLayer() nicht width und height eingetragen sondern die tatsächlichen Screenkoordinaten.

Bei einem 800*600 Screen also 799 und 599....
Sonst gibts haufenweise GURU #0100000C (Fehler bei den Speicherlisten)




--
:boing: Micha :boing:

Look at my HP: http://www.lanser-online.de.vu



[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Probs mit DoubleBuffering [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.