From 62f8d6a0f4b05ef95a5c79fbc6f50070f8de3556 Mon Sep 17 00:00:00 2001 From: Vavius Date: Tue, 2 Sep 2014 16:50:26 +0400 Subject: [PATCH] Attempt to fix MOAIImageTexture reallocated on each new glyph rendered --- .../arial-rounded.TTF | Bin 0 -> 45260 bytes .../textbox-dynamic-cache-allocs/main.lua | 38 ++++++++++++++++++ .../test/textbox-dynamic-cache-allocs/run.bat | 33 +++++++++++++++ .../test/textbox-dynamic-cache-allocs/run.sh | 28 +++++++++++++ src/moai-sim/MOAIGfxResource.cpp | 9 +++++ src/moai-sim/MOAIGfxResource.h | 1 + src/moai-sim/MOAIImageTexture.cpp | 4 +- 7 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 samples/test/textbox-dynamic-cache-allocs/arial-rounded.TTF create mode 100644 samples/test/textbox-dynamic-cache-allocs/main.lua create mode 100644 samples/test/textbox-dynamic-cache-allocs/run.bat create mode 100755 samples/test/textbox-dynamic-cache-allocs/run.sh diff --git a/samples/test/textbox-dynamic-cache-allocs/arial-rounded.TTF b/samples/test/textbox-dynamic-cache-allocs/arial-rounded.TTF new file mode 100644 index 0000000000000000000000000000000000000000..20b92a27d731cc52d0c7988b2611560653ca2c97 GIT binary patch literal 45260 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 xuejue7lg+zKs9d{{c^^0Ez$r literal 0 HcmV?d00001 diff --git a/samples/test/textbox-dynamic-cache-allocs/main.lua b/samples/test/textbox-dynamic-cache-allocs/main.lua new file mode 100644 index 0000000000..c43e26b778 --- /dev/null +++ b/samples/test/textbox-dynamic-cache-allocs/main.lua @@ -0,0 +1,38 @@ +---------------------------------------------------------------- +-- Copyright (c) 2010-2011 Zipline Games, Inc. +-- All Rights Reserved. +-- http://getmoai.com +---------------------------------------------------------------- + +MOAISim.openWindow ( "test", 320, 480 ) + +viewport = MOAIViewport.new () +viewport:setSize ( 320, 480 ) +viewport:setScale ( 320, 480 ) + +layer = MOAILayer2D.new () +layer:setViewport ( viewport ) +MOAISim.pushRenderPass ( layer ) + +font = MOAIFont.new () +font:load ( 'arial-rounded.TTF' ) + +function glyphAlloc () + text = "Hello 123456789 qwertyuiopasdfghjklzxcvbnm QWERTYUIOPASDFGHJKLZXCVBNM" + local textbox = MOAITextBox.new () + textbox:setFont ( font ) + textbox:setString ( "as" ) + textbox:setTextSize ( 64 ) + textbox:setWordBreak ( MOAITextBox.WORD_BREAK_CHAR ) + textbox:setRect ( -160, -240, 160, 240 ) + textbox:setYFlip ( true ) + layer:insertProp ( textbox ) + + for i = 1, #text do + textbox:setString ( text:sub ( 1, i )) + coroutine.yield () + end +end + +thread = MOAICoroutine.new () +thread:run ( glyphAlloc ) diff --git a/samples/test/textbox-dynamic-cache-allocs/run.bat b/samples/test/textbox-dynamic-cache-allocs/run.bat new file mode 100644 index 0000000000..457cd2a710 --- /dev/null +++ b/samples/test/textbox-dynamic-cache-allocs/run.bat @@ -0,0 +1,33 @@ +::----------------------------------------------------------------:: +:: Copyright (c) 2010-2011 Zipline Games, Inc. +:: All Rights Reserved. +:: http://getmoai.com +::----------------------------------------------------------------:: + +@echo off + +:: verify paths +if not exist "%MOAI_BIN%\moai.exe" ( + echo. + echo -------------------------------------------------------------------------------- + echo ERROR: The MOAI_BIN environment variable either doesn't exist or it's pointing + echo to an invalid path. Please point it at a folder containing moai.exe. + echo -------------------------------------------------------------------------------- + echo. + goto end +) + +if not exist "%MOAI_CONFIG%" ( + echo. + echo ------------------------------------------------------------------------------- + echo WARNING: The MOAI_CONFIG environment variable either doesn't exist or it's + echo pointing to an invalid path. Please point it at a folder containing config.lua. + echo ------------------------------------------------------------------------------- + echo. +) + +:: run moai +"%MOAI_BIN%\moai" "%MOAI_CONFIG%\config.lua" "main.lua" + +:end +pause \ No newline at end of file diff --git a/samples/test/textbox-dynamic-cache-allocs/run.sh b/samples/test/textbox-dynamic-cache-allocs/run.sh new file mode 100755 index 0000000000..cdcdaba6ea --- /dev/null +++ b/samples/test/textbox-dynamic-cache-allocs/run.sh @@ -0,0 +1,28 @@ +#!/bin/sh +#-------------------------------------------------------------------------------------- +# Copyright (c) 2010-2013 Zipline Games, Inc. +# All Rights Reserved. +# http://getmoai.com +#-------------------------------------------------------------------------------------- + +cd `dirname $0` + +# Verify paths +if [ ! -f "$MOAI_BIN/moai" ]; then + echo "---------------------------------------------------------------------------" + echo "Error: The MOAI_BIN environment variable doesn't exist or its pointing to an" + echo "invalid path. Please point it at a folder containing moai executable" + echo "---------------------------------------------------------------------------" + exit 1 +fi + +if [ ! -f "$MOAI_CONFIG/config.lua" ]; then + echo "---------------------------------------------------------------------------" + echo "WARNING: The MOAI_CONFIG environment variable either doesn't exist or it's" + echo "pointing to an invalid path. Please point it at a folder containing config.lua" + echo "---------------------------------------------------------------------------" + exit 1 +fi + +# Run moai +$MOAI_BIN/moai $MOAI_CONFIG/config.lua main.lua diff --git a/src/moai-sim/MOAIGfxResource.cpp b/src/moai-sim/MOAIGfxResource.cpp index c2d5bde18e..69b11571dd 100644 --- a/src/moai-sim/MOAIGfxResource.cpp +++ b/src/moai-sim/MOAIGfxResource.cpp @@ -144,6 +144,15 @@ void MOAIGfxResource::Invalidate () { } } +//----------------------------------------------------------------// +void MOAIGfxResource::InvalidateContents () { + + if ( this->mState != STATE_ERROR ) { + + this->mState = STATE_PRECREATE; + } +} + //----------------------------------------------------------------// void MOAIGfxResource::Load () { diff --git a/src/moai-sim/MOAIGfxResource.h b/src/moai-sim/MOAIGfxResource.h index 9515f39666..e9b503bd64 100644 --- a/src/moai-sim/MOAIGfxResource.h +++ b/src/moai-sim/MOAIGfxResource.h @@ -75,6 +75,7 @@ class MOAIGfxResource : void Clear (); void Destroy (); void Invalidate (); + void InvalidateContents (); virtual bool IsValid () = 0; // return 'true' if the handle to the GPU-side resource is valid (or initialized) - GRAPHICS THREAD void Load (); MOAIGfxResource (); diff --git a/src/moai-sim/MOAIImageTexture.cpp b/src/moai-sim/MOAIImageTexture.cpp index b34174b5d9..a15d775e65 100644 --- a/src/moai-sim/MOAIImageTexture.cpp +++ b/src/moai-sim/MOAIImageTexture.cpp @@ -44,7 +44,7 @@ int MOAIImageTexture::_invalidate ( lua_State* L ) { void MOAIImageTexture::InvalidateAll () { this->mStatus = INVALID; - this->MOAIGfxResource::Load (); + this->MOAIGfxResource::InvalidateContents (); } //----------------------------------------------------------------// @@ -63,7 +63,7 @@ void MOAIImageTexture::Invalidate ( ZLIntRect rect ) { } this->mStatus = INVALID_REGION; - this->MOAIGfxResource::Load (); + this->MOAIGfxResource::InvalidateContents (); } //----------------------------------------------------------------//