From eec6114b2d4716a30418e959bea34a1a73d3b9dc Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Sun, 24 Jun 2012 08:20:17 -0300 Subject: [PATCH] Optimize lua object push * Optimize position hash * Fix minimap reload --- modules/game_minimap/minimap.lua | 1 + src/framework/luascript/luainterface.cpp | 3 +-- src/framework/luascript/luaobject.cpp | 19 ++++++++++++++++++- src/framework/luascript/luaobject.h | 4 ++++ src/otclient/util/position.h | 2 +- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/modules/game_minimap/minimap.lua b/modules/game_minimap/minimap.lua index 334abd39..0b6d6dd3 100644 --- a/modules/game_minimap/minimap.lua +++ b/modules/game_minimap/minimap.lua @@ -74,6 +74,7 @@ function Minimap.terminate() disconnect(g_game, { onGameStart = Minimap.reset }) Keyboard.unbindKeyDown('Ctrl+M') + minimapButton:destroy() minimapWindow:destroy() minimapWindow = nil minimapWidget = nil diff --git a/src/framework/luascript/luainterface.cpp b/src/framework/luascript/luainterface.cpp index 65c1e416..b1c4014c 100644 --- a/src/framework/luascript/luainterface.cpp +++ b/src/framework/luascript/luainterface.cpp @@ -1052,8 +1052,7 @@ void LuaInterface::pushObject(const LuaObjectPtr& obj) new(newUserdata(sizeof(LuaObjectPtr))) LuaObjectPtr(obj); m_totalObjRefs++; - // set the userdata metatable - getGlobal(stdext::format("%s_mt", obj->getClassName())); + obj->luaGetMetatable(); assert(!isNil()); setMetatable(); } diff --git a/src/framework/luascript/luaobject.cpp b/src/framework/luascript/luaobject.cpp index f1c08354..0ea34fe4 100644 --- a/src/framework/luascript/luaobject.cpp +++ b/src/framework/luascript/luaobject.cpp @@ -26,7 +26,8 @@ #include LuaObject::LuaObject() : - m_fieldsTableRef(-1) + m_fieldsTableRef(-1), + m_metatableRef(-1) { } @@ -34,6 +35,11 @@ LuaObject::~LuaObject() { assert(!g_app.isTermianted()); releaseLuaFieldsTable(); + + if(m_metatableRef != -1) { + g_lua.unref(m_metatableRef); + m_metatableRef = -1; + } } bool LuaObject::hasLuaField(const std::string& field) @@ -81,6 +87,17 @@ void LuaObject::luaGetField(const std::string& key) } } +void LuaObject::luaGetMetatable() +{ + if(m_metatableRef == -1) { + // set the userdata metatable + g_lua.getGlobal(stdext::format("%s_mt", getClassName())); + m_metatableRef = g_lua.ref(); + } + + g_lua.getRef(m_metatableRef); +} + void LuaObject::luaGetFieldsTable() { if(m_fieldsTableRef != -1) diff --git a/src/framework/luascript/luaobject.h b/src/framework/luascript/luaobject.h index 5ae02054..825e64bc 100644 --- a/src/framework/luascript/luaobject.h +++ b/src/framework/luascript/luaobject.h @@ -61,6 +61,9 @@ public: /// Gets a field from this lua object, the result is pushed onto the stack void luaGetField(const std::string& key); + /// Get object's metatable + void luaGetMetatable(); + /// Gets the table containing all stored fields of this lua object, the result is pushed onto the stack void luaGetFieldsTable(); @@ -78,6 +81,7 @@ public: private: int m_fieldsTableRef; + int m_metatableRef; }; #include "luainterface.h" diff --git a/src/otclient/util/position.h b/src/otclient/util/position.h index bdfe46cc..4a82bac1 100644 --- a/src/otclient/util/position.h +++ b/src/otclient/util/position.h @@ -214,7 +214,7 @@ public: struct PositionHasher : std::unary_function { std::size_t operator()(const Position& pos) const { - return ((((pos.x * 32768) + pos.y) * 16) + pos.z) % 1000000; + return ((((pos.x * 2048) + pos.y) * 16) + pos.z) % (2048*2048); } };