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

luke-tierney at uiowa.edu luke-tierney at uiowa.edu
Tue Jun 5 00:11:44 CEST 2012


FOR what it's worth this dev.hold/dev/flush combination does not seem
to prevent flickering on the quartz device on Macs.

Best,

luke

On Sat, 2 Jun 2012, Duncan Murdoch wrote:

> 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
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

-- 
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:   luke-tierney at uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu



More information about the R-help mailing list