Hi Glenn,

We used to have a similar option before, then for toggle between using
a machine code call to get the processor counter and standard code
that probably used clock(), but its a while so I can't recall for
sure.  The machien code path was abandoned when processors started
changing clock frequency on the fly.

I'm open to adding back a toggle for the timer implementation,
especially if someone else writes it :-)

The other avenue to explore is multi-buffering the Timer is some way
that manages the QueryPerformanceCounter() from different processes.

Robert.

On 3/8/07, Glenn Waldron <[EMAIL PROTECTED]> wrote:
A temporary solution may be to simply replace QueryPerformanceCounter() with
clock(). The resolution is less, but a quick search shows that the delta_u()
and delta_n() methods are never used within OSG (1.2). I have tried this and
the problems went away. Of course, any user code that used these methods
would break.

Perhaps we can enhance osg::Timer to use one implementation or the other
depending on the number of logical CPUs detected? Or let the user override
at startup time by calling a static function, like
osg::Timer::setUseLowResolutionTimer(bool)? -gw


On 3/8/07, Robert Osfield <[EMAIL PROTECTED]> wrote:
> Hi Anders,
>
> The OSG support multi-threaded usage, and the time code happens in
> both the main threads and the cull-draw ones, one can't just limit
> timer calls to one thread.  Setting process affinity is now supported,
> in particular with osgViewer, but the timer calls are still called
> from different threads, so I don't think this will solve much.
>
> Perhaps one could multi-buffer the Timer so there is one per thread, I
> don't know how we'd go about this, or whether it would work.  Is the
> problem that QueryPerformanceCounter()'s base offset changes per core?
> If so the the multi-buffering might work, but... how would you
> syncronize the various buffers so that they all tell the same time?
>
> Clamping times won't really solve anything as the time will still be
> wrong, just not negatively wrong.
>
> Robert.
>
> On 3/7/07, Anders Backman < [EMAIL PROTECTED]> wrote:
> > Is there anyone out there experiencing strange hang and timing problems
on
> > dual CPU/Core/HT windows XP machines?
> > except for the ordinary laptop-timing problems of course ;-)
> >
> >
> > Im currently debugging something that gives me gray hair, and someone
> > suggested that it could be a potential problem coming from the fact that
> > QueryPerformanceCounter() is used (osg::Timer)
> > I have an app that runs just fine for a while (can be 1 minute,
sometimes
> > 30) and then it hangs, and it never occurs in debug-mode (of course!) so
its
> > quite tricky find the cause for it.
> > I have already found one reason for the hangs, and that was in Producer
> > where a OpenGL timer query never returned....But that is fixed (by
skipping
> > after 1000 iterations).
> >
> >
> > It seems to be quite a few developers with this problem when I searched
the
> > web.
> >
> > For example:
> > http://www.virtualdub.org/blog/pivot/entry.php?id=106
> >
> > It seems that when a thread is moved in and out between different
execution
> > cores/CPU:s it can drop timing or even get negative timing results....
> > It also talks about hangs (which I guess could be a second order problem
> > that comes from the timing problem).
> > Right now Im looking at something that looks like a hang inside
> > osg::Timer::tick()
> >
> >
> > So is there anyone else experiencing this?
> >
> >
> > There is a bunch of recommendations from MS:
> >
> >
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/Game_Timing_and_Multicore_Processors.asp
> >
> > - using QueryPerformanceCounter from only one thread
> > - setting SetThreadAffinityMask so that the timing thread runs on only
one
> > CPU/Core
> > - clamping the subtraction result so you never get a negative one:
> >
> >         inline double delta_s( Timer_t t1, Timer_t t2 ) const { return
> > (double)(t2 - t1)*_secsPerTick; }
> >
> > Should be:
> >
> >         inline double delta_s( Timer_t t1, Timer_t t2 ) const { return
> > (double)osg::clampAbove((t2 - t1), 0)*_secsPerTick; }
> >
> >
> >
> >
> >
> >
> > --
> >
> >
> >
________________________________________________________________
> >  Anders Backman               Email:    [EMAIL PROTECTED]
> >  HPC2N/VRlab                  Phone:    +46 (0)90-786
9936
> >  Umea university              Cellular: +46 (0)70-392
64 67
> >  S-901 87 UMEA SWEDEN         Fax:      +46 90-786 6126
> >
http://www.cs.umu.se/~andersb
> > _______________________________________________
> > osg-users mailing list
> > [email protected]
> > http://openscenegraph.net/mailman/listinfo/osg-users
> > http://www.openscenegraph.org/
> >
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://openscenegraph.net/mailman/listinfo/osg-users
> http://www.openscenegraph.org/
>


_______________________________________________
osg-users mailing list
[email protected]
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/

_______________________________________________
osg-users mailing list
[email protected]
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/

Reply via email to