Show
Ignore:
Timestamp:
06/05/08 20:52:29 (7 years ago)
Author:
robert
Message:

Added timing code

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgkdtree/osgkdtree.cpp

    r8410 r8411  
    6363        } 
    6464 
    65         typedef int value_type; 
     65        typedef short value_type; 
    6666 
    6767        value_type _leftChild; 
     
    234234            osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), 
    235235            _maxNumLevels(24), 
    236             _targetNumVerticesPerLeaf(8)             
     236            _targetNumVerticesPerLeaf(8), 
     237            _numVerticesProcessed(0) 
    237238        {             
    238239        } 
     
    258259 
    259260        unsigned int _maxNumLevels; 
    260         unsigned int _targetNumVerticesPerLeaf;         
     261        unsigned int _targetNumVerticesPerLeaf; 
     262         
     263        unsigned int _numVerticesProcessed;    
    261264 
    262265}; 
     
    265268KDTree* KDTreeBuilder::createKDTree(osg::Geometry* geometry) 
    266269{ 
     270#if VERBOSE_OUTPUT     
    267271    osg::notify(osg::NOTICE)<<"osg::KDTreeBuilder::createKDTree()"<<std::endl; 
     272#endif 
    268273 
    269274    osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray()); 
     
    277282    unsigned int estimatedSize = (unsigned int)(float(vertices->size())/float(_targetNumVerticesPerLeaf)*1.5); 
    278283 
     284#if VERBOSE_OUTPUT     
    279285    osg::notify(osg::NOTICE)<<"kdTree->_kdNodes.reserve()="<<estimatedSize<<std::endl<<std::endl; 
     286#endif 
    280287 
    281288    kdTree->_kdNodes.reserve(estimatedSize); 
     
    284291    computeDivisions(*kdTree); 
    285292 
     293 
     294    _numVerticesProcessed += vertices->size(); 
     295 
    286296    // create initial leaf list     
    287     osg::ref_ptr<KDLeaf> leaf = new KDLeaf; 
     297    KDLeaf* leaf = new KDLeaf; 
    288298    leaf->_vertexIndices.reserve(vertices->size()); 
    289299    for(unsigned int i=0; i<vertices->size(); ++i) 
     
    294304    osg::BoundingBox bb = kdTree->_bb; 
    295305     
    296     int leafNum = kdTree->addLeaf(leaf.get()); 
     306    int leafNum = kdTree->addLeaf(leaf); 
    297307    int nodeNum = divide(*kdTree, bb, leafNum, 0); 
    298308     
     309#if VERBOSE_OUTPUT     
    299310    osg::notify(osg::NOTICE)<<"Root nodeNum="<<nodeNum<<std::endl; 
    300      
     311#endif 
     312     
     313#if VERBOSE_OUTPUT     
    301314     
    302315    KDTreeTraverser traverser; 
     
    307320 
    308321    osg::notify(osg::NOTICE)<<"osg::KDTreeBuilder::createKDTree() completed"<<std::endl<<std::endl; 
     322#endif 
    309323 
    310324    return kdTree.release(); 
     
    319333                         kdTree._bb.zMax()-kdTree._bb.zMin()); 
    320334 
     335#if VERBOSE_OUTPUT     
    321336    osg::notify(osg::NOTICE)<<"computeDivisions("<<_maxNumLevels<<") "<<dimensions<< " { "<<std::endl; 
     337#endif 
    322338 
    323339    kdTree._axisStack.reserve(_maxNumLevels); 
     
    338354        dimensions[axis] /= 2.0f; 
    339355 
     356#if VERBOSE_OUTPUT     
    340357        osg::notify(osg::NOTICE)<<"  "<<level<<", "<<dimensions<<", "<<axis<<std::endl; 
     358#endif 
    341359    } 
    342360 
     361#if VERBOSE_OUTPUT     
    343362    osg::notify(osg::NOTICE)<<"}"<<std::endl; 
     363#endif 
    344364} 
    345365 
     
    351371    int axis = kdTree._axisStack[level]; 
    352372 
    353     osg::notify(osg::NOTICE)<<"divide("<<nodeIndex<<", "<<level<< "), axis="<<axis<<std::endl; 
     373#if VERBOSE_OUTPUT     
     374    //osg::notify(osg::NOTICE)<<"divide("<<nodeIndex<<", "<<level<< "), axis="<<axis<<std::endl; 
     375#endif 
    354376 
    355377    if (nodeIndex>=0) 
    356378    { 
     379#if VERBOSE_OUTPUT     
    357380        osg::notify(osg::NOTICE)<<"  divide node"<<std::endl; 
     381#endif 
    358382        KDNode& node = kdTree.getNode(nodeIndex); 
    359383        return nodeIndex; 
     
    363387        if (kdTree.getLeaf(nodeIndex)->_vertexIndices.size()<=_targetNumVerticesPerLeaf) return nodeIndex; 
    364388     
    365         osg::notify(osg::NOTICE)<<"  divide leaf"<<std::endl; 
     389        //osg::notify(osg::NOTICE)<<"  divide leaf"<<std::endl; 
    366390         
    367391        int nodeNum = kdTree.addNode(KDNode()); 
     
    382406            osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(kdTree._geometry->getVertexArray()); 
    383407 
    384             osg::notify(osg::NOTICE)<<"  divide leaf->_vertexIndices.size()="<<leaf->_vertexIndices.size()<<std::endl; 
     408            //osg::notify(osg::NOTICE)<<"  divide leaf->_vertexIndices.size()="<<leaf->_vertexIndices.size()<<std::endl; 
    385409 
    386410            unsigned int estimatedSize = leaf->_vertexIndices.size(); 
     
    398422            if (leftLeaf->_vertexIndices.empty()) 
    399423            { 
    400                 osg::notify(osg::NOTICE)<<"LeftLeaf empty"<<std::endl; 
     424                //osg::notify(osg::NOTICE)<<"LeftLeaf empty"<<std::endl; 
    401425                kdTree.getNode(nodeNum)._leftChild = 0; 
    402426                kdTree.getNode(nodeNum)._rightChild = kdTree.replaceLeaf(nodeIndex, rightLeaf.get()); 
     
    404428            else if (rightLeaf->_vertexIndices.empty()) 
    405429            { 
    406                 osg::notify(osg::NOTICE)<<"RightLeaf empty"<<std::endl; 
     430                //osg::notify(osg::NOTICE)<<"RightLeaf empty"<<std::endl; 
    407431                kdTree.getNode(nodeNum)._leftChild = kdTree.replaceLeaf(nodeIndex, leftLeaf.get()); 
    408432                kdTree.getNode(nodeNum)._rightChild = 0; 
     
    424448        bb._max[axis] = mid; 
    425449 
    426         osg::notify(osg::NOTICE)<<"  divide leftLeaf "<<kdTree.getNode(nodeNum)._leftChild<<std::endl; 
     450        //osg::notify(osg::NOTICE)<<"  divide leftLeaf "<<kdTree.getNode(nodeNum)._leftChild<<std::endl; 
    427451        int leftChildIndex = divide(kdTree, bb, originalLeftChildIndex, level+1); 
    428452 
     
    432456        bb._min[axis] = mid; 
    433457 
    434         osg::notify(osg::NOTICE)<<"  divide rightLeaf "<<kdTree.getNode(nodeNum)._rightChild<<std::endl; 
     458        //osg::notify(osg::NOTICE)<<"  divide rightLeaf "<<kdTree.getNode(nodeNum)._rightChild<<std::endl; 
    435459        int rightChildIndex = divide(kdTree, bb, originalRightChildIndex, level+1); 
    436460         
     
    460484        return 0; 
    461485    } 
     486 
     487 
     488    osg::Timer_t start = osg::Timer::instance()->tick(); 
    462489     
    463490    osg::KDTreeBuilder builder; 
    464491    scene->accept(builder); 
    465492     
     493    osg::Timer_t end = osg::Timer::instance()->tick(); 
     494    double time = osg::Timer::instance()->delta_s(start,end); 
     495    osg::notify(osg::NOTICE)<<"Time to build "<<time*1000.0<<"ms "<<builder._numVerticesProcessed<<std::endl; 
     496    osg::notify(osg::NOTICE)<<"build speed "<<(double(builder._numVerticesProcessed)/time)/1000000.0<<"M vertices per second"<<std::endl; 
    466497     
    467498