summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2016-03-31 21:25:05 +0300
committerAndrei Karas <akaras@inbox.ru>2016-03-31 21:51:44 +0300
commit1dfc22f53967ad7e39d42ba8aabe0afa7445476e (patch)
treed6a2bda66d2e50646162a15220063a360730ff5b
parentd6f42c15612b9d40d0a496b2b34efe66df0b74f9 (diff)
downloadmv-1dfc22f53967ad7e39d42ba8aabe0afa7445476e.tar.gz
mv-1dfc22f53967ad7e39d42ba8aabe0afa7445476e.tar.bz2
mv-1dfc22f53967ad7e39d42ba8aabe0afa7445476e.tar.xz
mv-1dfc22f53967ad7e39d42ba8aabe0afa7445476e.zip
Improve drawing player sprites performance.
-rw-r--r--src/being/being.cpp42
-rw-r--r--src/being/being.h3
-rw-r--r--src/being/compoundsprite.cpp4
-rw-r--r--src/being/compoundsprite.h3
4 files changed, 39 insertions, 13 deletions
diff --git a/src/being/being.cpp b/src/being/being.cpp
index 57529b734..c20bb4ce1 100644
--- a/src/being/being.cpp
+++ b/src/being/being.cpp
@@ -202,6 +202,7 @@ Being::Being(const BeingId id,
mPets(),
mOwner(nullptr),
mSpecialParticle(nullptr),
+ mDrawSprites(),
#ifdef EATHENA_SUPPORT
mChat(nullptr),
mHorseInfo(nullptr),
@@ -349,6 +350,7 @@ Being::~Being()
}
}
mPets.clear();
+ mDrawSprites.clear();
removeAllItemsParticles();
#ifdef EATHENA_SUPPORT
@@ -2579,6 +2581,7 @@ void Being::setSprite(const unsigned int slot,
if (beingEquipmentWindow)
beingEquipmentWindow->updateBeing(this);
}
+ updateDrawSprites();
}
void Being::setSpriteID(const unsigned int slot,
@@ -2984,14 +2987,10 @@ void Being::drawPlayerSprites(Graphics *restrict const graphics,
const int posX,
const int posY) const restrict2
{
- const int sz = CompoundSprite::getNumberOfLayers();
- for (int f = 0; f < sz; f ++)
+ const size_t sz = mDrawSprites.size();
+ for (size_t f = 0; f < sz; f ++)
{
- const int rSprite = mSpriteHide[mSpriteRemap[f]];
- if (rSprite == 1)
- continue;
-
- Sprite *restrict const sprite = mSprites[mSpriteRemap[f]];
+ Sprite *restrict const sprite = mDrawSprites[f];
if (sprite)
{
sprite->setAlpha(mAlpha);
@@ -3004,14 +3003,10 @@ void Being::drawSpritesSDL(Graphics *restrict const graphics,
const int posX,
const int posY) const restrict2
{
- const size_t sz = mSprites.size();
+ const size_t sz = mDrawSprites.size();
for (size_t f = 0; f < sz; f ++)
{
- const int rSprite = mSpriteHide[mSpriteRemap[f]];
- if (rSprite == 1)
- continue;
-
- const Sprite *restrict const sprite = mSprites[mSpriteRemap[f]];
+ const Sprite *restrict const sprite = mDrawSprites[f];
if (sprite)
sprite->draw(graphics, posX, posY);
}
@@ -3570,6 +3565,7 @@ void Being::recalcSpritesOrder() restrict2
}
}
}
+ updateDrawSprites();
}
int Being::searchSlotValue(const std::vector<int> &restrict slotRemap,
@@ -4407,6 +4403,26 @@ void Being::serverRemove() restrict2 noexcept
mTrickDead = false;
}
+void Being::updateDrawSprites()
+{
+ if (mType != ActorType::Player)
+ return;
+ mDrawSprites.clear();
+ const size_t sz = CompoundSprite::getNumberOfLayers();
+ for (size_t f = 0; f < sz; f ++)
+ {
+ const int rSprite = mSpriteHide[mSpriteRemap[f]];
+ if (rSprite == 1)
+ continue;
+
+ Sprite *const sprite = mSprites[mSpriteRemap[f]];
+ if (sprite)
+ {
+ mDrawSprites.push_back(sprite);
+ }
+ }
+}
+
#ifdef EATHENA_SUPPORT
void Being::removeHorse() restrict2
{
diff --git a/src/being/being.h b/src/being/being.h
index 606db0a35..f4c03af37 100644
--- a/src/being/being.h
+++ b/src/being/being.h
@@ -1136,6 +1136,8 @@ class Being notfinal : public ActorSprite,
const int offsetX,
const int offsetY) const A_NONNULL(2);
+ void updateDrawSprites() override final;
+
const ActorTypeT mType;
/** Speech Bubble components */
@@ -1160,6 +1162,7 @@ class Being notfinal : public ActorSprite,
std::vector<Being*> mPets;
Being *restrict mOwner;
Particle *restrict mSpecialParticle;
+ std::vector<Sprite*> mDrawSprites;
#ifdef EATHENA_SUPPORT
ChatObject *restrict mChat;
HorseInfo *restrict mHorseInfo;
diff --git a/src/being/compoundsprite.cpp b/src/being/compoundsprite.cpp
index af2e60d55..184823011 100644
--- a/src/being/compoundsprite.cpp
+++ b/src/being/compoundsprite.cpp
@@ -263,6 +263,7 @@ void CompoundSprite::addSprite(Sprite *const sprite)
{
mSprites.push_back(sprite);
mNeedsRedraw = true;
+ updateDrawSprites();
}
void CompoundSprite::setSprite(const size_t layer, Sprite *const sprite)
@@ -274,6 +275,7 @@ void CompoundSprite::setSprite(const size_t layer, Sprite *const sprite)
delete mSprites[layer];
mSprites[layer] = sprite;
mNeedsRedraw = true;
+ updateDrawSprites();
}
void CompoundSprite::removeSprite(const int layer)
@@ -284,6 +286,7 @@ void CompoundSprite::removeSprite(const int layer)
delete2(mSprites[layer]);
mNeedsRedraw = true;
+ updateDrawSprites();
}
void CompoundSprite::clear()
@@ -299,6 +302,7 @@ void CompoundSprite::clear()
imagesCache.clear();
delete2(mCacheItem);
mLastTime = 0;
+ updateDrawSprites();
}
void CompoundSprite::ensureSize(const size_t layerCount)
diff --git a/src/being/compoundsprite.h b/src/being/compoundsprite.h
index 71a77e87e..96b14d653 100644
--- a/src/being/compoundsprite.h
+++ b/src/being/compoundsprite.h
@@ -117,6 +117,9 @@ class CompoundSprite notfinal : public Sprite
void initCurrentCacheItem() const;
+ virtual void updateDrawSprites()
+ { }
+
typedef std::list<CompoundItem*> ImagesCache;
mutable ImagesCache imagesCache;
mutable CompoundItem *mCacheItem;