Hi Robert,
Robert Osfield wrote:
I have never seen problems like yours when using
OperationThread/Operatons, but on a second review I see that your
OpenThread never sleeps, it just churns away as effectively a spin
lock on the CPU. If your machine doesn't have sufficient cores to
handle a thead using 100% of the CPU core then you'll get frame stalls
like you have.
More general, is what follows a good summary of how to use an
osg::Operation (looking at the osgtext example for reference)? You
subclass it and implement your action in the call operator. Then you add
an instance of the operation class to a separate thread (starting it so
it calls the operation in the background), plus you add the same
instance to a osgViewer::Viewer instance. The only argument to the call
operator is used to distinguish who makes a call on the operation and
therefore what action you need to take. Is that a good summary?
Ignoring having to call yield once in a while, is the below test roughly
the way to do it (I used the osgtext example as a second source)? Is the
mutex in the call operator necessary?
Doh, lots of question marks above :)
Paul
// g++ -g -o op operation.cpp -I ~/osg2.8/include/ -L ~/osg2.8/lib/
-losg -losgDB -losgViewer
#include <cstdio>
#include <osg/OperationThread>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
class UpdateOperation : public osg::Operation
{
public:
UpdateOperation():
Operation("UpdateOperation", true)
{
}
virtual void operator() (osg::Object* callingObject)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
printf("operator(): obj = 0x%08x\n", callingObject);
}
virtual void release()
{
printf("release()\n");
}
protected:
OpenThreads::Mutex _mutex;
};
int
main()
{
osg::ref_ptr<UpdateOperation> updateOperation = new UpdateOperation();
osgViewer::Viewer viewer;
osg::ref_ptr<osg::OperationThread> operationThread = new
osg::OperationThread;
operationThread->add(updateOperation.get());
operationThread->startThread();
viewer.addUpdateOperation(updateOperation.get());
viewer.setSceneData(osgDB::readNodeFile("cow.osg"));
viewer.run();
}
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org