From: <axl...@us...> - 2008-12-22 01:03:35
|
Revision: 78 http://hgengine.svn.sourceforge.net/hgengine/?rev=78&view=rev Author: axlecrusher Date: 2008-12-22 01:03:32 +0000 (Mon, 22 Dec 2008) Log Message: ----------- update Modified Paths: -------------- Mercury2/src/Mercury2.cpp Mercury2/src/RenderableNode.cpp Mercury2/src/RenderableNode.h Modified: Mercury2/src/Mercury2.cpp =================================================================== --- Mercury2/src/Mercury2.cpp 2008-12-15 01:23:28 UTC (rev 77) +++ Mercury2/src/Mercury2.cpp 2008-12-22 01:03:32 UTC (rev 78) @@ -6,9 +6,12 @@ #include <XMLParser.h> +#include <RenderableNode.h> + +MSemaphore UpdateLoopGo; void* UpdateThread(void* node) { - while(true) + while( UpdateLoopGo.ReadValue() < 1 ) { MercuryNode* n = (MercuryNode*)node; n->RecursiveUpdate(0.01f); @@ -30,13 +33,13 @@ SAFE_DELETE(doc); - MercuryThread updateThread; +// MercuryThread updateThread; m_time = time(NULL); - updateThread.Create( UpdateThread, root, false); +// updateThread.Create( UpdateThread, root, false); do { -// root->RecursiveUpdate(0.01f); + root->RecursiveUpdate(0.01f); // updateThread.Create( UpdateThread, root, false); RenderableNode::RecursiveRender(root); w->SwapBuffers(); @@ -48,16 +51,19 @@ printf("FPS: %lu\n", m_count); m_count = 0; } -// updateThread.Wait(); } while ( w->PumpMessages() ); - updateThread.HaltOnDestroy(true); - updateThread.Halt(); +// UpdateLoopGo.Increment(); +// updateThread.Wait(); SAFE_DELETE(root); SAFE_DELETE(w); + uint64_t totalWaited = UpdateWaited + RenderWaited; + printf("Update wait %%%f\n", (UpdateWaited/double(totalWaited))*100.0f); + printf("Render wait %%%f\n", (RenderWaited/double(totalWaited))*100.0f); + return 0; } Modified: Mercury2/src/RenderableNode.cpp =================================================================== --- Mercury2/src/RenderableNode.cpp 2008-12-15 01:23:28 UTC (rev 77) +++ Mercury2/src/RenderableNode.cpp 2008-12-22 01:03:32 UTC (rev 78) @@ -7,6 +7,9 @@ REGISTER_NODE_TYPE(RenderableNode); +uint64_t RenderWaited = 0; +uint64_t UpdateWaited = 0; + RenderableNode::RenderableNode() :m_hidden(false) { @@ -21,8 +24,19 @@ void RenderableNode::Update(float dTime) { + static unsigned long waitTime = 0; MSemaphoreIncOnDestroy s( &m_semaphore ); - Spinlock(0); +// if ( Spinlock(0) ) ++UpdateWaited; +// if ( SpinlockWait(0, 100000) ) ++UpdateWaited; +// UpdateWaited += Spinlock(0); + + int unsigned long waited = SpinlockWait(0, waitTime); + if (waited > 0) + waitTime = (waitTime<1000000)?waitTime+1000:waitTime; + else + waitTime = (waitTime!=0)?waitTime-1000:0; + + UpdateWaited += waited; } void RenderableNode::Render() @@ -95,11 +109,21 @@ void RenderableNode::RecursiveRender( MercuryNode* n ) { + static unsigned long waitTime = 0; RenderableNode* rn; if ( rn = Cast(n) ) { MSemaphoreDecOnDestroy s( &(rn->m_semaphore) ); - rn->Spinlock(1); + + int unsigned long waited = rn->SpinlockWait(1, waitTime); + if (waited > 0) + waitTime = (waitTime<1000000)?waitTime+1000:waitTime; + else + waitTime = (waitTime!=0)?waitTime-1000:0; + + RenderWaited += waited; + +// ++RenderWaited += rn->Spinlock(1); rn->Render(); } @@ -132,6 +156,27 @@ MercuryNode::LoadFromXML( node ); } +unsigned long RenderableNode::Spinlock( unsigned long value ) +{ + unsigned long waited = 0; + while (m_semaphore.ReadValue() != value) ++waited; + return waited; +} + +unsigned long RenderableNode::SpinlockWait( unsigned long value, unsigned long usec ) +{ + unsigned long waited = 0; + while (m_semaphore.ReadValue() != value) + { +// waited=true; + ++waited; + if (usec>0) usleep(usec); + } + return waited; +} + + + /*************************************************************************** * Copyright (C) 2008 by Joshua Allen * * * Modified: Mercury2/src/RenderableNode.h =================================================================== --- Mercury2/src/RenderableNode.h 2008-12-15 01:23:28 UTC (rev 77) +++ Mercury2/src/RenderableNode.h 2008-12-22 01:03:32 UTC (rev 78) @@ -9,6 +9,9 @@ #define MCHECKASSETS +extern uint64_t RenderWaited; +extern uint64_t UpdateWaited; + class RenderableNode : public MercuryNode { public: @@ -39,7 +42,8 @@ bool m_hidden; private: bool IsInAssetList(MercuryAsset* asset) const; - inline void Spinlock( unsigned long value ) { while (m_semaphore.ReadValue() != value); } + unsigned long Spinlock( unsigned long value ); + unsigned long SpinlockWait( unsigned long value, unsigned long usec ); std::list< MAutoPtr< MercuryAsset > > m_assets; ///serves as a holder for memory This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |