import defaultValue from '../../Core/defaultValue.js'; import defined from '../../Core/defined.js'; import defineProperties from '../../Core/defineProperties.js'; import destroyObject from '../../Core/destroyObject.js'; import DeveloperError from '../../Core/DeveloperError.js'; import FrameRateMonitor from '../../Scene/FrameRateMonitor.js'; import knockout from '../../ThirdParty/knockout.js'; import createCommand from '../createCommand.js'; /** * The view model for {@link PerformanceWatchdog}. * * @alias PerformanceWatchdogViewModel * @constructor * * @param {Object} [options] Object with the following properties: * @param {Scene} options.scene The Scene instance for which to monitor performance. * @param {String} [options.lowFrameRateMessage='This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] The * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. */ function PerformanceWatchdogViewModel(options) { //>>includeStart('debug', pragmas.debug); if (!defined(options) || !defined(options.scene)) { throw new DeveloperError('options.scene is required.'); } //>>includeEnd('debug'); this._scene = options.scene; /** * Gets or sets the message to display when a low frame rate is detected. This string will be interpreted as HTML. * @type {String} */ this.lowFrameRateMessage = defaultValue(options.lowFrameRateMessage, 'This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'); /** * Gets or sets a value indicating whether the low frame rate message has previously been dismissed by the user. If it has * been dismissed, the message will not be redisplayed, no matter the frame rate. * @type {Boolean} */ this.lowFrameRateMessageDismissed = false; /** * Gets or sets a value indicating whether the low frame rate message is currently being displayed. * @type {Boolean} */ this.showingLowFrameRateMessage = false; knockout.track(this, ['lowFrameRateMessage', 'lowFrameRateMessageDismissed', 'showingLowFrameRateMessage']); var that = this; this._dismissMessage = createCommand(function() { that.showingLowFrameRateMessage = false; that.lowFrameRateMessageDismissed = true; }); var monitor = FrameRateMonitor.fromScene(options.scene); this._unsubscribeLowFrameRate = monitor.lowFrameRate.addEventListener(function() { if (!that.lowFrameRateMessageDismissed) { that.showingLowFrameRateMessage = true; } }); this._unsubscribeNominalFrameRate = monitor.nominalFrameRate.addEventListener(function() { that.showingLowFrameRateMessage = false; }); } defineProperties(PerformanceWatchdogViewModel.prototype, { /** * Gets the {@link Scene} instance for which to monitor performance. * @memberof PerformanceWatchdogViewModel.prototype * @type {Scene} */ scene : { get : function() { return this._scene; } }, /** * Gets a command that dismisses the low frame rate message. Once it is dismissed, the message * will not be redisplayed. * @memberof PerformanceWatchdogViewModel.prototype * @type {Command} */ dismissMessage : { get : function() { return this._dismissMessage; } } }); PerformanceWatchdogViewModel.prototype.destroy = function() { this._unsubscribeLowFrameRate(); this._unsubscribeNominalFrameRate(); return destroyObject(this); }; export default PerformanceWatchdogViewModel;