Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index b2e536fa8aaf87b9560e326a012890a7b2289004..61245c71ca5306e84fc61708955f4f24dc376923 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -154,6 +154,7 @@ inline ManagedTileBin BinFromTilePriority(const TilePriority& prio) { |
// gives us an insurance that we're not spending a huge amount |
// of time scheduling one enormous set of tasks. |
const size_t kMaxRasterTasks = 256u; |
+const size_t kTilePoolSize = 256u; |
} // namespace |
@@ -213,6 +214,7 @@ TileManager::TileManager( |
did_initialize_visible_tile_(false), |
did_check_for_completed_tasks_since_last_schedule_tasks_(true) { |
raster_worker_pool_->SetClient(this); |
+ tile_pool_.reserve(kTilePoolSize); |
} |
TileManager::~TileManager() { |
@@ -223,6 +225,10 @@ TileManager::~TileManager() { |
CleanUpReleasedTiles(); |
DCHECK_EQ(0u, tiles_.size()); |
+ for (size_t i = 0; i < tile_pool_.size(); ++i) |
+ delete tile_pool_[i]; |
+ tile_pool_.clear(); |
+ |
RasterWorkerPool::RasterTask::Queue empty; |
raster_worker_pool_->ScheduleTasks(&empty); |
@@ -253,8 +259,14 @@ void TileManager::CleanUpReleasedTiles() { |
it != released_tiles_.end(); |
++it) { |
Tile* tile = *it; |
+ ManagedTileState& mts = tile->managed_state(); |
- FreeResourcesForTile(tile); |
+ for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
+ FreeResourceForTile(tile, static_cast<RasterMode>(mode)); |
+ mts.tile_versions[mode].set_use_resource(); |
+ mts.tile_versions[mode].raster_task_.Reset(); |
+ } |
+ tile->reset_picture_pile(); |
DCHECK(tiles_.find(tile->id()) != tiles_.end()); |
tiles_.erase(tile->id()); |
@@ -267,7 +279,10 @@ void TileManager::CleanUpReleasedTiles() { |
image_decode_tasks_.erase(tile->layer_id()); |
} |
- delete tile; |
+ if (tile_pool_.size() < kTilePoolSize) |
+ tile_pool_.push_back(tile); |
+ else |
+ delete tile; |
} |
released_tiles_.clear(); |
@@ -816,7 +831,7 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { |
scoped_ptr<ResourcePool::Resource> resource = |
resource_pool_->AcquireResource( |
- tile->tile_size_.size(), |
+ tile->tile_size_, |
raster_worker_pool_->GetResourceFormat()); |
const Resource* const_resource = resource.get(); |
@@ -939,15 +954,23 @@ scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, |
int layer_id, |
int source_frame_number, |
bool can_use_lcd_text) { |
- scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, |
- picture_pile, |
- tile_size, |
- content_rect, |
- opaque_rect, |
- contents_scale, |
- layer_id, |
- source_frame_number, |
- can_use_lcd_text)); |
+ scoped_refptr<Tile> tile; |
+ if (!tile_pool_.empty()) { |
+ tile = make_scoped_refptr(tile_pool_.back()); |
+ tile_pool_.pop_back(); |
+ } else { |
+ tile = make_scoped_refptr(new Tile(this)); |
+ } |
+ |
+ tile->Reset(picture_pile, |
+ tile_size, |
+ content_rect, |
+ opaque_rect, |
+ contents_scale, |
+ layer_id, |
+ source_frame_number, |
+ can_use_lcd_text); |
+ |
DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
tiles_[tile->id()] = tile; |