NetworkInputArray.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Multiplayer/NetworkInput/NetworkInputArray.h>
  9. #include <Multiplayer/NetworkEntity/INetworkEntityManager.h>
  10. #include <AzNetworking/Serialization/ISerializer.h>
  11. #include <AzNetworking/Serialization/DeltaSerializer.h>
  12. namespace Multiplayer
  13. {
  14. AZ_CVAR(bool, net_useInputDeltaSerialization, false, nullptr, AZ::ConsoleFunctorFlags::Null, "If true, inputs will use delta-serialization to reduce RPC bandwidth");
  15. NetworkInputArray::NetworkInputArray()
  16. : m_owner()
  17. , m_inputs()
  18. {
  19. ;
  20. }
  21. NetworkInputArray::NetworkInputArray(const ConstNetworkEntityHandle& entityHandle)
  22. : m_owner(entityHandle)
  23. , m_inputs()
  24. {
  25. NetBindComponent* netBindComponent = entityHandle.GetNetBindComponent();
  26. if (netBindComponent)
  27. {
  28. for (AZStd::size_t i = 0; i < m_inputs.size(); ++i)
  29. {
  30. m_inputs[i].m_networkInput.AttachNetBindComponent(netBindComponent);
  31. }
  32. }
  33. }
  34. NetworkInput& NetworkInputArray::operator[](uint32_t index)
  35. {
  36. return m_inputs[index].m_networkInput;
  37. }
  38. const NetworkInput& NetworkInputArray::operator[](uint32_t index) const
  39. {
  40. return m_inputs[index].m_networkInput;
  41. }
  42. bool NetworkInputArray::Serialize(AzNetworking::ISerializer& serializer)
  43. {
  44. if (net_useInputDeltaSerialization)
  45. {
  46. // Use delta-serialization to compress input RPC bandwidth usage
  47. // Always serialize the full first element
  48. if (!m_inputs[0].m_networkInput.Serialize(serializer))
  49. {
  50. return false;
  51. }
  52. // For each subsequent element
  53. for (uint32_t i = 1; i < m_inputs.size(); ++i)
  54. {
  55. if (serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject)
  56. {
  57. AzNetworking::SerializerDelta deltaSerializer;
  58. // Read out the delta
  59. if (!deltaSerializer.Serialize(serializer))
  60. {
  61. return false;
  62. }
  63. // Start with previous value
  64. m_inputs[i].m_networkInput = m_inputs[i - 1].m_networkInput;
  65. // Then apply delta
  66. AzNetworking::DeltaSerializerApply applySerializer(deltaSerializer);
  67. if (!applySerializer.ApplyDelta(m_inputs[i].m_networkInput))
  68. {
  69. return false;
  70. }
  71. }
  72. else
  73. {
  74. AzNetworking::SerializerDelta deltaSerializer;
  75. // Create the delta
  76. AzNetworking::DeltaSerializerCreate createSerializer(deltaSerializer);
  77. if (!createSerializer.CreateDelta(m_inputs[i - 1].m_networkInput, m_inputs[i].m_networkInput))
  78. {
  79. return false;
  80. }
  81. // Then write out the delta
  82. if (!deltaSerializer.Serialize(serializer))
  83. {
  84. return false;
  85. }
  86. }
  87. }
  88. }
  89. else
  90. {
  91. return serializer.Serialize(m_inputs, "InputArray");
  92. }
  93. return true;
  94. }
  95. }