public void Draw(bool refresh) { lock (_drawLock) { if (refresh) { _refreshingClient = true; } Event ev = new TileUpdatedEvent { Identifier = Guid.NewGuid(), SenderId = Identifier, Tile = GetEntity(), MimeType = _mimeType, Quality = _quality }; ApplicationContext.FireEvent(ev); if (refresh) { _refreshingClient = false; } } }
private void ProcessIncomingQueue() { lock (_incomingEventSync) { //TODO: will renderLoopCount overflow? _renderLoopCount++; EventSet current; if (!_incomingEventSets.TryGetValue(_nextEventSetNumber, out current)) { return; } bool hasTileUpdateEvent = current.Events.Any(i => i is TileUpdatedEvent); TileUpdatedEvent tileUpdateEv = hasTileUpdateEvent ? current.Events.First(i => i is TileUpdatedEvent) as TileUpdatedEvent : null; if (hasTileUpdateEvent) { long prevTileUpdate; if (_timePrevTileUpdateEvent.TryGetValue(tileUpdateEv.SenderId, out prevTileUpdate)) { // For some reason, image on the screen is not updated if it is changed too fast // My guess is it takes another iteration to refresh the UI. // // NOTE: From MSDN http://msdn.microsoft.com/en-us/library/system.windows.media.compositiontarget.rendering.aspx // This event handler gets called once per frame. Each time that Windows Presentation Foundation (WPF) marshals the persisted rendering data in the visual tree across to the composition tree, // your event handler is called. In addition, if changes to the visual tree force updates to the composition tree, your event handler is also called. // Note that your event handler is called after layout has been computed. // However, you can modify layout in your event handler, which means that layout will be computed once more before rendering. // if (ThrottleSettings.Default.EnableFPSCap) { if (_renderLoopCount - prevTileUpdate < 3) { return; } } } } _incomingEventSets.Remove(_nextEventSetNumber); _nextEventSetNumber = current.Number + 1; var ev = current; ProcessEventSet(ev); if (hasTileUpdateEvent) { _timePrevTileUpdateEvent[tileUpdateEv.SenderId] = _renderLoopCount; } } }
private void ChangeClientRectangle(MockApplicationContext context, TileEntityHandler handler, int left, int top, int height, int width, string errorMessageIfFailed) { Trace.WriteLine(String.Format("Simulate changing client size to {0}x{1}", width, height)); handler.ProcessMessage(new UpdatePropertyMessage() { PropertyName = "ClientRectangle", Value = new Rectangle { Left = left, Top = top, Height = height, Width = width } }); TileUpdatedEvent tileUpdateEvent = context.EventSent.FindLast(e => e is TileUpdatedEvent) as TileUpdatedEvent; Bitmap bmp = new Bitmap(new MemoryStream(tileUpdateEvent.Tile.Image)); Trace.WriteLine(String.Format("Checking size of the image being sent")); Assert.AreEqual(width, bmp.Width, errorMessageIfFailed); Assert.AreEqual(height, bmp.Height, errorMessageIfFailed); }
private void RaiseTileUpdatedEvent(TileUpdatedEventArgs args) { TileUpdatedEvent?.Invoke(this, args); }