ClientFrameComponent.cs 2.1 KB

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