UNPKG

@quick-game/cli

Version:

Command line interface for rapid qg development

116 lines 5.25 kB
// Copyright 2023 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import * as TraceEngine from '../../models/trace/trace.js'; import * as i18n from '../../core/i18n/i18n.js'; import { buildGroupStyle, buildTrackHeader, getFormattedTime } from './AppenderUtils.js'; const UIStrings = { /** *@description Text in Timeline Flame Chart Data Provider of the Performance panel */ thread: 'Main Thread by new engine', /** *@description Text for the name of anonymous functions */ anonymous: '(anonymous)', }; const str_ = i18n.i18n.registerUIStrings('panels/timeline/ThreadAppender.ts', UIStrings); const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_); // This appender is only triggered when the Renderer handler is run. At // the moment this only happens in the basic component server example. // In the future, once this appender fully supports the behaviour of the // old engine's thread/sync tracks we can always run it by enabling the // Renderer and Samples handler by default. export class ThreadAppender { appenderName = 'Thread'; #colorGenerator; #compatibilityBuilder; #traceParsedData; #entries = []; #processId; constructor(compatibilityBuilder, traceParsedData, colorGenerator, processId, threadId) { this.#compatibilityBuilder = compatibilityBuilder; this.#colorGenerator = colorGenerator; this.#traceParsedData = traceParsedData; this.#processId = processId; const entries = this.#traceParsedData.Renderer?.processes.get(processId)?.threads?.get(threadId)?.entries; if (!entries) { throw new Error(`Could not find data for thread with id ${threadId} in process with id ${processId}`); } this.#entries = entries; } /** * Appends into the flame chart data the data corresponding to the * this thread. * @param trackStartLevel the horizontal level of the flame chart events where * the track's events will start being appended. * @param expanded wether the track should be rendered expanded. * @returns the first available level to append more data after having * appended the track's events. */ appendTrackAtLevel(trackStartLevel, expanded) { if (this.#entries.length === 0) { return trackStartLevel; } this.#appendTrackHeaderAtLevel(trackStartLevel, expanded); return this.#appendThreadEntriesAtLevel(trackStartLevel); } /** * Adds into the flame chart data the header corresponding to this * thread. A header is added in the shape of a group in the flame * chart data. A group has a predefined style and a reference to the * definition of the legacy track (which should be removed in the * future). * @param currentLevel the flame chart level at which the header is * appended. */ #appendTrackHeaderAtLevel(currentLevel, expanded) { const trackIsCollapsible = this.#entries.length > 0; const style = buildGroupStyle({ shareHeaderLine: false, collapsible: trackIsCollapsible }); const name = this.#traceParsedData.Renderer?.processes.get(this.#processId)?.url || ''; const group = buildTrackHeader(currentLevel, i18nString(UIStrings.thread) + ' ' + name, style, /* selectable= */ true, expanded); this.#compatibilityBuilder.registerTrackForGroup(group, this); } /** * Adds into the flame chart data the entries of this thread, which * includes trace events and JS calls. * @param currentLevel the flame chart level from which entries will * be appended. * @returns the next level after the last occupied by the appended * entries (the first available level to append more data). */ #appendThreadEntriesAtLevel(trackStartLevel) { return this.#compatibilityBuilder.appendEventsAtLevel(this.#entries, trackStartLevel, this); } /* ------------------------------------------------------------------------------------ The following methods are invoked by the flame chart renderer to query features about events on rendering. ------------------------------------------------------------------------------------ */ /** * Gets the color an event added by this appender should be rendered with. */ colorForEvent(event) { const idForColorGeneration = this.titleForEvent(event); return this.#colorGenerator.colorForID(idForColorGeneration); } /** * Gets the title an event added by this appender should be rendered with. */ titleForEvent(event) { if (TraceEngine.Types.TraceEvents.isProfileCall(event)) { return event.callFrame.functionName || i18nString(UIStrings.anonymous); } return event.name; } /** * Returns the info shown when an event added by this appender * is hovered in the timeline. */ highlightedEntryInfo(event) { const title = this.titleForEvent(event); return { title, formattedTime: getFormattedTime(event.dur) }; } } //# sourceMappingURL=ThreadAppender.js.map