From 668b34db8e81b4fc829c800d4b6b573fdcb53a42 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Tue, 11 Jun 2013 06:44:26 +0000 Subject: [PATCH] more mad attempts to squeeze better performance --- source/glest_game/game/game_camera.cpp | 6 +- source/glest_game/graphics/renderer.cpp | 73 +++++++++++-------- source/glest_game/type_instances/object.cpp | 54 ++++++++------ source/glest_game/type_instances/object.h | 1 + source/glest_game/world/world.cpp | 54 +++++++++++++- source/glest_game/world/world.h | 3 + source/shared_lib/include/graphics/vec.h | 22 ++++-- .../graphics/gl/particle_renderer_gl.cpp | 11 +-- 8 files changed, 148 insertions(+), 76 deletions(-) diff --git a/source/glest_game/game/game_camera.cpp b/source/glest_game/game/game_camera.cpp index 4856c5103..13cb6efc4 100644 --- a/source/glest_game/game/game_camera.cpp +++ b/source/glest_game/game/game_camera.cpp @@ -236,9 +236,9 @@ Quad2i GameCamera::computeVisibleQuad() { Vec2f v2(sinf(degToRad(viewDegree - hAng + fov)), cosf(degToRad(viewDegree - hAng + fov))); #endif - v.normalize(); - v1.normalize(); - v2.normalize(); + v.normalize(false); + v1.normalize(false); + v2.normalize(false); Vec2f p = Vec2f(pos.x, pos.z) - v * dist; Vec2i p1(static_cast(p.x + v1.x * nearDist), static_cast(p.y + v1.y * nearDist)); diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index 316f642f0..43f95d649 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -1400,11 +1400,12 @@ bool Renderer::ExtractFrustum(VisibleQuadContainerCache &quadCacheItem) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\nCalc Frustum #%da: [%f][%f][%f][%f]\n",0,frustum[0][0],frustum[0][1],frustum[0][2],frustum[0][3]); /* Normalize the result */ - #ifdef USE_STREFLOP - t = streflop::sqrt( static_cast(frustum[0][0] * frustum[0][0] + frustum[0][1] * frustum[0][1] + frustum[0][2] * frustum[0][2]) ); - #else - t = sqrt( frustum[0][0] * frustum[0][0] + frustum[0][1] * frustum[0][1] + frustum[0][2] * frustum[0][2] ); - #endif +// #ifdef USE_STREFLOP +// t = streflop::sqrt( static_cast(frustum[0][0] * frustum[0][0] + frustum[0][1] * frustum[0][1] + frustum[0][2] * frustum[0][2]) ); +// #else +// t = sqrt( frustum[0][0] * frustum[0][0] + frustum[0][1] * frustum[0][1] + frustum[0][2] * frustum[0][2] ); +// #endif + t = std::sqrt( frustum[0][0] * frustum[0][0] + frustum[0][1] * frustum[0][1] + frustum[0][2] * frustum[0][2] ); if(t != 0.0) { frustum[0][0] /= t; frustum[0][1] /= t; @@ -1423,11 +1424,12 @@ bool Renderer::ExtractFrustum(VisibleQuadContainerCache &quadCacheItem) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\nCalc Frustum #%da: [%f][%f][%f][%f]\n",1,frustum[1][0],frustum[1][1],frustum[1][2],frustum[1][3]); /* Normalize the result */ - #ifdef USE_STREFLOP - t = streflop::sqrt( static_cast(frustum[1][0] * frustum[1][0] + frustum[1][1] * frustum[1][1] + frustum[1][2] * frustum[1][2]) ); - #else - t = sqrt( frustum[1][0] * frustum[1][0] + frustum[1][1] * frustum[1][1] + frustum[1][2] * frustum[1][2] ); - #endif +// #ifdef USE_STREFLOP +// t = streflop::sqrt( static_cast(frustum[1][0] * frustum[1][0] + frustum[1][1] * frustum[1][1] + frustum[1][2] * frustum[1][2]) ); +// #else +// t = sqrt( frustum[1][0] * frustum[1][0] + frustum[1][1] * frustum[1][1] + frustum[1][2] * frustum[1][2] ); +// #endif + t = std::sqrt( frustum[1][0] * frustum[1][0] + frustum[1][1] * frustum[1][1] + frustum[1][2] * frustum[1][2] ); if(t != 0.0) { frustum[1][0] /= t; frustum[1][1] /= t; @@ -1446,11 +1448,13 @@ bool Renderer::ExtractFrustum(VisibleQuadContainerCache &quadCacheItem) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\nCalc Frustum #%da: [%f][%f][%f][%f]\n",2,frustum[2][0],frustum[2][1],frustum[2][2],frustum[2][3]); /* Normalize the result */ - #ifdef USE_STREFLOP - t = streflop::sqrt( static_cast(frustum[2][0] * frustum[2][0] + frustum[2][1] * frustum[2][1] + frustum[2][2] * frustum[2][2]) ); - #else - t = sqrt( frustum[2][0] * frustum[2][0] + frustum[2][1] * frustum[2][1] + frustum[2][2] * frustum[2][2] ); - #endif +// #ifdef USE_STREFLOP +// t = streflop::sqrt( static_cast(frustum[2][0] * frustum[2][0] + frustum[2][1] * frustum[2][1] + frustum[2][2] * frustum[2][2]) ); +// #else +// t = sqrt( frustum[2][0] * frustum[2][0] + frustum[2][1] * frustum[2][1] + frustum[2][2] * frustum[2][2] ); +// #endif + + t = std::sqrt( frustum[2][0] * frustum[2][0] + frustum[2][1] * frustum[2][1] + frustum[2][2] * frustum[2][2] ); if(t != 0.0) { frustum[2][0] /= t; frustum[2][1] /= t; @@ -1469,12 +1473,13 @@ bool Renderer::ExtractFrustum(VisibleQuadContainerCache &quadCacheItem) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\nCalc Frustum #%da: [%f][%f][%f][%f]\n",3,frustum[3][0],frustum[3][1],frustum[3][2],frustum[3][3]); /* Normalize the result */ - #ifdef USE_STREFLOP - t = streflop::sqrt( static_cast(frustum[3][0] * frustum[3][0] + frustum[3][1] * frustum[3][1] + frustum[3][2] * frustum[3][2]) ); - #else - t = sqrt( frustum[3][0] * frustum[3][0] + frustum[3][1] * frustum[3][1] + frustum[3][2] * frustum[3][2] ); - #endif +// #ifdef USE_STREFLOP +// t = streflop::sqrt( static_cast(frustum[3][0] * frustum[3][0] + frustum[3][1] * frustum[3][1] + frustum[3][2] * frustum[3][2]) ); +// #else +// t = sqrt( frustum[3][0] * frustum[3][0] + frustum[3][1] * frustum[3][1] + frustum[3][2] * frustum[3][2] ); +// #endif + t = std::sqrt( frustum[3][0] * frustum[3][0] + frustum[3][1] * frustum[3][1] + frustum[3][2] * frustum[3][2] ); if(t != 0.0) { frustum[3][0] /= t; frustum[3][1] /= t; @@ -1493,11 +1498,13 @@ bool Renderer::ExtractFrustum(VisibleQuadContainerCache &quadCacheItem) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\nCalc Frustum #%da: [%f][%f][%f][%f]\n",4,frustum[4][0],frustum[4][1],frustum[4][2],frustum[4][3]); /* Normalize the result */ - #ifdef USE_STREFLOP - t = streflop::sqrt( static_cast(frustum[4][0] * frustum[4][0] + frustum[4][1] * frustum[4][1] + frustum[4][2] * frustum[4][2]) ); - #else - t = sqrt( frustum[4][0] * frustum[4][0] + frustum[4][1] * frustum[4][1] + frustum[4][2] * frustum[4][2] ); - #endif +// #ifdef USE_STREFLOP +// t = streflop::sqrt( static_cast(frustum[4][0] * frustum[4][0] + frustum[4][1] * frustum[4][1] + frustum[4][2] * frustum[4][2]) ); +// #else +// t = sqrt( frustum[4][0] * frustum[4][0] + frustum[4][1] * frustum[4][1] + frustum[4][2] * frustum[4][2] ); +// #endif + + t = std::sqrt( frustum[4][0] * frustum[4][0] + frustum[4][1] * frustum[4][1] + frustum[4][2] * frustum[4][2] ); if(t != 0.0) { frustum[4][0] /= t; @@ -1517,11 +1524,13 @@ bool Renderer::ExtractFrustum(VisibleQuadContainerCache &quadCacheItem) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("\nCalc Frustum #%da: [%f][%f][%f][%f]\n",5,frustum[5][0],frustum[5][1],frustum[5][2],frustum[5][3]); /* Normalize the result */ - #ifdef USE_STREFLOP - t = streflop::sqrt( static_cast(frustum[5][0] * frustum[5][0] + frustum[5][1] * frustum[5][1] + frustum[5][2] * frustum[5][2]) ); - #else - t = sqrt( frustum[5][0] * frustum[5][0] + frustum[5][1] * frustum[5][1] + frustum[5][2] * frustum[5][2] ); - #endif +// #ifdef USE_STREFLOP +// t = streflop::sqrt( static_cast(frustum[5][0] * frustum[5][0] + frustum[5][1] * frustum[5][1] + frustum[5][2] * frustum[5][2]) ); +// #else +// t = sqrt( frustum[5][0] * frustum[5][0] + frustum[5][1] * frustum[5][1] + frustum[5][2] * frustum[5][2] ); +// #endif + + t = std::sqrt( frustum[5][0] * frustum[5][0] + frustum[5][1] * frustum[5][1] + frustum[5][2] * frustum[5][2] ); if(t != 0.0) { frustum[5][0] /= t; @@ -8293,14 +8302,14 @@ void Renderer::renderArrow(const Vec3f &pos1, const Vec3f &pos2, const float blendDelay= 5.f; Vec3f dir= Vec3f(pos2-pos1); - float len= dir.length(); + float len= dir.length(false); if(len>maxlen) { return; } float alphaFactor= clamp((maxlen-len)/blendDelay, 0.f, 1.f); - dir.normalize(); + dir.normalize(false); Vec3f normal= dir.cross(Vec3f(0, 1, 0)); Vec3f pos2Left= pos2 + normal*(width-0.05f) - dir*arrowEndSize*width; diff --git a/source/glest_game/type_instances/object.cpp b/source/glest_game/type_instances/object.cpp index 8915efacd..6e16993a4 100644 --- a/source/glest_game/type_instances/object.cpp +++ b/source/glest_game/type_instances/object.cpp @@ -128,41 +128,47 @@ void Object::setHeight(float height) { } } -void Object::update() { +void Object::updateHighlight() { //highlight if(highlight > 0.f) { - const Game *game = Renderer::getInstance().getGame(); - highlight -= 1.f / (Game::highlightTime * game->getWorld()->getUpdateFps(-1)); + //const Game *game = Renderer::getInstance().getGame(); + //highlight -= 1.f / (Game::highlightTime * game->getWorld()->getUpdateFps(-1)); + highlight -= 1.f / (Game::highlightTime * GameConstants::updateFps); } +} - if(objectType != NULL && objectType->getTilesetModelType(variation) != NULL && - objectType->getTilesetModelType(variation)->getAnimSpeed() != 0.0) { +void Object::update() { + //if(objectType != NULL && objectType->getTilesetModelType(variation) != NULL && + // objectType->getTilesetModelType(variation)->getAnimSpeed() != 0.0) { + if(animated == true) { // printf("#1 Object updating [%s] Speed [%d] animProgress [%f]\n",this->objectType->getTilesetModelType(variation)->getModel()->getFileName().c_str(),objectType->getTilesetModelType(variation)->getAnimSpeed(),animProgress); - float heightFactor = 1.f; - const float speedDivider= 100.f; - float speedDenominator = (speedDivider * GameConstants::updateFps); + if(objectType != NULL && objectType->getTilesetModelType(variation) != NULL) { + float heightFactor = 1.f; + const float speedDivider= 100.f; + float speedDenominator = (speedDivider * GameConstants::updateFps); - // smooth TwoFrameanimations - float f=1.0f; - if(objectType->getTilesetModelType(variation)->getSmoothTwoFrameAnim()==true){ - f=abs(std::sin(animProgress*2*3.16))+0.4f; - } + // smooth TwoFrameanimations + float f=1.0f; + if(objectType->getTilesetModelType(variation)->getSmoothTwoFrameAnim()==true){ + f=abs(std::sin(animProgress*2*3.16))+0.4f; + } - float newAnimProgress = animProgress + f*(((float)objectType->getTilesetModelType(variation)->getAnimSpeed() * heightFactor) / speedDenominator); + float newAnimProgress = animProgress + f*(((float)objectType->getTilesetModelType(variation)->getAnimSpeed() * heightFactor) / speedDenominator); -// printf("A [%f] B [%f] C [%f] D [%f] E [%f] F [%f]\n", -// ((float)objectType->getTilesetModelType(variation)->getAnimSpeed() * heightFactor), -// speedDenominator, -// ((objectType->getTilesetModelType(variation)->getAnimSpeed() * heightFactor) / speedDenominator), -// (animProgress + ((objectType->getTilesetModelType(variation)->getAnimSpeed() * heightFactor) / speedDenominator)), -// animProgress,newAnimProgress); + // printf("A [%f] B [%f] C [%f] D [%f] E [%f] F [%f]\n", + // ((float)objectType->getTilesetModelType(variation)->getAnimSpeed() * heightFactor), + // speedDenominator, + // ((objectType->getTilesetModelType(variation)->getAnimSpeed() * heightFactor) / speedDenominator), + // (animProgress + ((objectType->getTilesetModelType(variation)->getAnimSpeed() * heightFactor) / speedDenominator)), + // animProgress,newAnimProgress); - animProgress = newAnimProgress; -// printf("#2 new animProgress [%f]\n",animProgress); + animProgress = newAnimProgress; + // printf("#2 new animProgress [%f]\n",animProgress); - if(animProgress > 1.f) { - animProgress = 0.f; + if(animProgress > 1.f) { + animProgress = 0.f; + } } } } diff --git a/source/glest_game/type_instances/object.h b/source/glest_game/type_instances/object.h index 81d208f34..cca31c831 100644 --- a/source/glest_game/type_instances/object.h +++ b/source/glest_game/type_instances/object.h @@ -102,6 +102,7 @@ public: const Vec2i & getMapPos() const { return mapPos; } + void updateHighlight(); void update(); float getAnimProgress() const { return animProgress;} diff --git a/source/glest_game/world/world.cpp b/source/glest_game/world/world.cpp index e5d126db7..a9bd85e83 100644 --- a/source/glest_game/world/world.cpp +++ b/source/glest_game/world/world.cpp @@ -52,6 +52,8 @@ World::World() { staggeredFactionUpdates = false; unitParticlesEnabled=config.getBool("UnitParticles","true"); + animatedTilesetObjectPosListLoaded = false; + ExploredCellsLookupItemCache.clear(); ExploredCellsLookupItemCacheTimer.clear(); ExploredCellsLookupItemCacheTimerCount = 0; @@ -92,6 +94,8 @@ World::World() { void World::cleanup() { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + animatedTilesetObjectPosListLoaded = false; + ExploredCellsLookupItemCache.clear(); ExploredCellsLookupItemCacheTimer.clear(); //FowAlphaCellsLookupItemCache.clear(); @@ -151,6 +155,8 @@ void World::endScenario() { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); Logger::getInstance().add(Lang::getInstance().get("LogScreenGameUnLoadingWorld","",true), true); + animatedTilesetObjectPosListLoaded = false; + ExploredCellsLookupItemCache.clear(); ExploredCellsLookupItemCacheTimer.clear(); @@ -168,6 +174,8 @@ void World::end(){ if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); Logger::getInstance().add(Lang::getInstance().get("LogScreenGameUnLoadingWorld","",true), true); + animatedTilesetObjectPosListLoaded = false; + ExploredCellsLookupItemCache.clear(); ExploredCellsLookupItemCacheTimer.clear(); @@ -505,17 +513,55 @@ void World::setQueuedScenario(string scenarioName,bool keepFactions) { } void World::updateAllTilesetObjects() { - for(int x = 0; x < map.getSurfaceW(); ++x) { - for(int y = 0; y < map.getSurfaceH(); ++y) { - SurfaceCell *sc = map.getSurfaceCell(x,y); + Gui *gui = this->game->getGuiPtr(); + if(gui != NULL) { + Object *selObj = gui->getHighlightedResourceObject(); + if(selObj != NULL) { + selObj->updateHighlight(); + } + } + + if(animatedTilesetObjectPosListLoaded == false) { + animatedTilesetObjectPosListLoaded = true; + animatedTilesetObjectPosList.clear(); + + for(int x = 0; x < map.getSurfaceW(); ++x) { + for(int y = 0; y < map.getSurfaceH(); ++y) { + SurfaceCell *sc = map.getSurfaceCell(x,y); + if(sc != NULL) { + Object *obj = sc->getObject(); + if(obj != NULL && obj->isAnimated() == true) { + //obj->update(); + animatedTilesetObjectPosList.push_back(Vec2i(x,y)); + } + } + } + } + } + if(animatedTilesetObjectPosList.empty() == false) { + for(unsigned int i = 0; i < animatedTilesetObjectPosList.size(); ++i) { + const Vec2i &pos = animatedTilesetObjectPosList[i]; + SurfaceCell *sc = map.getSurfaceCell(pos); if(sc != NULL) { Object *obj = sc->getObject(); - if(obj != NULL) { + if(obj != NULL && obj->isAnimated() == true) { obj->update(); } } } } + +// for(int x = 0; x < map.getSurfaceW(); ++x) { +// for(int y = 0; y < map.getSurfaceH(); ++y) { +// SurfaceCell *sc = map.getSurfaceCell(x,y); +// if(sc != NULL) { +// Object *obj = sc->getObject(); +// if(obj != NULL) { +// obj->update(); +// } +// } +// } +// } } void World::updateAllFactionUnits() { diff --git a/source/glest_game/world/world.h b/source/glest_game/world/world.h index d0357e334..bd121dcbe 100644 --- a/source/glest_game/world/world.h +++ b/source/glest_game/world/world.h @@ -150,6 +150,9 @@ private: bool originalGameFogOfWar; std::map > mapFogOfWarUnitList; + bool animatedTilesetObjectPosListLoaded; + std::vector animatedTilesetObjectPosList; + public: World(); ~World(); diff --git a/source/shared_lib/include/graphics/vec.h b/source/shared_lib/include/graphics/vec.h index 5623e9c97..861754f87 100644 --- a/source/shared_lib/include/graphics/vec.h +++ b/source/shared_lib/include/graphics/vec.h @@ -213,16 +213,19 @@ public: return x < v.x || (x == v.x && y < v.y); } - inline float length() const{ + inline float length(bool requireAccuracy=true) const { #ifdef USE_STREFLOP - return static_cast(streflop::sqrt(static_cast(x*x + y*y))); + if(requireAccuracy == true) { + return static_cast(streflop::sqrt(static_cast(x*x + y*y))); + } + return static_cast(std::sqrt(static_cast(x*x + y*y))); #else return static_cast(sqrt(static_cast(x*x + y*y))); #endif } - inline void normalize(){ - T m= length(); + inline void normalize(bool requireAccuracy=true){ + T m= length(requireAccuracy); x/= m; y/= m; } @@ -444,16 +447,19 @@ public: return Vec3(v-*this).length(); } - inline float length() const{ + inline float length(bool requireAccuracy=true) const { #ifdef USE_STREFLOP - return static_cast(streflop::sqrt(static_cast(x*x + y*y + z*z))); + if(requireAccuracy == true) { + return static_cast(streflop::sqrt(static_cast(x*x + y*y + z*z))); + } + return static_cast(std::sqrt(x*x + y*y + z*z)); #else return static_cast(sqrt(x*x + y*y + z*z)); #endif } - inline void normalize(){ - T m= length(); + inline void normalize(bool requireAccuracy=true){ + T m= length(requireAccuracy); x/= m; y/= m; z/= m; diff --git a/source/shared_lib/sources/graphics/gl/particle_renderer_gl.cpp b/source/shared_lib/sources/graphics/gl/particle_renderer_gl.cpp index 26a56dd88..179199295 100644 --- a/source/shared_lib/sources/graphics/gl/particle_renderer_gl.cpp +++ b/source/shared_lib/sources/graphics/gl/particle_renderer_gl.cpp @@ -244,12 +244,13 @@ void ParticleRendererGl::renderModel(GameParticleSystem *ps, ModelRenderer *mr){ Vec3f flatDirection= Vec3f(direction.x, 0.f, direction.z); Vec3f rotVector= Vec3f(0.f, 1.f, 0.f).cross(flatDirection); -#ifdef USE_STREFLOP - float angleV= radToDeg(streflop::atan2(static_cast(flatDirection.length()), static_cast(direction.y))) - 90.f; -#else - float angleV= radToDeg(atan2(flatDirection.length(), direction.y)) - 90.f; -#endif +//#ifdef USE_STREFLOP +// float angleV= radToDeg(streflop::atan2(static_cast(flatDirection.length()), static_cast(direction.y))) - 90.f; +//#else +// float angleV= radToDeg(atan2(flatDirection.length(), direction.y)) - 90.f; +//#endif + float angleV= radToDeg(std::atan2(flatDirection.length(false), direction.y)) - 90.f; glRotatef(angleV, rotVector.x, rotVector.y, rotVector.z); #ifdef USE_STREFLOP