ClientFrameComponent.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Collections.Generic;
  3. namespace ETModel
  4. {
  5. public struct SessionFrameMessage
  6. {
  7. public Session Session;
  8. public FrameMessage FrameMessage;
  9. }
  10. [ObjectSystem]
  11. public class ClientFrameComponentStartSystem : StartSystem<ClientFrameComponent>
  12. {
  13. public override void Start(ClientFrameComponent t)
  14. {
  15. t.Start();
  16. }
  17. }
  18. public class ClientFrameComponent: Component
  19. {
  20. public int Frame;
  21. public Queue<SessionFrameMessage> Queue = new Queue<SessionFrameMessage>();
  22. public int count = 1;
  23. public int waitTime;
  24. public const int maxWaitTime = 100;
  25. public void Start()
  26. {
  27. UpdateAsync();
  28. }
  29. public void Add(Session session, FrameMessage frameMessage)
  30. {
  31. this.Queue.Enqueue(new SessionFrameMessage() {Session = session, FrameMessage = frameMessage});
  32. }
  33. public async void UpdateAsync()
  34. {
  35. try
  36. {
  37. TimerComponent timerComponent = Game.Scene.GetComponent<TimerComponent>();
  38. while (true)
  39. {
  40. await timerComponent.WaitAsync(waitTime);
  41. if (this.IsDisposed)
  42. {
  43. return;
  44. }
  45. this.UpdateFrame();
  46. }
  47. }
  48. catch (Exception e)
  49. {
  50. Log.Error(e);
  51. }
  52. }
  53. private void UpdateFrame()
  54. {
  55. if (this.Queue.Count == 0)
  56. {
  57. return;
  58. }
  59. SessionFrameMessage sessionFrameMessage = this.Queue.Dequeue();
  60. this.Frame = sessionFrameMessage.FrameMessage.Frame;
  61. for (int i = 0; i < sessionFrameMessage.FrameMessage.Messages.Count; ++i)
  62. {
  63. OneFrameMessage oneFrameMessage = sessionFrameMessage.FrameMessage.Messages[i];
  64. Session session = sessionFrameMessage.Session;
  65. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  66. Type type = opcodeTypeComponent.GetType(oneFrameMessage.Op);
  67. IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, oneFrameMessage.AMessage);
  68. Game.Scene.GetComponent<MessageDispatherComponent>().Handle(sessionFrameMessage.Session, new MessageInfo(oneFrameMessage.Op, message));
  69. }
  70. }
  71. }
  72. }