diff --git a/Engine/source/app/mainLoop.cpp b/Engine/source/app/mainLoop.cpp index 871a7cc88..97f25e4f3 100644 --- a/Engine/source/app/mainLoop.cpp +++ b/Engine/source/app/mainLoop.cpp @@ -633,6 +633,7 @@ bool StandardMainLoop::doMainLoop() ThreadPool::processMainThreadWorkItems(); Sampler::endFrame(); + ConsoleValue::resetConversionBuffer(); PROFILE_END_NAMED(MainLoop); } diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index 36b0aa4d8..399298864 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -46,21 +46,29 @@ extern StringStack STR; extern ConsoleValueStack<4096> gCallStack; -char ConsoleValue::sConversionBuffer[ConversionBufferSize]; +Vector ConsoleValue::sConversionBuffer; void ConsoleValue::init() { - dMemset(sConversionBuffer, '\0', ConversionBufferSize); + sConversionBuffer.reserve(8192); +} + +void ConsoleValue::resetConversionBuffer() +{ + sConversionBuffer.resetAndTreatAsScratchBuffer(); } char* ConsoleValue::convertToBuffer() const { + ConversionBuffer conversion; + if (type == ConsoleValueType::cvFloat) - dSprintf(sConversionBuffer, ConversionBufferSize, "%.9g", f); + dSprintf(conversion.buffer, ConversionBufferStride, "%.9g", f); else - dSprintf(sConversionBuffer, ConversionBufferSize, "%lld", i); + dSprintf(conversion.buffer, ConversionBufferStride, "%lld", i); - return sConversionBuffer; + sConversionBuffer.push_back(std::move(conversion)); + return sConversionBuffer.last().buffer; } const char* ConsoleValue::getConsoleData() const diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index a5086488c..5c72f34e1 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -148,10 +148,15 @@ class ConsoleValue enum Constants { - ConversionBufferSize = 32 + ConversionBufferStride = 32 }; - static char sConversionBuffer[ConversionBufferSize]; + struct ConversionBuffer + { + char buffer[ConversionBufferStride]; + }; + + static Vector sConversionBuffer; char* convertToBuffer() const; @@ -387,6 +392,7 @@ public: } static void init(); + static void resetConversionBuffer(); }; // Transparently converts ConsoleValue[] to const char** diff --git a/Engine/source/core/util/tVector.h b/Engine/source/core/util/tVector.h index 0700a5554..57cb84e24 100644 --- a/Engine/source/core/util/tVector.h +++ b/Engine/source/core/util/tVector.h @@ -160,6 +160,7 @@ class Vector void erase(U32 index, U32 count); void erase_fast(iterator); void clear(); + void resetAndTreatAsScratchBuffer(); void compact(); void sort(compare_func f); void fill( const T& value ); @@ -529,6 +530,15 @@ template inline void Vector::clear() mElementCount = 0; } +/// This method sets the vector as its 0 and will overwrite memory on subsequent usage. +/// Note that the current memory in use is never freed or deallocated, so only use this if the vector +/// is being used as a scratch buffer only. +template inline +void Vector::resetAndTreatAsScratchBuffer() +{ + mElementCount = 0; +} + template inline void Vector::compact() { resize(mElementCount);