float UGameEngine::GetMaxTickRate(float DeltaTime, bool bAllowFrameRateSmoothing) const { float MaxTickRate = 0.f; if (FPlatformProperties::SupportsWindowedMode() == false && !IsRunningDedicatedServer()) { static const auto CVar = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.VSync")); // Limit framerate on console if VSYNC is enabled to avoid jumps from 30 to 60 and back. if( CVar->GetValueOnGameThread() != 0 ) { if (SmoothedFrameRateRange.HasUpperBound()) { MaxTickRate = SmoothedFrameRateRange.GetUpperBoundValue(); } } } else { UWorld* World = NULL; for (int32 WorldIndex = 0; WorldIndex < WorldList.Num(); ++WorldIndex) { if (WorldList[WorldIndex].WorldType == EWorldType::Game) { World = WorldList[WorldIndex].World(); break; } } if( World ) { UNetDriver* NetDriver = World->GetNetDriver(); // In network games, limit framerate to not saturate bandwidth. if( NetDriver && (NetDriver->GetNetMode() == NM_DedicatedServer || (NetDriver->GetNetMode() == NM_ListenServer && NetDriver->bClampListenServerTickRate))) { // We're a dedicated server, use the LAN or Net tick rate. MaxTickRate = FMath::Clamp( NetDriver->NetServerMaxTickRate, 10, 120 ); } /*else if( NetDriver && NetDriver->ServerConnection ) { if( NetDriver->ServerConnection->CurrentNetSpeed <= 10000 ) { MaxTickRate = FMath::Clamp( MaxTickRate, 10.f, 90.f ); } }*/ } } // See if the code in the base class wants to replace this float SuperTickRate = Super::GetMaxTickRate(DeltaTime, bAllowFrameRateSmoothing); if(SuperTickRate != 0.0) { MaxTickRate = SuperTickRate; } return MaxTickRate; }
void UGameplayCueManager::CheckForTooManyRPCs(FName FuncName, const FGameplayCuePendingExecute& PendingCue, const FString& CueID, const FGameplayEffectContext* EffectContext) { if (GameplayCueCheckForTooManyRPCs) { static IConsoleVariable* MaxRPCPerNetUpdateCVar = IConsoleManager::Get().FindConsoleVariable(TEXT("net.MaxRPCPerNetUpdate")); if (MaxRPCPerNetUpdateCVar) { AActor* Owner = PendingCue.OwningComponent ? PendingCue.OwningComponent->GetOwner() : nullptr; UWorld* World = Owner ? Owner->GetWorld() : nullptr; UNetDriver* NetDriver = World ? World->GetNetDriver() : nullptr; if (NetDriver) { const int32 MaxRPCs = MaxRPCPerNetUpdateCVar->GetInt(); for (UNetConnection* ClientConnection : NetDriver->ClientConnections) { if (ClientConnection) { UActorChannel** OwningActorChannelPtr = ClientConnection->ActorChannels.Find(Owner); TSharedRef<FObjectReplicator>* ComponentReplicatorPtr = (OwningActorChannelPtr && *OwningActorChannelPtr) ? (*OwningActorChannelPtr)->ReplicationMap.Find(PendingCue.OwningComponent) : nullptr; if (ComponentReplicatorPtr) { const TArray<FObjectReplicator::FRPCCallInfo>& RemoteFuncInfo = (*ComponentReplicatorPtr)->RemoteFuncInfo; for (const FObjectReplicator::FRPCCallInfo& CallInfo : RemoteFuncInfo) { if (CallInfo.FuncName == FuncName) { if (CallInfo.Calls > MaxRPCs) { const FString Instigator = EffectContext ? EffectContext->ToString() : TEXT("None"); ABILITY_LOG(Warning, TEXT("Attempted to fire %s when no more RPCs are allowed this net update. Max:%d Cue:%s Instigator:%s Component:%s"), *FuncName.ToString(), MaxRPCs, *CueID, *Instigator, *GetPathNameSafe(PendingCue.OwningComponent)); // Returning here to only log once per offending RPC. return; } break; } } } } } } } } }
void UOnlineSessionClient::OnDestroyForMainMenuComplete(FName SessionName, bool bWasSuccessful) { UE_LOG(LogOnline, Verbose, TEXT("OnDestroyForMainMenuComplete %s bSuccess: %d"), *SessionName.ToString(), bWasSuccessful); IOnlineSessionPtr SessionInt = GetSessionInt(); if (SessionInt.IsValid()) { SessionInt->ClearOnDestroySessionCompleteDelegate_Handle(OnDestroyForMainMenuCompleteDelegateHandle); } UWorld* World = GetWorld(); UNetDriver* NetDriver = World ? World->GetNetDriver() : nullptr; // Call disconnect to force us back to the menu level GEngine->HandleDisconnect(World, NetDriver); bHandlingDisconnect = false; }