Refactored ImageSequence to better handle random access usage.

This commit is contained in:
Robert Osfield
2012-11-08 11:19:31 +00:00
parent 17b372ec38
commit 014f13f774
12 changed files with 228 additions and 191 deletions

View File

@@ -83,14 +83,14 @@ void ImagePager::ReadQueue::add(ImagePager::ImageRequest* databaseRequest)
// tempo hack to avoid the ImagePager accumulating requests when it can keep up,
// note this will mean that only one ImageSequence can be properly managed at one time,
// this hack will be removed once a better system for managing expiry of requests is introduced.
clear();
// clear();
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
_requestList.push_back(databaseRequest);
databaseRequest->_requestQueue = this;
OSG_INFO<<"ImagePager::ReadQueue::add(..), size()="<<_requestList.size()<<std::endl;
OSG_INFO<<"ImagePager::ReadQueue::add("<<databaseRequest->_fileName<<"), size()="<<_requestList.size()<<std::endl;
updateBlock();
}
@@ -206,9 +206,12 @@ void ImagePager::ImageThread::run()
if (imageRequest.valid())
{
osg::ref_ptr<osg::Image> image = osgDB::readImageFile(imageRequest->_fileName);
// OSG_NOTICE<<"doing readImageFile("<<imageRequest->_fileName<<") index to assign = "<<imageRequest->_attachmentIndex<<std::endl;
osg::ref_ptr<osg::Image> image = osgDB::readImageFile(imageRequest->_fileName, imageRequest->_readOptions.get());
if (image.valid())
{
// OSG_NOTICE<<" successful readImageFile("<<imageRequest->_fileName<<") index to assign = "<<imageRequest->_attachmentIndex<<std::endl;
osg::ImageSequence* is = dynamic_cast<osg::ImageSequence*>(imageRequest->_attachmentPoint.get());
if (is)
{
@@ -266,12 +269,13 @@ ImagePager::ImagePager():
_readQueue = new ReadQueue(this,"Image Queue");
_completedQueue = new RequestQueue;
_imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 1"));
#if 1
_imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 2"));
_imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 3"));
_imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 4"));
_imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 5"));
_imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 6"));
#endif
// 1 second
_preLoadTime = 1.0;
}
@@ -314,9 +318,21 @@ osg::Image* ImagePager::readImageFile(const std::string& fileName)
return osgDB::readImageFile(fileName);
}
void ImagePager::requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const osg::FrameStamp*)
void ImagePager::requestImageFile(const std::string& fileName, osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const osg::FrameStamp* framestamp, osg::ref_ptr<osg::Referenced>& imageRequest, const osg::Referenced* options)
{
OSG_INFO<<"ImagePager::requestNodeFile("<<fileName<<")"<<std::endl;
osgDB::Options* readOptions = dynamic_cast<osgDB::Options*>(const_cast<osg::Referenced*>(options));
if (!readOptions)
{
readOptions = Registry::instance()->getOptions();
}
bool alreadyAssigned = dynamic_cast<ImageRequest*>(imageRequest.get()) && (imageRequest->referenceCount()>1);
if (alreadyAssigned)
{
// OSG_NOTICE<<"ImagePager::requestImageFile("<<fileName<<") alreadyAssigned"<<std::endl;
return;
}
osg::ref_ptr<ImageRequest> request = new ImageRequest;
request->_timeToMergeBy = timeToMergeBy;
@@ -324,6 +340,11 @@ void ImagePager::requestImageFile(const std::string& fileName,osg::Object* attac
request->_attachmentPoint = attachmentPoint;
request->_attachmentIndex = attachmentIndex;
request->_requestQueue = _readQueue.get();
request->_readOptions = readOptions;
imageRequest = request;
// OSG_NOTICE<<"ImagePager::requestImageFile("<<fileName<<") new request."<<std::endl;
_readQueue->add(request.get());