Browse Source

Reduce MicroTiles memory usage

surface-to-cel
Gleb Mazovetskiy 4 years ago
parent
commit
018bccbafc
  1. 5
      Source/engine/cel_sprite.hpp
  2. 10
      Source/gendung.cpp
  3. 2
      Source/gendung.h
  4. 4
      Source/scrollrt.cpp
  5. 13
      Source/utils/static_vector.hpp

5
Source/engine/cel_sprite.hpp

@ -85,6 +85,11 @@ public:
return data_.get();
}
[[nodiscard]] std::unique_ptr<byte[]> release() &&
{
return std::move(data_);
}
private:
std::unique_ptr<byte[]> data_;
};

10
Source/gendung.cpp

@ -33,7 +33,7 @@ std::optional<OwnedCelSprite> pSpecialCels;
std::unique_ptr<MegaTile[]> pMegaTiles;
std::unique_ptr<byte[]> pDungeonCels;
std::array<TileProperties, MAXTILES> SOLData;
std::vector<OwnedCelSpriteWithFrameHeight> MicroTiles;
StaticVector<std::unique_ptr<byte[]>, MAXTILES> MicroTiles;
Point dminPosition;
Point dmaxPosition;
dungeon_type leveltype;
@ -520,9 +520,11 @@ void SetDungeonMicros()
}
targetBufferPosition.y += TILE_HEIGHT;
}
Surface next { microTile.get() };
MicroTiles.emplace_back(SurfaceToCel(next.subregion(0, frameStartY, TILE_WIDTH, TILE_HEIGHT * blocks / 2 - frameStartY), 1, true, 225));
MicroTiles.emplace_back(
SurfaceToCel(
Surface { microTile.get() }.subregion(0, frameStartY, TILE_WIDTH, TILE_HEIGHT * blocks / 2 - frameStartY),
/*numFrames=*/1, /*generateFrameHeaders=*/false, /*transparentColor=*/225)
.sprite.release());
}
pDungeonCels = nullptr;
}

2
Source/gendung.h

@ -157,7 +157,7 @@ extern std::unique_ptr<byte[]> pDungeonCels;
* List tile properties
*/
extern DVL_API_FOR_TEST std::array<TileProperties, MAXTILES> SOLData;
extern std::vector<OwnedCelSpriteWithFrameHeight> MicroTiles;
extern StaticVector<std::unique_ptr<byte[]>, MAXTILES> MicroTiles;
/** Specifies the minimum X,Y-coordinates of the map. */
extern Point dminPosition;
/** Specifies the maximum X,Y-coordinates of the map. */

4
Source/scrollrt.cpp

@ -658,7 +658,7 @@ void DrawCell(const Surface &out, Point tilePosition, Point targetBufferPosition
cel_transparency_active = TileHasAny(tileId, TileProperties::Transparent) && TransList[dTransVal[tilePosition.x][tilePosition.y]];
bool foliage = !TileHasAny(tileId, TileProperties::Solid);
// TODO apply foliage and transparancy masks
CelClippedBlitLightTransTo(out, targetBufferPosition, MicroTiles[tileId].sprite, 0);
CelDrawLightTo(out, targetBufferPosition, CelSprite { MicroTiles[tileId].get(), TILE_WIDTH }, 0, nullptr);
}
/**
@ -672,7 +672,7 @@ void DrawFloor(const Surface &out, Point tilePosition, Point targetBufferPositio
LightTableIndex = dLight[tilePosition.x][tilePosition.y];
int pn = dPiece[tilePosition.x][tilePosition.y];
// TODO Clip/mask to floor tile
CelClippedDrawLightTo(out, targetBufferPosition, MicroTiles[pn].sprite, 0);
CelDrawLightTo(out, targetBufferPosition, CelSprite { MicroTiles[pn].get(), TILE_WIDTH }, 0, nullptr);
}
/**

13
Source/utils/static_vector.hpp

@ -42,6 +42,18 @@ public:
}
~StaticVector()
{
destroyAll();
}
void clear()
{
destroyAll();
size_ = 0;
}
private:
void destroyAll()
{
for (std::size_t pos = 0; pos < size_; ++pos) {
#if __cplusplus >= 201703L
@ -52,7 +64,6 @@ public:
}
}
private:
std::aligned_storage_t<sizeof(T), alignof(T)> data_[N];
std::size_t size_ = 0;
};

Loading…
Cancel
Save