Skip to content

Commit

Permalink
PE: Optimizing - cStr - changed to use ringbuffer instead of temp sto…
Browse files Browse the repository at this point in the history
…rage, save tons of memory, levels with 3000 object = 1gb. memory saved.
  • Loading branch information
plemsoft committed Jan 7, 2025
1 parent 7b159da commit 639a4a1
Showing 1 changed file with 71 additions and 5 deletions.
76 changes: 71 additions & 5 deletions GameGuru Core/GameGuru/Source/cStr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ bool noDeleteCSTR = false;
#define STRMINSIZE 128
#endif

//PE: ZTEMP just use double mem, no need, use a ringbuffer instead. And we have very many of these in entityelements.
#define DISABLEZTEMP


//#define TESTUSEOFSTRINGS
#ifdef TESTUSEOFSTRINGS
int CheckPreSize[5000];
Expand All @@ -56,16 +60,22 @@ cStr::cStr ( const cStr& cString )
if ( m_size >= STRMINSIZE )
{
m_pString = new char [ sizeof ( char ) * ( m_size ) + 1 ];
#ifndef DISABLEZTEMP
m_szTemp = new char [ sizeof ( char ) * ( m_size ) + 1 ];
#endif
}
else
{
m_pString = new char [ STRMINSIZE ];
#ifndef DISABLEZTEMP
m_szTemp = new char [ STRMINSIZE ];
#endif
}

memset ( m_pString, 0, sizeof ( m_pString ) );
#ifndef DISABLEZTEMP
memset ( m_szTemp, 0, sizeof ( m_szTemp ) );
#endif
strcpy ( m_pString, cString.m_pString );

}
Expand All @@ -80,16 +90,22 @@ cStr::cStr ( char* szString )
if ( m_size >= STRMINSIZE )
{
m_pString = new char [ sizeof ( char ) * ( m_size ) + 1 ];
#ifndef DISABLEZTEMP
m_szTemp = new char [ sizeof ( char ) * ( m_size ) + 1 ];
#endif
}
else
{
m_pString = new char [ STRMINSIZE ];
#ifndef DISABLEZTEMP
m_szTemp = new char [ STRMINSIZE ];
#endif
}

memset ( m_pString, 0, sizeof ( m_pString ) );
#ifndef DISABLEZTEMP
memset ( m_szTemp, 0, sizeof ( m_szTemp ) );
#endif
strcpy ( m_pString, szString );

}
Expand All @@ -100,38 +116,43 @@ cStr::cStr ( int iValue )
memset ( m_pString, 0, sizeof ( m_pString ) );
sprintf ( m_pString, "%i", iValue );

#ifndef DISABLEZTEMP
m_szTemp = new char [ STRMINSIZE ];
memset ( m_szTemp, 0, sizeof ( m_szTemp ) );
#endif
}

cStr::cStr ( float fValue )
{
m_pString = new char [ STRMINSIZE ];
memset ( m_pString, 0, sizeof ( m_pString ) );
sprintf ( m_pString, "%.2f", fValue );

#ifndef DISABLEZTEMP
m_szTemp = new char [ STRMINSIZE ];
memset ( m_szTemp, 0, sizeof ( m_szTemp ) );
#endif
}

cStr::cStr ( double dValue )
{
m_pString = new char [ STRMINSIZE ];
memset ( m_pString, 0, sizeof ( m_pString ) );
sprintf ( m_pString, "%.2f", ( float ) dValue );

#ifndef DISABLEZTEMP
m_szTemp = new char [ STRMINSIZE ];
memset ( m_szTemp, 0, sizeof ( m_szTemp ) );
#endif
}

cStr::cStr ( )
{
m_pString = new char [ STRMINSIZE ];
memset ( m_pString, 0, sizeof ( m_pString ) );
strcpy ( m_pString, "" );

#ifndef DISABLEZTEMP
m_szTemp = new char [ STRMINSIZE ];
memset ( m_szTemp, 0, sizeof ( m_szTemp ) );
#endif
}

