コード例 #1
0
 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));
 }
コード例 #2
0
    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);
                }
            }
        }
    }
コード例 #3
0
    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);
    }
コード例 #4
0
 // 返却
 public void Push(FramePacket packet)
 {
     lock (this)
     {
         pool.AddFront(packet);
     }
 }
コード例 #5
0
    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);
    }
コード例 #6
0
 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);
         }
     }
 }
コード例 #7
0
        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);
        }
コード例 #8
0
        /// <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);
                }
            }
        }
コード例 #9
0
    // 发送
    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
    }
コード例 #10
0
    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);
    }
コード例 #11
0
    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;
    }
コード例 #12
0
    // 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;
    }
コード例 #13
0
    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);
    }
コード例 #14
0
    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);
    }
コード例 #15
0
    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);
        }
    }
コード例 #16
0
        /// <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;
        }
コード例 #17
0
    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);
        }
    }
コード例 #18
0
    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);
    }
コード例 #19
0
    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);
        }
    }
コード例 #20
0
 public void Pool(FramePacket buf)
 {
     bufferPool.Push(buf);
 }
コード例 #21
0
    private FramePacket GetNewBuffer(int neededSize)
    {
        FramePacket packet = new FramePacket((int)(neededSize * 1.2));

        return(packet);
    }