| |
Rudi Account closed
Registered: May 2010 Posts: 125 |
Preventing flickering = double-buffering?
Hi,
do you use banks for "double buffering" or flicker-free drawing?
When I erase pixels I get flickering. I guess it does not only happen when the drawing is synched to the rasterbeam so I use banking for some kind of double buffering.
What do you guys use to prevent flickering?
Lets say you do dots or linedrawing and need to erase the pixels..
My idea is to draw in two banks and while showing one i erase and draw in the other. Then switch banks and do the same for the opposite bank and repeat.
The flicker should not occur when drawing is finished. I tried to sync $d012 to 252 and draw, but it still flickers.
;----------------
;double-buffering
;----------------
;try to draw when rasterbeam is away from screen
;lda #252
;cmp $d012 ;raster
;bne *-3
lda IT0
and #1
beq drawjmp0
jmp draw1
drawjmp0: jmp draw0
draw1:
#Line PX0, PY0, PX1, PY1, 0, 1 ;draw (in bank 1)
#Line QX0, QY0, QX1, QY1, 1, 0 ;erase (in bank 0)
;store old coordinates
lda PX0
sta RX0
lda PY0
sta RY0
lda PX1
sta RX1
lda PY1
sta RY1
#SwitchBank bank4000 ;switch to bank 1
jmp loop
draw0:
#Line PX0, PY0, PX1, PY1, 0, 0 ;draw (in bank 0)
#Line RX0, RY0, RX1, RY1, 1, 1 ;erase (in bank 1)
;store old coordinates
lda PX0
sta QX0
lda PY0
sta QY0
lda PX1
sta QX1
lda PY1
sta QY1
#SwitchBank bank0000 ;switch to bank 0
jmp loop
Any ideas? |
|
| |
Flavioweb
Registered: Nov 2011 Posts: 463 |
Maybe you should switch screens during VB, otherwise if the switch happen in the middle of the frame, some glitches appears... |
| |
algorithm
Registered: May 2002 Posts: 705 |
What may come in useful is to put a dec $d020 at the beginning of a routine (such as your clear routine) if you use it. and then inc $d020 at the end.
When your program is running, that will tell you visually when the clear routine is running. |
| |
Digger
Registered: Mar 2005 Posts: 437 |
As Flavio pointed out you should be able to draw anytime when you use double-buffering, it's more crucial to switch the bank display at the right time.
Also erase and then draw should happen in the same bank (while the other is shown). From your code comments it looks like you've been erasing and drawing the the opposite banks, which would explain the flicker. |
| |
Rudi Account closed
Registered: May 2010 Posts: 125 |
yes, I was switching banks at the wrong time. such things happen when coding for too long, i dont see the obvious things. thanks for the replies anyhow.
It's solved now. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
waiting for vblank can be avoided by tripple buffering.
frame A is being drawn
frame B is on screen
frame C is ready to be shown when vblank is reached |
| |
Mixer
Registered: Apr 2008 Posts: 452 |
Another way to avoid flicker is to run a circular coordinate buffer.
You have n dots on screen and you delete the oldest when you write a new one.
When you write a new dot, save the dot mem address to buffer, so you do not need to recalculate it when clearing. |