[wxruby-users] Tearing in my buffered animation test script...
Alex Fenton
alex at pressure.to
Thu Mar 27 20:17:24 EDT 2008
Hi Paul
Paul w Florczykowski wrote:
> I have tested your application, and indeed there is great deal of
> flicker as expected. You are not making any particular errors in your
> code; the problem occurs because the drawing, or more precisely, the
> copying of graphics (blit) is not synchronized with the vertical sync
> signal your screen receives from your graphics card. (I'm speaking in
> terms of analog signal CRT, but actually this applies to any kind of
> digital screen as well, as far the application is concerned)
>
> The usual way to deal with this is:
>
> 1. Draw all the graphics onto an backbuffer (any surface that does not
> appear on the screen yet)
>
> 2. Await the V-blank (the vertical sync signal)
>
> 3. Copy the contents of this backbuffer onto the screen (the
> frontbuffer), or simply swap the buffers if your API supports it
>
> 4. repeat from 1
>
I didn't know about (2), thanks for this info on buffering.
> What you are currently doing is similar but lacks the point (2). wxRuby
> aims to support this on a lower level (i think). There is a method
> called "paint_buffered" (in stead of "paint") that provides a
> BufferedDC-object instead of ClientDC or DC. Drawing to the BufferedDC
> is then not supposed to be visible first after: 1. the actual drawing
> you are making on it is finally completed ie. the block provided to
> "buffered_paint" finishes, and 2. the V-blank occurs.
>
> Sadly enough, this feature does not seem to be working properly with
> wxruby 1.9.5. I have currently similar problem - have not yet decided
> whether to devise another method to signal V-blank to Ruby, or to accept
> the moderate flicker in my application.
>
wxRuby 1.9.5 'paint_buffered' method does what you describe, lacking
point (2). It doesn't do anything more low-level. It's implemented in
pure Ruby,
http://wxruby.rubyforge.org/svn/trunk/wxruby2/lib/wx/classes/window.rb
but it's a straight conversion of the C++ code that wxWidgets uses to
provide BufferedDC:
http://svn.wxwidgets.org/viewvc/wx/wxWidgets/tags/WX_2_8_7/include/wx/dcbuffer.h?revision=52270&view=markup
If you find any advice on how we can improve this by synchronising with
the V-blank please post this, as this is beyond my expertise.
thanks
alex
More information about the wxruby-users
mailing list