openscenegraph
DatabasePager
Go to the documentation of this file.
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version. The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * OpenSceneGraph Public License for more details.
12*/
13
14#ifndef OSGDB_DATABASEPAGER
15#define OSGDB_DATABASEPAGER 1
16
17#include <osg/NodeVisitor>
18#include <osg/Group>
19#include <osg/PagedLOD>
20#include <osg/Drawable>
21#include <osg/GraphicsThread>
22#include <osg/FrameStamp>
23#include <osg/ObserverNodePath>
24#include <osg/observer_ptr>
25
26#include <OpenThreads/Thread>
27#include <OpenThreads/Mutex>
29#include <OpenThreads/Condition>
30
32
34#include <osgDB/ReaderWriter>
35#include <osgDB/Options>
36
37
38#include <map>
39#include <list>
40#include <algorithm>
41#include <functional>
42
43namespace osgDB {
44
45
46
50{
51 public :
52
54
56
58
59 virtual const char* className() const { return "DatabasePager"; }
60
62 virtual DatabasePager* clone() const { return new DatabasePager(*this); }
63
66
69
70
71
73 virtual void requestNodeFile(const std::string& fileName, osg::NodePath& nodePath,
74 float priority, const osg::FrameStamp* framestamp,
75 osg::ref_ptr<osg::Referenced>& databaseRequest,
76 const osg::Referenced* options);
77
80
82 virtual int cancel();
83
84 virtual bool isRunning() const;
85
87 virtual void clear();
88
90 {
91 public:
92
93 enum Mode
94 {
97 HANDLE_ONLY_HTTP
98 };
99
100 DatabaseThread(DatabasePager* pager, Mode mode, const std::string& name);
101
103
104 void setName(const std::string& name) { _name = name; }
105 const std::string& getName() const { return _name; }
106
107 void setDone(bool done) { _done.exchange(done?1:0); }
108 bool getDone() const { return _done!=0; }
109
110 void setActive(bool active) { _active = active; }
111 bool getActive() const { return _active; }
112
113 virtual int cancel();
114
115 virtual void run();
116
117 protected:
118
120
122 volatile bool _active;
125 std::string _name;
126
127 };
128
129 virtual void setProcessorAffinity(const OpenThreads::Affinity& affinity);
131 const OpenThreads::Affinity& getProcessorAffinity() const { return _affinity; }
132
133 void setUpThreads(unsigned int totalNumThreads=2, unsigned int numHttpThreads=1);
134
135 virtual unsigned int addDatabaseThread(DatabaseThread::Mode mode, const std::string& name);
136
137 DatabaseThread* getDatabaseThread(unsigned int i) { return _databaseThreads[i].get(); }
138
139 const DatabaseThread* getDatabaseThread(unsigned int i) const { return _databaseThreads[i].get(); }
140
141 unsigned int getNumDatabaseThreads() const { return static_cast<unsigned int>(_databaseThreads.size()); }
142
145
147 bool getDatabasePagerThreadPause() const { return _databasePagerThreadPaused; }
148
150 void setAcceptNewDatabaseRequests(bool acceptNewRequests) { _acceptNewRequests = acceptNewRequests; }
151
153 bool getAcceptNewDatabaseRequests() const { return _acceptNewRequests; }
154
156 int getNumFramesActive() const { return _numFramesActive; }
157
160 virtual void signalBeginFrame(const osg::FrameStamp* framestamp);
161
164 virtual void signalEndFrame();
165
166
170 virtual void registerPagedLODs(osg::Node* subgraph, unsigned int frameNumber = 0);
171
176
178 osgUtil::IncrementalCompileOperation* getIncrementalCompileOperation() { return _incrementalCompileOperation.get(); }
179
180
185 void setDoPreCompile(bool flag) { _doPreCompile = flag; }
186
189 bool getDoPreCompile() const { return _doPreCompile; }
190
191
192
196 void setTargetMaximumNumberOfPageLOD(unsigned int target) { _targetMaximumNumberOfPageLOD = target; }
197
199 unsigned int getTargetMaximumNumberOfPageLOD() const { return _targetMaximumNumberOfPageLOD; }
200
201
203 void setDeleteRemovedSubgraphsInDatabaseThread(bool flag) { _deleteRemovedSubgraphsInDatabaseThread = flag; }
204
206 bool getDeleteRemovedSubgraphsInDatabaseThread() const { return _deleteRemovedSubgraphsInDatabaseThread; }
207
215
217 void setDrawablePolicy(DrawablePolicy policy) { _drawablePolicy = policy; }
218
220 DrawablePolicy getDrawablePolicy() const { return _drawablePolicy; }
221
222
224 void setApplyPBOToImages(bool assignPBOToImages) { _assignPBOToImages = assignPBOToImages; }
225
227 bool getApplyPBOToImages() const { return _assignPBOToImages; }
228
229
231 void setUnrefImageDataAfterApplyPolicy(bool changeAutoUnRef, bool valueAutoUnRef) { _changeAutoUnRef = changeAutoUnRef; _valueAutoUnRef = valueAutoUnRef; }
232
234 void getUnrefImageDataAfterApplyPolicy(bool& changeAutoUnRef, bool& valueAutoUnRef) const { changeAutoUnRef = _changeAutoUnRef; valueAutoUnRef = _valueAutoUnRef; }
235
236
238 void setMaxAnisotropyPolicy(bool changeAnisotropy, float valueAnisotropy) { _changeAnisotropy = changeAnisotropy; _valueAnisotropy = valueAnisotropy; }
239
241 void getMaxAnisotropyPolicy(bool& changeAnisotropy, float& valueAnisotropy) const { changeAnisotropy = _changeAnisotropy; valueAnisotropy = _valueAnisotropy; }
242
243
246
249 virtual void updateSceneGraph(const osg::FrameStamp& frameStamp);
250
252 bool requiresRedraw() const;
253
255 unsigned int getFileRequestListSize() const { return static_cast<unsigned int>(_fileRequestQueue->size() + _httpRequestQueue->size()); }
256
258 unsigned int getDataToCompileListSize() const { return static_cast<unsigned int>(_dataToCompileList->size()); }
259
261 unsigned int getDataToMergeListSize() const { return static_cast<unsigned int>(_dataToMergeList->size()); }
262
265
267 double getMinimumTimeToMergeTile() const { return _minimumTimeToMergeTile; }
268
270 double getMaximumTimeToMergeTile() const { return _maximumTimeToMergeTile; }
271
273 double getAverageTimeToMergeTiles() const { return (_numTilesMerges > 0) ? _totalTimeToMergeTiles/static_cast<double>(_numTilesMerges) : 0; }
274
277
278 typedef std::set< osg::ref_ptr<osg::StateSet> > StateSetList;
279 typedef std::vector< osg::ref_ptr<osg::Drawable> > DrawableList;
280
281 class ExpirePagedLODsVisitor;
282
283 typedef std::list< osg::ref_ptr<osg::Object> > ObjectList;
284
286 {
287 virtual PagedLODList* clone() = 0;
288 virtual void clear() = 0;
289 virtual unsigned int size() = 0;
290 virtual void removeExpiredChildren(int numberChildrenToRemove, double expiryTime, unsigned int expiryFrame, ObjectList& childrenRemoved, bool visitActive) = 0;
291 virtual void removeNodes(osg::NodeList& nodesToRemove) = 0;
293 virtual bool containsPagedLOD(const osg::observer_ptr<osg::PagedLOD>& plod) const = 0;
294 };
295
296 void setMarkerObject(osg::Object* mo) { _markerObject = mo; }
297 osg::Object* getMarkerObject() { return _markerObject.get(); }
298 const osg::Object* getMarkerObject() const { return _markerObject.get(); }
299
300 protected:
301
302 virtual ~DatabasePager();
303
304 friend class DatabaseThread;
305 friend struct DatabaseRequest;
306
307 struct RequestQueue;
308
310 {
312 osg::Referenced(true),
313 _valid(false),
314 _frameNumberFirstRequest(0),
315 _timestampFirstRequest(0.0),
316 _priorityFirstRequest(0.f),
317 _frameNumberLastRequest(0),
318 _timestampLastRequest(0.0),
319 _priorityLastRequest(0.0f),
320 _numOfRequests(0),
321 _groupExpired(false)
322 {}
323
325
326 bool valid() const { return _valid; }
327
328 bool isRequestCurrent (int frameNumber) const
329 {
330 return _valid && (frameNumber - _frameNumberLastRequest <= 1);
331 }
332
333 bool _valid;
334 std::string _fileName;
341 unsigned int _numOfRequests;
342
345
349
351 bool _groupExpired; // flag used only in update thread
352 };
353
354
356 {
357 public:
358
360
361 void add(DatabaseRequest* databaseRequest);
362 void remove(DatabaseRequest* databaseRequest);
363
364 void addNoLock(DatabaseRequest* databaseRequest);
365
367
370
371 virtual void updateBlock() {}
372
374
375 bool empty();
376
377 unsigned int size();
378
379 void clear();
380
381
382 typedef std::list< osg::ref_ptr<DatabaseRequest> > RequestList;
383 void swap(RequestList& requestList);
384
389
390 protected:
391 virtual ~RequestQueue();
392 };
393
394
395 typedef std::vector< osg::ref_ptr<DatabaseThread> > DatabaseThreadList;
396
398 {
399 ReadQueue(DatabasePager* pager, const std::string& name);
400
401 void block() { _block->block(); }
402
403 void release() { _block->release(); }
404
405 virtual void updateBlock();
406
407
409
410 std::string _name;
411
414 };
415
416 // forward declare inner helper classes
417 class FindCompileableGLObjectsVisitor;
418 friend class FindCompileableGLObjectsVisitor;
419
420 struct DatabasePagerCompileCompletedCallback;
421 friend struct DatabasePagerCompileCompletedCallback;
422
423 class FindPagedLODsVisitor;
424 friend class FindPagedLODsVisitor;
425
426 struct SortFileRequestFunctor;
427 friend struct SortFileRequestFunctor;
428
429
433
434 void compileCompleted(DatabaseRequest* databaseRequest);
435
439 virtual void removeExpiredSubgraphs(const osg::FrameStamp &frameStamp);
440
443
444
446
447 bool _done;
450
452
456
461
463
469
471
472
474
476
479
480
484 unsigned int _numTilesMerges;
485
487};
488
489}
490
491#endif
Simple container for specifying which CPU a thread should have affinity with. An empty Affinity....
Definition Affinity:34
This class provides an atomic increment and decrement operation.
Definition Atomic:48
This class provides an object-oriented thread mutex interface.
Definition Mutex:31
This class provides an object-oriented thread interface.
Definition Thread:48
ThreadPriority
Definition Thread:77
Definition DatabasePager:90
void setActive(bool active)
Definition DatabasePager:110
void setDone(bool done)
Definition DatabasePager:107
std::string _name
Definition DatabasePager:125
const std::string & getName() const
Definition DatabasePager:105
bool getActive() const
Definition DatabasePager:111
DatabasePager * _pager
Definition DatabasePager:123
OpenThreads::Atomic _done
Definition DatabasePager:121
void setName(const std::string &name)
Definition DatabasePager:104
Mode _mode
Definition DatabasePager:124
bool getDone() const
Definition DatabasePager:108
DatabaseThread(const DatabaseThread &dt, DatabasePager *pager)
volatile bool _active
Definition DatabasePager:122
DatabaseThread(DatabasePager *pager, Mode mode, const std::string &name)
Mode
Definition DatabasePager:94
@ HANDLE_NON_HTTP
Definition DatabasePager:96
@ HANDLE_ALL_REQUESTS
Definition DatabasePager:95
Definition DatabasePager:50
double _maximumTimeToMergeTile
Definition DatabasePager:482
virtual void removeExpiredSubgraphs(const osg::FrameStamp &frameStamp)
double getMaximumTimeToMergeTile() const
Definition DatabasePager:270
bool _acceptNewRequests
Definition DatabasePager:448
OpenThreads::Mutex _dr_mutex
Definition DatabasePager:431
bool requiresUpdateSceneGraph() const
bool getAcceptNewDatabaseRequests() const
Definition DatabasePager:153
virtual void setProcessorAffinity(const OpenThreads::Affinity &affinity)
DatabaseThread * getDatabaseThread(unsigned int i)
Definition DatabasePager:137
osg::ref_ptr< RequestQueue > _dataToCompileList
Definition DatabasePager:459
bool requiresRedraw() const
const osg::Object * getMarkerObject() const
Definition DatabasePager:298
osg::Object * getMarkerObject()
Definition DatabasePager:297
std::vector< osg::ref_ptr< DatabaseThread > > DatabaseThreadList
Definition DatabasePager:395
void setDrawablePolicy(DrawablePolicy policy)
Definition DatabasePager:217
osg::ref_ptr< ReadQueue > _httpRequestQueue
Definition DatabasePager:458
double _minimumTimeToMergeTile
Definition DatabasePager:481
osg::ref_ptr< osgUtil::IncrementalCompileOperation > _incrementalCompileOperation
Definition DatabasePager:478
int _numFramesActive
Definition DatabasePager:453
int getNumFramesActive() const
Definition DatabasePager:156
int setSchedulePriority(OpenThreads::Thread::ThreadPriority priority)
virtual ~DatabasePager()
DrawablePolicy getDrawablePolicy() const
Definition DatabasePager:220
std::list< osg::ref_ptr< osg::Object > > ObjectList
Definition DatabasePager:283
unsigned int getTargetMaximumNumberOfPageLOD() const
Definition DatabasePager:199
void setDoPreCompile(bool flag)
Definition DatabasePager:185
OpenThreads::Affinity & getProcessorAffinity()
Definition DatabasePager:130
virtual void requestNodeFile(const std::string &fileName, osg::NodePath &nodePath, float priority, const osg::FrameStamp *framestamp, osg::ref_ptr< osg::Referenced > &databaseRequest, const osg::Referenced *options)
unsigned int getDataToMergeListSize() const
Definition DatabasePager:261
unsigned int getFileRequestListSize() const
Definition DatabasePager:255
osg::ref_ptr< PagedLODList > _activePagedLODList
Definition DatabasePager:473
virtual void clear()
unsigned int getNumDatabaseThreads() const
Definition DatabasePager:141
double getAverageTimeToMergeTiles() const
Definition DatabasePager:273
virtual void updateSceneGraph(const osg::FrameStamp &frameStamp)
void setTargetMaximumNumberOfPageLOD(unsigned int target)
Definition DatabasePager:196
void setDatabasePagerThreadPause(bool pause)
OpenThreads::Affinity _affinity
Definition DatabasePager:445
void getUnrefImageDataAfterApplyPolicy(bool &changeAutoUnRef, bool &valueAutoUnRef) const
Definition DatabasePager:234
const OpenThreads::Affinity & getProcessorAffinity() const
Definition DatabasePager:131
static DatabasePager * create()
void compileCompleted(DatabaseRequest *databaseRequest)
void setUnrefImageDataAfterApplyPolicy(bool changeAutoUnRef, bool valueAutoUnRef)
Definition DatabasePager:231
virtual int cancel()
std::vector< osg::ref_ptr< osg::Drawable > > DrawableList
Definition DatabasePager:279
DatabasePager(const DatabasePager &rhs)
bool _doPreCompile
Definition DatabasePager:477
OpenThreads::Thread::ThreadPriority ThreadPriority
Definition DatabasePager:53
osgUtil::IncrementalCompileOperation * getIncrementalCompileOperation()
Definition DatabasePager:178
bool _assignPBOToImages
Definition DatabasePager:464
osg::ref_ptr< ReadQueue > _fileRequestQueue
Definition DatabasePager:457
void setUpThreads(unsigned int totalNumThreads=2, unsigned int numHttpThreads=1)
bool getApplyPBOToImages() const
Definition DatabasePager:227
void getMaxAnisotropyPolicy(bool &changeAnisotropy, float &valueAnisotropy) const
Definition DatabasePager:241
virtual bool isRunning() const
bool _changeAnisotropy
Definition DatabasePager:467
std::set< osg::ref_ptr< osg::StateSet > > StateSetList
Definition DatabasePager:278
virtual const char * className() const
Definition DatabasePager:59
bool getDeleteRemovedSubgraphsInDatabaseThread() const
Definition DatabasePager:206
unsigned int _numTilesMerges
Definition DatabasePager:484
virtual void registerPagedLODs(osg::Node *subgraph, unsigned int frameNumber=0)
const DatabaseThread * getDatabaseThread(unsigned int i) const
Definition DatabasePager:139
bool _databasePagerThreadPaused
Definition DatabasePager:449
bool _changeAutoUnRef
Definition DatabasePager:465
double getMinimumTimeToMergeTile() const
Definition DatabasePager:267
void setDeleteRemovedSubgraphsInDatabaseThread(bool flag)
Definition DatabasePager:203
bool _startThreadCalled
Definition DatabasePager:432
unsigned int getDataToCompileListSize() const
Definition DatabasePager:258
bool _deleteRemovedSubgraphsInDatabaseThread
Definition DatabasePager:470
bool _done
Definition DatabasePager:447
DatabaseThreadList _databaseThreads
Definition DatabasePager:451
virtual unsigned int addDatabaseThread(DatabaseThread::Mode mode, const std::string &name)
void setApplyPBOToImages(bool assignPBOToImages)
Definition DatabasePager:224
virtual DatabasePager * clone() const
Definition DatabasePager:62
void setIncrementalCompileOperation(osgUtil::IncrementalCompileOperation *ico)
virtual void signalBeginFrame(const osg::FrameStamp *framestamp)
bool getRequestsInProgress() const
static osg::ref_ptr< DatabasePager > & prototype()
unsigned int _targetMaximumNumberOfPageLOD
Definition DatabasePager:475
osg::ref_ptr< RequestQueue > _dataToMergeList
Definition DatabasePager:460
OpenThreads::Atomic _frameNumber
Definition DatabasePager:455
osg::ref_ptr< osg::Object > _markerObject
Definition DatabasePager:486
void addLoadedDataToSceneGraph(const osg::FrameStamp &frameStamp)
DrawablePolicy
Definition DatabasePager:209
@ USE_VERTEX_BUFFER_OBJECTS
Definition DatabasePager:212
@ DO_NOT_MODIFY_DRAWABLE_SETTINGS
Definition DatabasePager:210
@ USE_DISPLAY_LISTS
Definition DatabasePager:211
void setAcceptNewDatabaseRequests(bool acceptNewRequests)
Definition DatabasePager:150
DrawablePolicy _drawablePolicy
Definition DatabasePager:462
double _totalTimeToMergeTiles
Definition DatabasePager:483
bool getDatabasePagerThreadPause() const
Definition DatabasePager:147
bool _valueAutoUnRef
Definition DatabasePager:466
float _valueAnisotropy
Definition DatabasePager:468
OpenThreads::Mutex _run_mutex
Definition DatabasePager:430
OpenThreads::Mutex _numFramesActiveMutex
Definition DatabasePager:454
void setMaxAnisotropyPolicy(bool changeAnisotropy, float valueAnisotropy)
Definition DatabasePager:238
virtual void signalEndFrame()
void setMarkerObject(osg::Object *mo)
Definition DatabasePager:296
bool getDoPreCompile() const
Definition DatabasePager:189
Definition IncrementalCompileOperation:56
Definition FrameStamp:35
Definition Node:72
Definition Object:61
Definition Referenced:44
Definition observer_ptr:39
Definition ref_ptr:32
Definition Archive:24
author: Julien Valentin 2017 (mp3butcher@hotmail.com)
Definition AlphaFunc:19
std::vector< ref_ptr< Node > > NodeList
Definition Group:22
std::vector< Node * > NodePath
Definition Node:47
#define OSGDB_EXPORT
Definition osgDB/Export:39
Definition DatabasePager:310
float _priorityFirstRequest
Definition DatabasePager:337
unsigned int _frameNumberFirstRequest
Definition DatabasePager:335
bool isRequestCurrent(int frameNumber) const
Definition DatabasePager:328
unsigned int _numOfRequests
Definition DatabasePager:341
osg::ref_ptr< osg::Node > _loadedModel
Definition DatabasePager:346
osg::observer_ptr< osg::Group > _group
Definition DatabasePager:344
bool _valid
Definition DatabasePager:333
double _timestampFirstRequest
Definition DatabasePager:336
osg::ref_ptr< Options > _loadOptions
Definition DatabasePager:347
osg::observer_ptr< osgUtil::IncrementalCompileOperation::CompileSet > _compileSet
Definition DatabasePager:350
osg::ref_ptr< ObjectCache > _objectCache
Definition DatabasePager:348
double _timestampLastRequest
Definition DatabasePager:339
unsigned int _frameNumberLastRequest
Definition DatabasePager:338
bool valid() const
Definition DatabasePager:326
bool _groupExpired
Definition DatabasePager:351
float _priorityLastRequest
Definition DatabasePager:340
osg::observer_ptr< osg::Node > _terrain
Definition DatabasePager:343
DatabaseRequest()
Definition DatabasePager:311
std::string _fileName
Definition DatabasePager:334
Definition DatabasePager:286
virtual unsigned int size()=0
virtual void removeExpiredChildren(int numberChildrenToRemove, double expiryTime, unsigned int expiryFrame, ObjectList &childrenRemoved, bool visitActive)=0
virtual void insertPagedLOD(const osg::observer_ptr< osg::PagedLOD > &plod)=0
virtual bool containsPagedLOD(const osg::observer_ptr< osg::PagedLOD > &plod) const =0
virtual PagedLODList * clone()=0
virtual void removeNodes(osg::NodeList &nodesToRemove)=0
Definition DatabasePager:398
void block()
Definition DatabasePager:401
ReadQueue(DatabasePager *pager, const std::string &name)
std::string _name
Definition DatabasePager:410
ObjectList _childrenToDeleteList
Definition DatabasePager:413
void release()
Definition DatabasePager:403
OpenThreads::Mutex _childrenToDeleteListMutex
Definition DatabasePager:412
osg::ref_ptr< osg::RefBlock > _block
Definition DatabasePager:408
Definition DatabasePager:356
bool pruneOldRequestsAndCheckIfEmpty()
prune all the old requests and then return true if requestList left empty
void add(DatabaseRequest *databaseRequest)
RequestQueue(DatabasePager *pager)
void invalidate(DatabaseRequest *dr)
void swap(RequestList &requestList)
void remove(DatabaseRequest *databaseRequest)
OpenThreads::Mutex _requestMutex
Definition DatabasePager:387
RequestList _requestList
Definition DatabasePager:386
void takeFirst(osg::ref_ptr< DatabaseRequest > &databaseRequest)
std::list< osg::ref_ptr< DatabaseRequest > > RequestList
Definition DatabasePager:382
DatabasePager * _pager
Definition DatabasePager:385
unsigned int _frameNumberLastPruned
Definition DatabasePager:388
virtual void updateBlock()
Definition DatabasePager:371
void addNoLock(DatabaseRequest *databaseRequest)