|
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.
|