mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
- Convert video object cache to hashmap from linked list. This will protect better against video object leaks and probably still be faster than the linked list. (by tazpn)
o new #define: USE_HASHMAP_FOR_VOBJECTS git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@5370 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -20,6 +20,8 @@
|
|||||||
#include "sgp.h"
|
#include "sgp.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <hash_map>
|
||||||
|
|
||||||
// ******************************************************************************
|
// ******************************************************************************
|
||||||
//
|
//
|
||||||
// Video Object SGP Module
|
// Video Object SGP Module
|
||||||
@@ -64,6 +66,22 @@
|
|||||||
HLIST ghVideoObjects = NULL;
|
HLIST ghVideoObjects = NULL;
|
||||||
BOOLEAN gfVideoObjectsInit=FALSE;
|
BOOLEAN gfVideoObjectsInit=FALSE;
|
||||||
|
|
||||||
|
#define USE_HASHMAP_FOR_VOBJECTS
|
||||||
|
#ifdef USE_HASHMAP_FOR_VOBJECTS
|
||||||
|
typedef struct VOBJECT_NODE
|
||||||
|
{
|
||||||
|
HVOBJECT hVObject;
|
||||||
|
UINT32 uiIndex;
|
||||||
|
#ifdef SGP_VIDEO_DEBUGGING
|
||||||
|
STR8 pName;
|
||||||
|
STR8 pCode;
|
||||||
|
#endif
|
||||||
|
} VOBJECT_NODE, *VOBJECT_NODE_PTR;
|
||||||
|
|
||||||
|
typedef std::hash_map<UINT32, VOBJECT_NODE_PTR> VOBJECT_MAP;
|
||||||
|
static VOBJECT_MAP gpVObjectMap;
|
||||||
|
|
||||||
|
#else
|
||||||
typedef struct VOBJECT_NODE
|
typedef struct VOBJECT_NODE
|
||||||
{
|
{
|
||||||
HVOBJECT hVObject;
|
HVOBJECT hVObject;
|
||||||
@@ -79,6 +97,7 @@ typedef struct VOBJECT_NODE
|
|||||||
|
|
||||||
VOBJECT_NODE *gpVObjectHead = NULL;
|
VOBJECT_NODE *gpVObjectHead = NULL;
|
||||||
VOBJECT_NODE *gpVObjectTail = NULL;
|
VOBJECT_NODE *gpVObjectTail = NULL;
|
||||||
|
#endif
|
||||||
UINT32 guiVObjectIndex = 1;
|
UINT32 guiVObjectIndex = 1;
|
||||||
UINT32 guiVObjectSize = 0;
|
UINT32 guiVObjectSize = 0;
|
||||||
UINT32 guiVObjectTotalAdded = 0;
|
UINT32 guiVObjectTotalAdded = 0;
|
||||||
@@ -130,10 +149,15 @@ BOOLEAN InitializeVideoObjectManager( )
|
|||||||
{
|
{
|
||||||
//Shouldn't be calling this if the video object manager already exists.
|
//Shouldn't be calling this if the video object manager already exists.
|
||||||
//Call shutdown first...
|
//Call shutdown first...
|
||||||
|
#ifdef USE_HASHMAP_FOR_VOBJECTS
|
||||||
|
Assert( gpVObjectMap.empty() );
|
||||||
|
RegisterDebugTopic(TOPIC_VIDEOOBJECT, "Video Object Manager");
|
||||||
|
#else
|
||||||
Assert( !gpVObjectHead );
|
Assert( !gpVObjectHead );
|
||||||
Assert( !gpVObjectTail );
|
Assert( !gpVObjectTail );
|
||||||
RegisterDebugTopic(TOPIC_VIDEOOBJECT, "Video Object Manager");
|
RegisterDebugTopic(TOPIC_VIDEOOBJECT, "Video Object Manager");
|
||||||
gpVObjectHead = gpVObjectTail = NULL;
|
gpVObjectHead = gpVObjectTail = NULL;
|
||||||
|
#endif
|
||||||
gfVideoObjectsInit=TRUE;
|
gfVideoObjectsInit=TRUE;
|
||||||
return TRUE ;
|
return TRUE ;
|
||||||
}
|
}
|
||||||
@@ -141,6 +165,21 @@ BOOLEAN InitializeVideoObjectManager( )
|
|||||||
BOOLEAN ShutdownVideoObjectManager( )
|
BOOLEAN ShutdownVideoObjectManager( )
|
||||||
{
|
{
|
||||||
VOBJECT_NODE *curr;
|
VOBJECT_NODE *curr;
|
||||||
|
#ifdef USE_HASHMAP_FOR_VOBJECTS
|
||||||
|
for(VOBJECT_MAP::iterator itr=gpVObjectMap.begin(); itr != gpVObjectMap.end(); ++itr )
|
||||||
|
{
|
||||||
|
curr = (*itr).second;
|
||||||
|
DeleteVideoObject( curr->hVObject );
|
||||||
|
#ifdef SGP_VIDEO_DEBUGGING
|
||||||
|
if( curr->pName )
|
||||||
|
MemFree( curr->pName );
|
||||||
|
if( curr->pCode )
|
||||||
|
MemFree( curr->pCode );
|
||||||
|
#endif
|
||||||
|
MemFree( curr );
|
||||||
|
}
|
||||||
|
gpVObjectMap.clear();
|
||||||
|
#else
|
||||||
while( gpVObjectHead )
|
while( gpVObjectHead )
|
||||||
{
|
{
|
||||||
curr = gpVObjectHead;
|
curr = gpVObjectHead;
|
||||||
@@ -156,6 +195,7 @@ BOOLEAN ShutdownVideoObjectManager( )
|
|||||||
}
|
}
|
||||||
gpVObjectHead = NULL;
|
gpVObjectHead = NULL;
|
||||||
gpVObjectTail = NULL;
|
gpVObjectTail = NULL;
|
||||||
|
#endif
|
||||||
guiVObjectIndex = 1;
|
guiVObjectIndex = 1;
|
||||||
guiVObjectSize = 0;
|
guiVObjectSize = 0;
|
||||||
guiVObjectTotalAdded = 0;
|
guiVObjectTotalAdded = 0;
|
||||||
@@ -166,6 +206,9 @@ BOOLEAN ShutdownVideoObjectManager( )
|
|||||||
|
|
||||||
UINT32 CountVideoObjectNodes()
|
UINT32 CountVideoObjectNodes()
|
||||||
{
|
{
|
||||||
|
#ifdef USE_HASHMAP_FOR_VOBJECTS
|
||||||
|
return gpVObjectMap.size();
|
||||||
|
#else
|
||||||
VOBJECT_NODE *curr;
|
VOBJECT_NODE *curr;
|
||||||
UINT32 i = 0;
|
UINT32 i = 0;
|
||||||
curr = gpVObjectHead;
|
curr = gpVObjectHead;
|
||||||
@@ -175,6 +218,7 @@ UINT32 CountVideoObjectNodes()
|
|||||||
curr = curr->next;
|
curr = curr->next;
|
||||||
}
|
}
|
||||||
return i;
|
return i;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN AddStandardVideoObject( VOBJECT_DESC *pVObjectDesc, UINT32 *puiIndex )
|
BOOLEAN AddStandardVideoObject( VOBJECT_DESC *pVObjectDesc, UINT32 *puiIndex )
|
||||||
@@ -198,6 +242,17 @@ BOOLEAN AddStandardVideoObject( VOBJECT_DESC *pVObjectDesc, UINT32 *puiIndex )
|
|||||||
// Set transparency to default
|
// Set transparency to default
|
||||||
SetVideoObjectTransparencyColor( hVObject, FROMRGB( 0, 0, 0 ) );
|
SetVideoObjectTransparencyColor( hVObject, FROMRGB( 0, 0, 0 ) );
|
||||||
|
|
||||||
|
#ifdef USE_HASHMAP_FOR_VOBJECTS
|
||||||
|
{
|
||||||
|
VOBJECT_NODE_PTR curr = (VOBJECT_NODE*)MemAlloc( sizeof( VOBJECT_NODE ) );
|
||||||
|
memset(curr, 0, sizeof(VOBJECT_NODE));
|
||||||
|
curr->hVObject = hVObject;
|
||||||
|
curr->uiIndex = guiVObjectIndex++;
|
||||||
|
*puiIndex = curr->uiIndex;
|
||||||
|
|
||||||
|
gpVObjectMap[curr->uiIndex] = curr;
|
||||||
|
}
|
||||||
|
#else
|
||||||
// Set into video object list
|
// Set into video object list
|
||||||
if( gpVObjectHead )
|
if( gpVObjectHead )
|
||||||
{ //Add node after tail
|
{ //Add node after tail
|
||||||
@@ -222,6 +277,7 @@ BOOLEAN AddStandardVideoObject( VOBJECT_DESC *pVObjectDesc, UINT32 *puiIndex )
|
|||||||
gpVObjectTail->hVObject = hVObject;
|
gpVObjectTail->hVObject = hVObject;
|
||||||
gpVObjectTail->uiIndex = guiVObjectIndex+=2;
|
gpVObjectTail->uiIndex = guiVObjectIndex+=2;
|
||||||
*puiIndex = gpVObjectTail->uiIndex;
|
*puiIndex = gpVObjectTail->uiIndex;
|
||||||
|
#endif
|
||||||
Assert( guiVObjectIndex < 0xfffffff0 ); //unlikely that we will ever use 2 billion vobjects!
|
Assert( guiVObjectIndex < 0xfffffff0 ); //unlikely that we will ever use 2 billion vobjects!
|
||||||
//We would have to create about 70 vobjects per second for 1 year straight to achieve this...
|
//We would have to create about 70 vobjects per second for 1 year straight to achieve this...
|
||||||
guiVObjectSize++;
|
guiVObjectSize++;
|
||||||
@@ -254,14 +310,23 @@ BOOLEAN SetVideoObjectTransparency( UINT32 uiIndex, COLORVAL TransColor )
|
|||||||
return( TRUE );
|
return( TRUE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN GetVideoObject( HVOBJECT *hVObject, UINT32 uiIndex )
|
BOOLEAN GetVideoObject( HVOBJECT *hVObject, UINT32 uiIndex )
|
||||||
{
|
{
|
||||||
VOBJECT_NODE *curr;
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
CheckValidVObjectIndex( uiIndex );
|
CheckValidVObjectIndex( uiIndex );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_HASHMAP_FOR_VOBJECTS
|
||||||
|
VOBJECT_MAP::iterator itr = gpVObjectMap.find(uiIndex);
|
||||||
|
if (itr != gpVObjectMap.end())
|
||||||
|
{
|
||||||
|
*hVObject = (*itr).second->hVObject;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
VOBJECT_NODE *curr;
|
||||||
curr = gpVObjectHead;
|
curr = gpVObjectHead;
|
||||||
while( curr )
|
while( curr )
|
||||||
{
|
{
|
||||||
@@ -272,6 +337,7 @@ BOOLEAN GetVideoObject( HVOBJECT *hVObject, UINT32 uiIndex )
|
|||||||
}
|
}
|
||||||
curr = curr->next;
|
curr = curr->next;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
*hVObject = NULL;
|
*hVObject = NULL;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -322,6 +388,35 @@ BOOLEAN DeleteVideoObjectFromIndex( UINT32 uiVObject )
|
|||||||
CheckValidVObjectIndex( uiVObject );
|
CheckValidVObjectIndex( uiVObject );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_HASHMAP_FOR_VOBJECTS
|
||||||
|
VOBJECT_MAP::iterator itr = gpVObjectMap.find(uiVObject);
|
||||||
|
if (itr != gpVObjectMap.end())
|
||||||
|
{
|
||||||
|
curr = (*itr).second;
|
||||||
|
|
||||||
|
DeleteVideoObject( curr->hVObject );
|
||||||
|
|
||||||
|
//The node is now detached. Now deallocate it.
|
||||||
|
#ifdef SGP_VIDEO_DEBUGGING
|
||||||
|
if( curr->pName )
|
||||||
|
MemFree( curr->pName );
|
||||||
|
if( curr->pCode )
|
||||||
|
MemFree( curr->pCode );
|
||||||
|
#endif
|
||||||
|
MemFree( curr );
|
||||||
|
curr = NULL;
|
||||||
|
guiVObjectSize--;
|
||||||
|
|
||||||
|
gpVObjectMap.erase(itr);
|
||||||
|
#ifdef JA2TESTVERSION
|
||||||
|
if( CountVideoObjectNodes() != guiVObjectSize )
|
||||||
|
{
|
||||||
|
guiVObjectSize = guiVObjectSize;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#else
|
||||||
curr = gpVObjectHead;
|
curr = gpVObjectHead;
|
||||||
while( curr )
|
while( curr )
|
||||||
{
|
{
|
||||||
@@ -368,6 +463,7 @@ BOOLEAN DeleteVideoObjectFromIndex( UINT32 uiVObject )
|
|||||||
}
|
}
|
||||||
curr = curr->next;
|
curr = curr->next;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user