ClientFrameComponent.cs 2.4 KB

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