ClientFrameComponent.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System.Collections.Generic;
  2. namespace ETModel
  3. {
  4. public struct SessionFrameMessage
  5. {
  6. public Session Session;
  7. public FrameMessage FrameMessage;
  8. }
  9. [ObjectSystem]
  10. public class ClientFrameComponentStartSystem : StartSystem<ClientFrameComponent>
  11. {
  12. public override void Start(ClientFrameComponent t)
  13. {
  14. t.Start();
  15. }
  16. }
  17. public class ClientFrameComponent: Component
  18. {
  19. public int Frame;
  20. public Queue<SessionFrameMessage> Queue = new Queue<SessionFrameMessage>();
  21. public int count = 1;
  22. public int waitTime;
  23. public const int maxWaitTime = 40;
  24. public void Start()
  25. {
  26. UpdateAsync();
  27. }
  28. public void Add(Session session, FrameMessage frameMessage)
  29. {
  30. this.Queue.Enqueue(new SessionFrameMessage() {Session = session, FrameMessage = frameMessage});
  31. }
  32. public async void UpdateAsync()
  33. {
  34. TimerComponent timerComponent = Game.Scene.GetComponent<TimerComponent>();
  35. while (true)
  36. {
  37. // 如果队列中消息多于4个,则加速跑帧
  38. this.waitTime = maxWaitTime;
  39. if (this.Queue.Count > 4)
  40. {
  41. this.waitTime = maxWaitTime - (this.Queue.Count - 4) * 2;
  42. }
  43. // 最快加速一倍
  44. if (this.waitTime < 20)
  45. {
  46. this.waitTime = 20;
  47. }
  48. await timerComponent.WaitAsync(waitTime);
  49. if (this.IsDisposed)
  50. {
  51. return;
  52. }
  53. this.UpdateFrame();
  54. }
  55. }
  56. private void UpdateFrame()
  57. {
  58. if (this.Queue.Count == 0)
  59. {
  60. return;
  61. }
  62. SessionFrameMessage sessionFrameMessage = this.Queue.Dequeue();
  63. this.Frame = sessionFrameMessage.FrameMessage.Frame;
  64. for (int i = 0; i < sessionFrameMessage.FrameMessage.Messages.Count; ++i)
  65. {
  66. IFrameMessage message = (IFrameMessage)sessionFrameMessage.FrameMessage.Messages[i];
  67. ushort opcode = Game.Scene.GetComponent<OpcodeTypeComponent>().GetOpcode(message.GetType());
  68. Game.Scene.GetComponent<MessageDispatherComponent>().Handle(sessionFrameMessage.Session, new MessageInfo(0, opcode, message));
  69. }
  70. }
  71. }
  72. }