[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