Replacing SkTDArray with SkAutoSTArray to reduce memory allocation overhead in SkTileGrid::search

BUG=https://code.google.com/p/skia/issues/detail?id=1735
R=tomhudson@chromium.org

Author: junov@chromium.org

Review URL: https://codereview.chromium.org/35633002

git-svn-id: http://skia.googlecode.com/svn/trunk@11936 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
commit-bot@chromium.org 2013-10-24 11:24:38 +00:00
parent 381010e550
commit ac90d1d0b1
2 changed files with 12 additions and 9 deletions

View File

@ -91,13 +91,8 @@ void SkTileGrid::search(const SkIRect& query, SkTDArray<void*>* results) {
*results = this->tile(tileStartX, tileStartY);
} else {
results->reset();
SkTDArray<int> curPositions;
curPositions.setCount(queryTileCount);
// Note: Reserving space for 1024 tile pointers on the stack. If the
// malloc becomes a bottleneck, we may consider increasing that number.
// Typical large web page, say 2k x 16k, would require 512 tiles of
// size 256 x 256 pixels.
SkAutoSTArray<1024, SkTDArray<void *>*> storage(queryTileCount);
SkAutoSTArray<kStackAllocationTileCount, int> curPositions(queryTileCount);
SkAutoSTArray<kStackAllocationTileCount, SkTDArray<void *>*> storage(queryTileCount);
SkTDArray<void *>** tileRange = storage.get();
int tile = 0;
for (int x = tileStartX; x < tileEndX; ++x) {

View File

@ -25,7 +25,15 @@
*/
class SkTileGrid : public SkBBoxHierarchy {
public:
typedef void* (*SkTileGridNextDatumFunctionPtr)(SkTDArray<void*>** tileData, SkTDArray<int>& tileIndices);
enum {
// Number of tiles for which data is allocated on the stack in
// SkTileGrid::search. If malloc becomes a bottleneck, we may consider
// increasing this number. Typical large web page, say 2k x 16k, would
// require 512 tiles of size 256 x 256 pixels.
kStackAllocationTileCount = 1024
};
typedef void* (*SkTileGridNextDatumFunctionPtr)(SkTDArray<void*>** tileData, SkAutoSTArray<kStackAllocationTileCount, int>& tileIndices);
SkTileGrid(int xTileCount, int yTileCount, const SkTileGridPicture::TileGridInfo& info,
SkTileGridNextDatumFunctionPtr nextDatumFunction);
@ -91,7 +99,7 @@ private:
* such that 'a < b' is true if 'a' was inserted into the tile grid before 'b'.
*/
template <typename T>
void* SkTileGridNextDatum(SkTDArray<void*>** tileData, SkTDArray<int>& tileIndices) {
void* SkTileGridNextDatum(SkTDArray<void*>** tileData, SkAutoSTArray<SkTileGrid::kStackAllocationTileCount, int>& tileIndices) {
T* minVal = NULL;
int tileCount = tileIndices.count();
int minIndex = tileCount;