Więc udało mi się w końcu dobrze rozpracować te funkcje. Używam tych poleceń (dla ekranu "screen" bez własnej bitmapy):
sb[0] = AllocScreenBuffer(screen, NULL, SB_SCREEN_BITMAP);
sb[1] = AllocScreenBuffer(screen, NULL, 0);
A następnie rysuję w bitmapę sb[toggle]->sb_BitMap i przełączam ekrany poprzez:
ChangeScreenBuffer(screen, sb[toggle]);
toggle ^= 1;
Mam tylko jeszcze jedną zagwostkę: mianowicie powinno się czekać na wiadomość, czy można blitować w bitmapę i czy można ją wyświetlić. Tylko, że oba polecenia AllocScreenBuffer() alokują aż dwie struktury DBufInfo.
struktura DBufInfo zawiera dwa pola:
- dbi_SafeMessage - wiadomość, że można blitować w bitmapę
- dbi_DispMessage - wiadomość, że można wyświetlić bitmapę
Trzeba zaalokować dwa porty i podpiąć je pod mn_ReplyPort obu wiadomości, a następnie czekać na te wiadomości aż dotrą do portu i wtedy podjąć odpowiednie czynności (blitować lub wyświetlać).
Jak to zaimplementować gdy dostępne są
dwie struktury DBufInfo? Dziękuję za odpowiedź.
Tutaj podaję kod z RKRM, jeśli ktoś nie do końca wie o co mi chodzi (jest to kod przykładowy dla funkcji ChangeVPBitMap(), ale nie sugerujcie się tym, dotyczy on również ChangeScreenBuffer(). Dziękuję za odpowiedź.
The following fragment shows proper double buffering synchronization:
int SafeToChange=TRUE, SafeToWrite=TRUE, CurBuffer=1;
struct MsgPort *ports[2]; /* reply ports for DispMessage and SafeMessage
*/
struct BitMap *BmPtrs[2];
struct DBufInfo *myDBI;
... allocate bitmap pointers, DBufInfo, set up viewports, etc.
myDBI->dbi_SafeMessage.mn_ReplyPort=ports[0];
myDBI->dbi_DispMessage.mn_ReplyPort=ports[1];
while (! done)
{
if (! SafeToWrite)
while(! GetMsg(ports[0])) Wait(1l<<(ports[0]->mp_SigBit));
SafeToWrite=TRUE;
... render to bitmap # CurBuffer.
if (! SafeToChange)
while(! GetMsg(ports[1])) Wait(1l<<(ports[1]->mp_SigBit));
SafeToChange=TRUE;
WaitBlit(); /* be sure rendering has finished */
ChangeVPBitMap(vp,BmPtrs[CurBuffer],myDBI);
SafeToChange=FALSE;
SafeToWrite=FALSE;
CurBuffer ^=1; /* toggle current buffer */
}
if (! SafeToChange) /* cleanup pending messages */
while(! GetMsg(ports[1])) Wait(1l<<(ports[1]->mp_SigBit));
if (! SafeToWrite) /* cleanup */
while(! GetMsg(ports[0])) Wait(1l<<(ports[0]->mp_SigBit));