[R] Double-buffering problem, this time with an example.

Duncan Murdoch murdoch.duncan at gmail.com
Sun Jun 3 00:17:48 CEST 2012


On 12-06-02 4:02 PM, Daniel Carr wrote:
> Most of my animations that used to work
> on windows() version 2.11.1 and earlier now flash
> as if the double buffering is turned off or buffer swapping
> is triggered by other events than in the past.
>
> The simplified example below using symbols
> should illustrate the problem in a windows environment.
>
> windows()
>
> radius<- 8
> n<- 6
> ang<- seq(0,2*pi,length=n+1)[-(n+1)]
> ca<- cos(ang)
> sa<- sin(ang)
> size<- c(.1, .3, .5, .7, .9, 1)
>
> colors<-  rainbow(length(size))
>
> for (i in 1:1000){
>     radius<- radius*.998
>     bnd<- (radius+1)* c(-1, 1)
>     cenX<- radius*ca
>     cenY<- radius*sa
>     symbols(cenX, cenY, circles = size,
>             xlim=bnd, ylim=bnd, bg=colors)
> }
>
> I have not isolated the version  when the flashing
> started but it somewhere between
> 2.11.1 and 2.14.1.
>
> I did some searching on double-buffering
> problems in R but didn't find indications
> of this particular problem.
>
> Slowing the animation down did not help.

I don't think there was ever a guarantee that double buffering would be 
sufficient for what you were doing:  you just got lucky.

What you need to do (and this should work, at least on the windows() 
device and some others), is use dev.hold() to stop redrawing, and 
dev.flush() when you are ready to display the new stuff.  Your loop 
becomes something like this:

for (i in 1:1000){
    dev.hold()
    radius <- radius*.998
    bnd <- (radius+1)* c(-1, 1)
    cenX <- radius*ca
    cenY <- radius*sa
    symbols(cenX, cenY, circles = size,
            xlim=bnd, ylim=bnd, bg=colors)
    dev.flush()
}

The dev.hold() function was introduced in 2.14.0.  I think dev.flush() 
existed earlier, but not for all systems.

Duncan Murdoch



More information about the R-help mailing list