#include "NetworkSettings.h" #include "ReliabilityLayer.h" #include "Util/Statistics.h" #include "NetworkProfiler.h" #include "util/MemoryStats.h" #include "v8datamodel/Workspace.h" namespace RBX { const char* const sNetworkSettings = "NetworkSettings"; namespace Reflection { template<> EnumDesc::EnumDesc() :EnumDescriptor("PhysicsSendMethod") { addPair(NetworkSettings::ErrorComputation, "ErrorComputation"); addPair(NetworkSettings::ErrorComputation2, "ErrorComputation2"); addPair(NetworkSettings::RoundRobin, "RoundRobin"); addPair(NetworkSettings::TopNErrors, "TopNErrors"); } template<> EnumDesc::EnumDesc() :EnumDescriptor("PhysicsReceiveMethod") { addPair(NetworkSettings::Direct, "Direct"); addPair(NetworkSettings::Interpolation, "Interpolation"); } template<> EnumDesc::EnumDesc() :EnumDescriptor("PacketReliability") { addPair(UNRELIABLE, "UNRELIABLE"); addPair(UNRELIABLE_SEQUENCED, "UNRELIABLE_SEQUENCED"); addPair(RELIABLE, "RELIABLE"); addPair(RELIABLE_ORDERED, "RELIABLE_ORDERED"); addPair(RELIABLE_SEQUENCED, "RELIABLE_SEQUENCED"); } template<> EnumDesc::EnumDesc() :EnumDescriptor("PacketPriority") { addPair(IMMEDIATE_PRIORITY, "IMMEDIATE_PRIORITY"); addPair(HIGH_PRIORITY, "HIGH_PRIORITY"); addPair(MEDIUM_PRIORITY, "MEDIUM_PRIORITY"); addPair(LOW_PRIORITY, "LOW_PRIORITY"); } }//namespace Reflection REFLECTION_BEGIN(); static Reflection::BoundProp prop_PreferredClientPort("PreferredClientPort", "Network", &NetworkSettings::preferredClientPort); static Reflection::PropDescriptor prop_DataSendRate("DataSendRate", "Network", &NetworkSettings::getDataSendRate, &NetworkSettings::setDataSendRate); static Reflection::PropDescriptor prop_DataGCRate("DataGCRate", "Network", &NetworkSettings::getDataGCRate, &NetworkSettings::setDataGCRate); static Reflection::PropDescriptor prop_PhysicsSendRate("PhysicsSendRate", "Network", &NetworkSettings::getPhysicsSendRate, &NetworkSettings::setPhysicsSendRate); static Reflection::PropDescriptor prop_ClientPhysicsSendRate("ClientPhysicsSendRate", "Network", &NetworkSettings::getClientPhysicsSendRate, &NetworkSettings::setClientPhysicsSendRate); static Reflection::BoundProp prop_SendRate("NetworkOwnerRate", "Network", &NetworkSettings::networkOwnerRate); static Reflection::PropDescriptor prop_TouchSendRate("TouchSendRate", "Network", &NetworkSettings::getTouchSendRate, &NetworkSettings::setTouchSendRate); static Reflection::BoundProp prop_isThrottledByOutgoingBandwidthLimit("IsThrottledByOutgoingBandwidthLimit", "Network", &NetworkSettings::isThrottledByOutgoingBandwidthLimit); static Reflection::BoundProp prop_IsThrottledByCongestionControl("IsThrottledByCongestionControl", "Network", &NetworkSettings::isThrottledByCongestionControl); static Reflection::PropDescriptor prop_ReceiveRate("ReceiveRate", "Network", &NetworkSettings::getReceiveRate, &NetworkSettings::setReceiveRate); static Reflection::BoundProp prop_WaitingForCharacterLogRate("WaitingForCharacterLogRate", "Network", &NetworkSettings::deprecatedWaitingForCharacterLogRate, Reflection::PropertyDescriptor::Attributes::deprecated(Reflection::PropertyDescriptor::HIDDEN_SCRIPTING)); static Reflection::PropDescriptor prop_ReportStatUrl("ReportStatURL", "Network", &NetworkSettings::getReportStatURL, &NetworkSettings::setReportStatURL, Reflection::PropertyDescriptor::Attributes::deprecated(Reflection::PropertyDescriptor::HIDDEN_SCRIPTING)); static Reflection::BoundProp prop_UsePhysicsPacketCache("UsePhysicsPacketCache", "Network", &NetworkSettings::usePhysicsPacketCache); static Reflection::BoundProp prop_UseInstancePacketCache("UseInstancePacketCache", "Network", &NetworkSettings::useInstancePacketCache); static Reflection::BoundProp propIsQueueErrorComputed("IsQueueErrorComputed", "Network", &NetworkSettings::isQueueErrorComputed); static Reflection::BoundProp prop_TrackDataTypes("TrackDataTypes", "Diagnostics", &NetworkSettings::trackDataTypes); static Reflection::BoundProp prop_TrackPhysicsDetails("TrackPhysicsDetails", "Diagnostics", &NetworkSettings::trackPhysicsDetails); static Reflection::BoundProp prop_PrintSplitMessages("PrintSplitMessage", "Diagnostics", &NetworkSettings::printSplitMessages); static Reflection::BoundProp prop_PrintTouches("PrintTouches", "Diagnostics", &NetworkSettings::printTouches); static Reflection::BoundProp prop_PrintInstances("PrintInstances", "Diagnostics", &NetworkSettings::printInstances); static Reflection::BoundProp prop_PrintStreamInstanceQuota("PrintStreamInstanceQuota", "Diagnostics", &NetworkSettings::printStreamInstanceQuota); static Reflection::BoundProp prop_PrintProperties("PrintProperties", "Diagnostics", &NetworkSettings::printProperties); static Reflection::BoundProp prop_PrintPhysicsErrors("PrintPhysicsErrors", "Diagnostics", &NetworkSettings::printPhysicsErrors); static Reflection::BoundProp prop_PrintDataFilters("PrintFilters", "Diagnostics", &NetworkSettings::printDataFilters); static Reflection::BoundProp prop_ArePhysicsRejectionsReported("ArePhysicsRejectionsReported", "Diagnostics", &NetworkSettings::printPhysicsFilters); static Reflection::BoundProp propPrintEvents("PrintEvents", "Diagnostics", &NetworkSettings::printEvents); static Reflection::BoundProp propPrintBits("PrintBits", "Diagnostics", &NetworkSettings::printBits); static Reflection::BoundProp prop_incommingReplicationLag("IncommingReplicationLag", "Diagnostics", &NetworkSettings::incommingReplicationLag); static Reflection::EnumPropDescriptor prop_PhysicsSend("PhysicsSend", "Physics", &NetworkSettings::getPhysicsSendMethod, &NetworkSettings::setPhysicsSendMethod); static Reflection::EnumPropDescriptor prop_PhysicsReceive("PhysicsReceive", "Physics", &NetworkSettings::dummyGetPhysicsReceiveMethod, &NetworkSettings::dummySetPhysicsReceiveMethod); static Reflection::EnumPropDescriptor prop_PhysicsSendPriority("PhysicsSendPriority", "Physics", &NetworkSettings::getPhysicsSendPriority, &NetworkSettings::setPhysicsSendPriority, Reflection::PropertyDescriptor::HIDDEN_SCRIPTING); Reflection::BoundProp NetworkSettings::prop_DistributedPhysics("ExperimentalPhysicsEnabled", "Physics", &NetworkSettings::distributedPhysicsEnabled); static Reflection::PropDescriptor prop_PhysicsMtuAdjust("PhysicsMtuAdjust", "Physics", &NetworkSettings::getPhysicsMtuAdjust, &NetworkSettings::setPhysicsMtuAdjust); static Reflection::PropDescriptor prop_ReplicationMtuAdjust("DataMtuAdjust", "Data", &NetworkSettings::getReplicationMtuAdjust, &NetworkSettings::setReplicationMtuAdjust); static Reflection::BoundProp propCanSendPacketBufferLimit("CanSendPacketBufferLimit", "Data", &NetworkSettings::canSendPacketBufferLimit); static Reflection::BoundProp propSendPacketBufferLimit("SendPacketBufferLimit", "Data", &NetworkSettings::sendPacketBufferLimit); static Reflection::BoundProp propMaxDataModelSendBuffer("MaxDataModelSendBuffer", "Data", &NetworkSettings::canSendPacketBufferLimit, Reflection::PropertyDescriptor::Attributes::deprecated(propCanSendPacketBufferLimit)); static Reflection::EnumPropDescriptor prop_DataSendPriority("DataSendPriority", "Data", &NetworkSettings::getDataSendPriority, &NetworkSettings::setDataSendPriority, Reflection::PropertyDescriptor::HIDDEN_SCRIPTING); #ifdef NETWORK_PROFILER static Reflection::BoundProp prop_Profiling("Profiling", "Profiler", &NetworkSettings::profiling, Reflection::PropertyDescriptor::UI); static Reflection::BoundProp prop_ProfilingCpu("ProfileCpu", "Profiler", &NetworkSettings::profilecpu); static Reflection::BoundProp prop_ProfilerOneColumnPerStack("ProfilerOneColumnPerStack", "Profiler", &NetworkSettings::profilerOneColumnPerStack, Reflection::PropertyDescriptor::UI); static Reflection::BoundProp prop_ProfilerServerIp("ProfilerServerIp", "Profiler", &NetworkSettings::profilerServerIp); static Reflection::BoundProp prop_ProfilerServerPort("ProfilerServerPort", "Profiler", &NetworkSettings::profilerServerPort); static Reflection::BoundProp prop_ProfilerTag("ProfilerTag", "Profiler", &NetworkSettings::profilerTag, Reflection::PropertyDescriptor::UI); static Reflection::BoundProp prop_ProfilerTimedSeconds("ProfilerTimedSeconds", "Profiler", &NetworkSettings::profilerTimedSeconds); static Reflection::BoundFuncDesc func_printProfilingResult(&NetworkSettings::printProfilingResult, "PrintProfilingResult", Security::None); #endif #ifdef NETWORK_PROFILER static Reflection::BoundProp prop_EnableHeavyCompression("EnableHeavyCompression", "Optimization", &NetworkSettings::enableHeavyCompression, Reflection::PropertyDescriptor::UI); #else static Reflection::BoundProp prop_EnableHeavyCompression("EnableHeavyCompression", "Optimization", &NetworkSettings::enableHeavyCompression, Reflection::PropertyDescriptor::HIDDEN_SCRIPTING); #endif static Reflection::PropDescriptor prop_extraMemoryUsed("ExtraMemoryUsed", category_Data, &NetworkSettings::getExtraMemoryUsedInMB, &NetworkSettings::setExtraMemoryUsedInMB, Reflection::PropertyDescriptor::HIDDEN_SCRIPTING, Security::Plugin); static Reflection::PropDescriptor prop_freeMemoryMBytes("FreeMemoryMBytes", category_Data, &NetworkSettings::getFreeMemoryMBytes, NULL, Reflection::PropertyDescriptor::HIDDEN_SCRIPTING, Security::Plugin); static Reflection::PropDescriptor prop_freeMemoryPoolMBytes("FreeMemoryPoolMBytes", category_Data, &NetworkSettings::getFreeMemoryPoolMBytes, NULL, Reflection::PropertyDescriptor::HIDDEN_SCRIPTING, Security::Plugin); static Reflection::PropDescriptor prop_RenderRegions("RenderStreamedRegions", category_Appearance, &NetworkSettings::getRenderStreamedRegions, &NetworkSettings::setRenderStreamedRegions); static Reflection::PropDescriptor prop_ShowPartMovementPath("ShowPartMovementWayPoint", category_Appearance, &NetworkSettings::getShowPartMovementPath, &NetworkSettings::setShowPartMovementPath); static Reflection::PropDescriptor prop_TotalNumMovementWayPoint("TotalNumMovementWayPoint", category_Appearance, &NetworkSettings::getTotalNumMovementWayPoint, &NetworkSettings::setTotalNumMovementWayPoint); #ifdef RBX_TEST_BUILD static Reflection::PropDescriptor prop_TaskSchedulerFindJobFPS("TaskSchedulerFindJobFPS", category_Appearance, &NetworkSettings::getTaskSchedulerFindJobFPS, &NetworkSettings::setTaskSchedulerFindJobFPS); static Reflection::PropDescriptor prop_TaskSchedulerUpdateJobPriorityOnWake("TaskSchedulerUpdateJobPriorityOnWake", category_Appearance, &NetworkSettings::getTaskSchedulerUpdateJobPriorityOnWake, &NetworkSettings::setTaskSchedulerUpdateJobPriorityOnWake); #endif static Reflection::PropDescriptor prop_ShowActiveAnimationAsset("ShowActiveAnimationAsset", category_Appearance, &NetworkSettings::getShowActiveAnimationAsset, &NetworkSettings::setShowActiveAnimationAsset); REFLECTION_END(); NetworkSettings::NetworkSettings(void) :printInstances(false) ,printStreamInstanceQuota(false) ,printTouches(false) ,distributedPhysicsEnabled(true) ,printPhysicsErrors(false) ,printPhysicsFilters(false) ,printProperties(false) ,printEvents(false) ,printDataFilters(false) ,printBits(false) ,incommingReplicationLag(0.0) ,isQueueErrorComputed(true) ,usePhysicsPacketCache(false) ,useInstancePacketCache(false) ,canSendPacketBufferLimit(1) ,sendPacketBufferLimit(-1) // default is to not check it ,physicsMtuAdjust(-200) ,preferredClientPort(0) ,replicationMtuAdjust(-200) ,dataSendRate(30.0f) ,physicsSendRate(20.0f) ,clientPhysicsSendRate(20.0f) ,dataGCRate(20.0f) ,networkOwnerRate(10.0f) ,touchSendRate(10.0f) ,isThrottledByOutgoingBandwidthLimit(false) ,isThrottledByCongestionControl(false) ,receiveRate(60.0f) ,physicsSendMethod(TopNErrors) // default to TopNErrors as unit tests will be using the default value, if we are going to use other types of senders please make coordinating changes in PhysicsReceiver as it is expecting packets from either RoundRobin sender or TopNError sender ,physicsSendPriority(HIGH_PRIORITY) ,dataSendPriority(MEDIUM_PRIORITY) ,physicsReceiveMethod(Interpolation) ,printSplitMessages(false) ,trackDataTypes(false) ,trackPhysicsDetails(false) ,profiling(false) ,profilecpu(false) ,profilerOneColumnPerStack(false) ,profilerTag("") ,profilerServerIp("127.0.0.1") ,profilerServerPort(38123) ,profilerTimedSeconds(0.f) ,enableHeavyCompression(true) ,extraMemoryUsed(0) ,totalNumMovementWayPoint(1000) { setName("Network"); } template static A clamp(const A& min, const A& value, const A& max) { return std::max(min, std::min(value, max)); } void NetworkSettings::setPhysicsMtuAdjust(int value) { value = clamp(-1000,value,0); if(value != physicsMtuAdjust){ physicsMtuAdjust = value; raisePropertyChanged(prop_PhysicsMtuAdjust); } } void NetworkSettings::setReplicationMtuAdjust(int value) { value = clamp(-1000,value,0); if(value != replicationMtuAdjust){ replicationMtuAdjust = value; raisePropertyChanged(prop_ReplicationMtuAdjust); } } void NetworkSettings::setDataSendRate(float value) { value = clamp(5.0f, value, 120.0f); if(value != dataSendRate){ dataSendRate = value; raisePropertyChanged(prop_DataSendRate); } } void NetworkSettings::setDataGCRate(float value) { value = clamp(2.0f, value, 60.0f); if(value != dataGCRate){ dataGCRate = value; raisePropertyChanged(prop_DataGCRate); } } void NetworkSettings::setPhysicsSendRate(float value) { value = clamp(0.1f, value, 120.0f); if(value != physicsSendRate){ physicsSendRate = value; raisePropertyChanged(prop_PhysicsSendRate); } } void NetworkSettings::setClientPhysicsSendRate(float value) { value = clamp(0.1f, value, 120.0f); if(value != clientPhysicsSendRate){ clientPhysicsSendRate = value; raisePropertyChanged(prop_ClientPhysicsSendRate); } } void NetworkSettings::setTouchSendRate(float value) { value = clamp(1.0f, value, 120.0f); if(value != touchSendRate){ touchSendRate = value; raisePropertyChanged(prop_TouchSendRate); } } void NetworkSettings::setReceiveRate(double value) { value = clamp(5.0,value,120.0); if(value != receiveRate){ receiveRate = value; raisePropertyChanged(prop_ReceiveRate); } } void NetworkSettings::setPhysicsSendMethod(const PhysicsSendMethod& value) { if (value != physicsSendMethod) { physicsSendMethod = value; raiseChanged(prop_PhysicsSend); } } void NetworkSettings::setPhysicsSendPriority(const PacketPriority& value) { if (value != physicsSendPriority) { physicsSendPriority = value; raiseChanged(prop_PhysicsSendPriority); } } void NetworkSettings::setDataSendPriority(const PacketPriority& value) { if (value != dataSendPriority) { dataSendPriority = value; raiseChanged(prop_DataSendPriority); } } void NetworkSettings::dummySetPhysicsReceiveMethod(const PhysicsReceiveMethod& value) { if (value != physicsReceiveMethod) { physicsReceiveMethod = value; raiseChanged(prop_PhysicsReceive); } } bool NetworkSettings::heavyCompressionEnabled() { return enableHeavyCompression; } void NetworkSettings::setExtraMemoryUsedInMB(int value) { if (value < 0) value = 0; if (value != extraMemoryUsed) { extraMemoryUsed = value; raiseChanged(prop_extraMemoryUsed); } } float NetworkSettings::getFreeMemoryMBytes() const { return MemoryStats::freeMemoryBytes() / 1024.0f / 1024.0f; } float NetworkSettings::getFreeMemoryPoolMBytes() const { return MemoryStats::slowGetMemoryPoolAvailability() / 1024.0f / 1024.0f; } void NetworkSettings::setRenderStreamedRegions(bool value) { if (value != Workspace::showStreamedRegions) { Workspace::showStreamedRegions = value; raiseChanged(prop_RenderRegions); } } bool NetworkSettings::getRenderStreamedRegions() const { return Workspace::showStreamedRegions; } void NetworkSettings::setShowPartMovementPath(bool value) { if (value != Workspace::showPartMovementPath) { Workspace::showPartMovementPath = value; } } bool NetworkSettings::getShowPartMovementPath() const { return Workspace::showPartMovementPath; } void NetworkSettings::setTotalNumMovementWayPoint(int value) { if (value < 0) value = 0; if (value > 1000000) value = 1000000; if (value != totalNumMovementWayPoint) { totalNumMovementWayPoint = value; } } bool NetworkSettings::getShowActiveAnimationAsset() const { return Workspace::showActiveAnimationAsset; } void NetworkSettings::setShowActiveAnimationAsset(bool value) { if (value != Workspace::showActiveAnimationAsset) { Workspace::showActiveAnimationAsset = value; } } void NetworkSettings::printProfilingResult() { CPUPROFILER_OUTPUT(); } }