public FramePacket GetDataBuffer(int size) { lock (this) { if (pool.Count > 0) { FramePacket candidate = pool.RemoveFront(); if (candidate == null) { Debug.LogError("candidate is null! returns new buffer."); return(GetNewBuffer(size)); } else { if (candidate.Buffer == null) { Debug.LogError("candidate.Buffer is null!"); } } if (candidate.Buffer.Length > size) { return(candidate); } } } return(GetNewBuffer(size)); }
void ApplyToGame(FramePacket packet) { foreach (var entityData in packet.entities) { if (!syncedEntities.ContainsKey(entityData.entityID)) { var ent = gameCtx.CreateEntity(); ent.AddFrameSync(entityData.entityID); syncedEntities.Add(entityData.entityID, ent); } var entity = syncedEntities[entityData.entityID]; foreach (var compData in entityData.components) { var compID = compData.componentID; if (!entity.HasComponent(compID)) { var ctor = GameComponentsLookup.componentTypes[compID].GetConstructor(new System.Type[0]); entity.AddComponent(compID, (IComponent)ctor.Invoke(new object[0])); } var comp = (IFrameSyncComponent)entity.GetComponent(compID); using (var stream = new MemoryStream(compData.data)) { var reader = new BinaryReader(stream); comp.ReadBytes(reader); } } } }
public void OnI420RemoteFrameReady(int id, IntPtr dataY, IntPtr dataU, IntPtr dataV, IntPtr dataA, int strideY, int strideU, int strideV, int strideA, uint width, uint height) { /* if ( (++sFrameCount % 25) == 0) * { * Debug.Log("OnI420RemoteFrameReady clientID" + id); * } */ //Debug.Log("OnI420RemoteFrameReady called! w=" + width + " h=" + height + " thread:" + Thread.CurrentThread.ManagedThreadId); //Debug.Log("OnI420RemoteFrameReady called! w=" + width + " h=" + height + " thread:" + Thread.CurrentThread.ManagedThreadId); FramePacket packet = frameQueueRemote.GetDataBufferWithoutContents((int)(width * height * 4)); if (packet == null) { Debug.LogError("OnI420RemoteFrameReady: FramePacket is null!"); return; } CopyYuvToBuffer(dataY, dataU, dataV, strideY, strideU, strideV, width, height, packet.Buffer); packet.width = (int)width; packet.height = (int)height; frameQueueRemote.Push(packet); }
// 返却 public void Push(FramePacket packet) { lock (this) { pool.AddFront(packet); } }
public FramePacket GetDataBufferWithContents(int width, int height, byte[] src, int size) { FramePacket dest = GetDataBuffer(size); System.Array.Copy(src, 0, dest.Buffer, 0, size); dest.width = width; dest.height = height; return(dest); }
private void TryProcessFrame() { if (FrameQueue != null) { FramePacket packet = FrameQueue.Pop(); //Debug.Log((packet == null ? "no frame to consume." : "frame consumed.") + "framesCount : " + frameQueue.Count); if (packet != null) { ProcessFrameBuffer(packet); } } }
private void Peer_RemoteI420FrameReady(IntPtr dataY, IntPtr dataU, IntPtr dataV, IntPtr dataA, int strideY, int strideU, int strideV, int strideA, uint width, uint height) { FramePacket packet = remoteFrameQueue.GetDataBufferWithoutContents((int)(width * height * 4)); if (packet == null) { return; } CopyYuvToBuffer(dataY, dataU, dataV, strideY, strideU, strideV, width, height, packet.Buffer); packet.width = (int)width; packet.height = (int)height; remoteFrameQueue.Push(packet); }
/// <summary> /// Internal helper that attempts to process frame data in the frame queue /// </summary> private void TryProcessFrame() { if (FrameQueue != null) { FramePacket packet = FrameQueue.Pop(); if (packet != null) { ProcessFrameBuffer(packet); FrameQueue.Pool(packet); } } }
// 发送 private void SendGiveUpFrame() { #if !SERVER FramePacket packet = new FramePacket(); packet.type = 2; packet.giveup = new GiveUpPacket(); packet.giveup.team = battleData.currentTeam; byte[] bytestr = Json.EnCodeBytes(packet); NetMessage.PbFrame pb = new PbFrame(); NetMessage.CSFrame build = new CSFrame(); pb.content = bytestr; build.frame = pb; NetSystem.Instance.Send <NetMessage.CSFrame> ((int)NetMessage.MsgId.ID_CSFrame, build); #endif }
private void Peer_OnRemoteArgbWithCameraTransform(Peer peer, uint width, uint height, byte[] buffer, float posX, float posY, float poxZ, float rotX, float rotY, float rotZ, float rotW) { //FramePacket packet = new FramePacket((int)width * (int)height * 4); FramePacket packet = new FramePacket(buffer); if (packet == null) { Debug.Log("frame packet cannot be created."); } packet.width = (int)width; packet.height = (int)height; //buffer.CopyTo(packet.Buffer, 0); RemoteVideo.FrameQueue.Push(packet); }
public void OnI420RemoteFrameReady(int id, IntPtr dataY, IntPtr dataU, IntPtr dataV, IntPtr dataA, int strideY, int strideU, int strideV, int strideA, uint width, uint height) { FramePacket packet = GetNewBuffer((int)(width * height * 4)); if (packet == null) { Debug.LogError("OnI420RemoteFrameReady: FramePacket is null!"); return; } CopyYuvToBuffer(dataY, dataU, dataV, strideY, strideU, strideV, width, height, packet.Buffer); packet.width = (int)width; packet.height = (int)height; framePacket = packet; }
// private void TryProcessFrame() // { // if (frameQueue != null) // { // FramePacket packet = frameQueue.Pop(); // //Debug.Log((packet == null ? "no frame to consume." : "frame consumed.") + "framesCount : " + frameQueue.Count); // if (packet != null) // { // ProcessFrameBuffer(packet); // frameQueue.Pool(packet); // } // } // } private void ProcessFrameBuffer(FramePacket packet) { if (packet == null) { return; } if (tex == null || (tex.width != packet.width || tex.height != packet.height)) { Debug.Log("Create Texture. width:" + packet.width + " height:" + packet.height); tex = new Texture2D(packet.width, packet.height, TextureFormat.RGBA32, false); } //Debug.Log("Received Packet. " + packet.ToString()); tex.LoadRawTextureData(packet.Buffer); tex.Apply(); GetComponent <Renderer>().material.mainTexture = tex; }
public void OnI420LocalFrameReady(int id, IntPtr dataY, IntPtr dataU, IntPtr dataV, IntPtr dataA, int strideY, int strideU, int strideV, int strideA, uint width, uint height) { //Debug.Log("OnI420LocalFrameReady called! w=" + width + " h=" + height+" thread:"+ Thread.CurrentThread.ManagedThreadId + ":" + Thread.CurrentThread.Name); FramePacket packet = frameQueueLocal.GetDataBufferWithoutContents((int)(width * height * 4)); if (packet == null) { //Debug.LogError("OnI420LocalFrameReady: FramePacket is null!"); return; } CopyYuvToBuffer(dataY, dataU, dataV, strideY, strideU, strideV, width, height, packet.Buffer); packet.width = (int)width; packet.height = (int)height; frameQueueLocal.Push(packet); }
List <FramePacket> RecvFramePackets() { List <FramePacket> ret = new List <FramePacket>(); foreach (var packetEnt in packetGroup.GetEntities()) { var recv = packetEnt.recvPacket; if (recv.packet.packetType == PacketType.Frame) { using (var stream = new MemoryStream(recv.packet.data)) { var reader = new BinaryReader(stream); var framePacket = new FramePacket(); framePacket.Read(reader); ret.Add(framePacket); } } } return(ret); }
public void Push(FramePacket frame) { stats.CountFrameLoad(); FramePacket trashBuf = null; lock (this) { frames.AddFront(frame); if (frames.Count >= maxQueueCount) { stats.CountFrameSkip(); trashBuf = frames.RemoveBack(); } } if (trashBuf != null && poolBuffer) { bufferPool.Push(trashBuf); } }
/// <summary> /// Internal helper that attempts to render frame data to the texture /// </summary> /// <param name="packet"></param> private void ProcessFrameBuffer(FramePacket packet) { if (packet == null) { return; } if (tex == null || (tex.width != packet.width || tex.height != packet.height)) { tex = new Texture2D(packet.width, packet.height, TextureFormat.RGBA32, false); } // note: this only "looks right" in Unity because we apply the // "YUVFeedShader" to the texture (converting yuv to rgb) tex.LoadRawTextureData(packet.Buffer); tex.Apply(); this.GetComponent <Renderer>().material.mainTexture = tex; }
public void Push(FramePacket frame) { stats.CountFrameLoad(); FramePacket trashBuf = null; lock (this) { frames.AddFront(frame); if (frames.Count >= maxQueueCount) { stats.CountFrameSkip(); trashBuf = frames.RemoveBack(); } } // lock内でPushしないのは、thisとbufferPoolの両方のlockを同時にとらないようにする配慮。 if (trashBuf != null) { bufferPool.Push(trashBuf); } }
FramePacket BuildFramePacket() { FramePacket packet = new FramePacket(); var entities = syncedEntities.GetEntities(); packet.entities = new EntitySyncData[entities.Length]; int eidx = 0; foreach (var ent in syncedEntities.GetEntities()) { var syncData = new EntitySyncData(); packet.entities[eidx] = syncData; syncData.entityID = ent.frameSync.entityID; var syncComponents = ent.GetSyncComponents(); syncData.components = new ComponentSyncData[syncComponents.Length]; for (int j = 0; j < syncComponents.Length; ++j) { var pair = syncComponents[j]; var compData = new ComponentSyncData(); syncData.components[j] = compData; compData.componentID = (byte)pair.index; using (var stream = new MemoryStream()) { var writer = new BinaryWriter(stream); pair.component.WriteBytes(writer); compData.data = stream.ToArray(); } } ++eidx; } return(packet); }
void UpdateBattleSpeed() { if (speedUp) { return; } int elapsed = Mathf.RoundToInt(BattleSystem.Instance.sceneManager.GetBattleTime()); if (elapsed >= 60 * 3) { speedUp = true; FramePacket packet = new FramePacket(); packet.type = 3; byte[] bytestr = Json.EnCodeBytes(packet); NetMessage.PbFrame pb = new PbFrame(); NetMessage.CSFrame build = new CSFrame(); pb.content = bytestr; build.frame = pb; NetSystem.Instance.Send <NetMessage.CSFrame>((int)NetMessage.MsgId.ID_CSFrame, build); EventSystem.Instance.FireEvent(EventId.OnPVPBattleAccelerate, null); } }
public void Pool(FramePacket buf) { bufferPool.Push(buf); }
private FramePacket GetNewBuffer(int neededSize) { FramePacket packet = new FramePacket((int)(neededSize * 1.2)); return(packet); }