more mad attempts to squeeze better performance

This commit is contained in:
Mark Vejvoda 2013-06-11 06:44:26 +00:00
parent 267dc7534f
commit 668b34db8e
8 changed files with 148 additions and 76 deletions

View File

@ -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<int>(p.x + v1.x * nearDist), static_cast<int>(p.y + v1.y * nearDist));

View File

@ -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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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<streflop::Simple>(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;

View File

@ -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;
}
}
}
}

View File

@ -102,6 +102,7 @@ public:
const Vec2i & getMapPos() const { return mapPos; }
void updateHighlight();
void update();
float getAnimProgress() const { return animProgress;}

View File

@ -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() {

View File

@ -150,6 +150,9 @@ private:
bool originalGameFogOfWar;
std::map<int,std::pair<const Unit *,const FogOfWarSkillType *> > mapFogOfWarUnitList;
bool animatedTilesetObjectPosListLoaded;
std::vector<Vec2i> animatedTilesetObjectPosList;
public:
World();
~World();

View File

@ -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<float>(streflop::sqrt(static_cast<streflop::Simple>(x*x + y*y)));
if(requireAccuracy == true) {
return static_cast<float>(streflop::sqrt(static_cast<streflop::Simple>(x*x + y*y)));
}
return static_cast<float>(std::sqrt(static_cast<float>(x*x + y*y)));
#else
return static_cast<float>(sqrt(static_cast<float>(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<T>(v-*this).length();
}
inline float length() const{
inline float length(bool requireAccuracy=true) const {
#ifdef USE_STREFLOP
return static_cast<float>(streflop::sqrt(static_cast<streflop::Simple>(x*x + y*y + z*z)));
if(requireAccuracy == true) {
return static_cast<float>(streflop::sqrt(static_cast<streflop::Simple>(x*x + y*y + z*z)));
}
return static_cast<float>(std::sqrt(x*x + y*y + z*z));
#else
return static_cast<float>(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;

View File

@ -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<streflop::Simple>(flatDirection.length()), static_cast<streflop::Simple>(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<streflop::Simple>(flatDirection.length()), static_cast<streflop::Simple>(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