cStr::~cStr ( )
Expand All @@ -140,12 +161,19 @@ cStr::~cStr ( )
{
if ( m_pString )
delete [ ] m_pString;

#ifndef DISABLEZTEMP
if ( m_szTemp )
delete [] m_szTemp; //PE: Heap error here if >256 strings and using s=s+" "
#endif
}
}

#ifdef DISABLEZTEMP
char* m_sTemp[20] = { nullptr };
int m_iLen[20] = { 0 };
int m_iCurrentBuffer = 0;
#endif

cStr cStr::operator + ( const cStr& other )
{
//PE: We have a bug here if using >= 256 strings and using:
Expand All @@ -154,7 +182,37 @@ cStr cStr::operator + ( const cStr& other )
// s += " " // This works.

m_size = (int) strlen ( other.m_pString ) + (int) strlen ( m_pString );
#ifdef DISABLEZTEMP

//PE: Use a ringbuffer.
m_iCurrentBuffer++;
if (m_iCurrentBuffer >= 19)
m_iCurrentBuffer = 0;

if (m_iLen[m_iCurrentBuffer] <= (m_size + 50) || !m_sTemp[m_iCurrentBuffer])
{
if(m_sTemp[m_iCurrentBuffer])
delete[] m_sTemp[m_iCurrentBuffer];
m_sTemp[m_iCurrentBuffer] = new char[sizeof(char) * ((m_size) + 51)];
m_iLen[m_iCurrentBuffer] = (m_size + 50);
}

if (m_sTemp[m_iCurrentBuffer])
{
if (m_pString)
strcpy(m_sTemp[m_iCurrentBuffer], m_pString);
else
m_sTemp[m_iCurrentBuffer][0] = 0;

if (other.m_pString)
strcat(m_sTemp[m_iCurrentBuffer], other.m_pString);

return cStr(m_sTemp[m_iCurrentBuffer]);
}
else
return(cStr("m_sTemp[m_iCurrentBuffer] alloc failed.")); //PE: Debug only should never happen.

#else
if ( m_size >= STRMINSIZE )
{
#ifdef TESTUSEOFSTRINGS
Expand All @@ -173,7 +231,9 @@ cStr cStr::operator + ( const cStr& other )
if ( other.m_pString )
strcat ( m_szTemp, other.m_pString );

return cStr ( m_szTemp );
return cStr(m_szTemp);
#endif

}

cStr& cStr::operator += ( const cStr& other )
Expand All @@ -191,8 +251,10 @@ cStr& cStr::operator += ( const cStr& other )
strcpy ( newstring , m_pString );
delete[] m_pString;
m_pString = newstring;
#ifndef DISABLEZTEMP
delete[] m_szTemp;
m_szTemp = new char [ sizeof ( char ) * ( m_size ) + 1 ];
#endif
}

if ( other.m_pString )
Expand All @@ -214,8 +276,10 @@ cStr cStr::operator = ( const cStr& other )
char* newstring = new char [ sizeof ( char ) * ( m_size ) + 1 ];
delete[] m_pString;
m_pString = newstring;
#ifndef DISABLEZTEMP
delete[] m_szTemp;
m_szTemp = new char [ sizeof ( char ) * ( m_size ) + 1 ];
#endif
}

strcpy ( m_pString, other.m_pString );
Expand Down Expand Up @@ -243,8 +307,10 @@ cStr& cStr::operator = ( const char* other )
char* newstring = new char [ sizeof ( char ) * ( m_size ) + 1 ];
delete[] m_pString;
m_pString = newstring;
#ifndef DISABLEZTEMP
delete[] m_szTemp;
m_szTemp = new char [ sizeof ( char ) * ( m_size ) + 1 ];
#endif
}
//PE: m_pString was 0 here ? called from line (t.tfile_s="audiobank\\materials\\materialdefault.txt";) ?
strcpy ( m_pString, other );
Expand Down

0 comments on commit 639a4a1

Please sign in to comment.