chromium client pattern 回调
chromium client pattern
一个类,携带一个client接口类。当这个类需要外部的功能时,就从client类中获取。
比如TileManager类。它有个接口类是TileManagerClient. 当TileManager自己干不了,需要外部类提供实现时,就会调用client_->.
具体实现是通过外部类如LayerTreeHostImpl,这个类实现接口TileManagerClient。而且在TileManager初始化是将自己传进去,作为TileManager的一个成员保存起来 TileManagerClient client_。
1. 接口TileManagerClient
class CC_EXPORT TileManagerClient {
public:
// Called when all tiles marked as required for activation are ready to draw.
virtual void NotifyReadyToActivate() = 0;
... ...
// Given an empty raster tile priority queue, this will build a priority queue
// that will return tiles in the order in which they should be rasterized.
// Note if the queue was previously built, Reset must be called on it.
virtual std::unique_ptr<RasterTilePriorityQueue> BuildRasterQueue(
TreePriority tree_priority,
RasterTilePriorityQueue::Type type) = 0;
2. LayerTreeHostImpl.h 实现申明
class CC_EXPORT LayerTreeHostImpl : public TileManagerClient,
... {
public:
std::unique_ptr<RasterTilePriorityQueue> BuildRasterQueue(
TreePriority tree_priority,
RasterTilePriorityQueue::Type type) override;
3. LayerTreeHostImpl.cc 实现
std::unique_ptr<RasterTilePriorityQueue> LayerTreeHostImpl::BuildRasterQueue(
TreePriority tree_priority,
RasterTilePriorityQueue::Type type) {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
"LayerTreeHostImpl::BuildRasterQueue");
return RasterTilePriorityQueue::Create(
active_tree_->picture_layers(),
pending_tree_ && pending_tree_fully_painted_
? pending_tree_->picture_layers()
: std::vector<PictureLayerImpl*>(),
tree_priority, type);
}
4. TileManager.h 初始化时关联
class CC_EXPORT TileManager : CheckerImageTrackerClient {
public:
TileManager(TileManagerClient* client,
...);
TileManagerClient* client_;
5. TileManager.cc 初始化时关联实现
TileManager::TileManager(
TileManagerClient* client,
... ...)
: client_(client),
6. LayerTreeHostImpl构造函数中实现的关联
tile_manager_(this,关联了TileManagerClient。而且在自己的类中,也存储了对TileManager的引用tile_manager_。
LayerTreeHostImpl::LayerTreeHostImpl(
const LayerTreeSettings& settings,
LayerTreeHostImplClient* client,
TaskRunnerProvider* task_runner_provider,
RenderingStatsInstrumentation* rendering_stats_instrumentation,
TaskGraphRunner* task_graph_runner,
std::unique_ptr<MutatorHost> mutator_host,
RasterDarkModeFilter* dark_mode_filter,
int id,
scoped_refptr<base::SequencedTaskRunner> image_worker_task_runner,
LayerTreeHostSchedulingClient* scheduling_client)
: client_(client),
scheduling_client_(scheduling_client),
task_runner_provider_(task_runner_provider),
current_begin_frame_tracker_(FROM_HERE),
compositor_frame_reporting_controller_(
std::make_unique<CompositorFrameReportingController>(
/*should_report_metrics=*/!settings.single_thread_proxy_scheduler,
id)),
settings_(settings),
is_synchronous_single_threaded_(!task_runner_provider->HasImplThread() &&
!settings_.single_thread_proxy_scheduler),
cached_managed_memory_policy_(settings.memory_policy),
// Must be initialized after is_synchronous_single_threaded_ and
// task_runner_provider_.
tile_manager_(this,
GetTaskRunner(),
std::move(image_worker_task_runner),
is_synchronous_single_threaded_
? std::numeric_limits<size_t>::max()
: settings.scheduled_raster_task_limit,
settings.ToTileManagerSettings()),
memory_history_(MemoryHistory::Create()),
debug_rect_history_(DebugRectHistory::Create()),
mutator_host_(std::move(mutator_host)),
dark_mode_filter_(dark_mode_filter),
rendering_stats_instrumentation_(rendering_stats_instrumentation),
micro_benchmark_controller_(this),
task_graph_runner_(task_graph_runner),
id_(id),
consecutive_frame_with_damage_count_(settings.damaged_frame_limit),
// It is safe to use base::Unretained here since we will outlive the
// ImageAnimationController.
image_animation_controller_(GetTaskRunner(),
this,
settings_.enable_image_animation_resync),
paint_image_generator_client_id_(PaintImage::GetNextGeneratorClientId()),
frame_trackers_(settings.single_thread_proxy_scheduler,
compositor_frame_reporting_controller_.get()),
lcd_text_metrics_reporter_(LCDTextMetricsReporter::CreateIfNeeded(this)),
frame_rate_estimator_(GetTaskRunner()),
contains_srgb_cache_(kContainsSrgbCacheSize) {
DCHECK(mutator_host_);
mutator_host_->SetMutatorHostClient(this);
mutator_events_ = mutator_host_->CreateEvents();
DCHECK(task_runner_provider_->IsImplThread());
DidVisibilityChange(this, visible_);
// LTHI always has an active tree.
active_tree_ = std::make_unique<LayerTreeImpl>(
this, new SyncedProperty<ScaleGroup>, new SyncedBrowserControls,
new SyncedBrowserControls, new SyncedElasticOverscroll);
active_tree_->property_trees()->is_active = true;
viewport_ = Viewport::Create(this);
TRACE_EVENT_OBJECT_CREATED_WITH_ID(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
"cc::LayerTreeHostImpl", id_);
browser_controls_offset_manager_ = BrowserControlsOffsetManager::Create(
this, settings.top_controls_show_threshold,
settings.top_controls_hide_threshold);
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableLayerTreeHostMemoryPressure)) {
memory_pressure_listener_ = std::make_unique<base::MemoryPressureListener>(
FROM_HERE, base::BindRepeating(&LayerTreeHostImpl::OnMemoryPressure,
base::Unretained(this)));
}
SetDebugState(settings.initial_debug_state);
compositor_frame_reporting_controller_->SetDroppedFrameCounter(
&dropped_frame_counter_);
dropped_frame_counter_.set_total_counter(&total_frame_counter_);
frame_trackers_.set_custom_tracker_results_added_callback(
base::BindRepeating(&LayerTreeHostImpl::NotifyThroughputTrackerResults,
weak_factory_.GetWeakPtr()));
}

浙公网安备 33010602011771号