/// <summary> /// Process queued messages and write if possible /// </summary> public void ProcessOutboundQueue() { if (outboundQueue.Count() < 1) { return; } if (outboundQueue.Count() > 10) { InteropLogger.Warning($"Outbound queue is at {outboundQueue.Count()} messages"); } // Pump the queue until we fill the outbound buffer int bytesWritten; do { // Only dequeue a message once we have an available node for writing bytesWritten = messageProducer.Write((ptr) => { var next = outboundQueue.Dequeue(); InteropLogger.Debug($" W-> {next.target}:{next.header.type:F}"); return(WriteMessage(next, ptr)); }, 0); } while (bytesWritten > 0 && outboundQueue.Count() > 0); }
/// <summary> /// Consume a single message off the read queue. /// </summary> private void ConsumeMessage() { messages.Read((target, header, ptr) => { lastUpdateFromUnity = DateTime.Now; if (!handlers.ContainsKey(header.type)) { InteropLogger.Warning($"Unhandled request type {header.type} for {target}"); return(0); } return(handlers[header.type](target, ptr)); }); }
/// <summary> /// Process queued messages and write if possible /// </summary> public void ProcessOutboundQueue() { if (outboundQueue.Count() < 1) { return; } if (outboundQueue.Count() > 10) { InteropLogger.Warning($"Outbound queue is at {outboundQueue.Count()} messages"); } // Only dequeue a message once we have an available node for writing int bytesWritten = messageProducer.Write((ptr) => { var next = outboundQueue.Dequeue(); return(WriteMessage(next, ptr)); }, 5); }
/// <summary> /// Read from the viewport image buffer and copy /// pixel data into the appropriate viewport. /// </summary> internal void ConsumePixels() { if (pixelsConsumer == null || pixelsConsumer.ShuttingDown) { return; } pixelsConsumer.Read((ptr) => { var headerSize = FastStructure.SizeOf <InteropRenderHeader>(); var header = FastStructure.PtrToStructure <InteropRenderHeader>(ptr); if (!viewports.ContainsKey(header.viewportId)) { InteropLogger.Warning($"Got render texture for unknown viewport {header.viewportId}"); return(headerSize); } var viewport = viewports[header.viewportId]; var pixelDataSize = viewport.ReadPixelData(header, ptr + headerSize); return(headerSize + pixelDataSize); }, READ_WAIT); }