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; }
int32 GetPortFromNetDriver(FName InstanceName) { int32 Port = 0; #if WITH_ENGINE if (GEngine) { UWorld* World = GetWorldForOnline(InstanceName); UNetDriver* NetDriver = World ? GEngine->FindNamedNetDriver(World, NAME_GameNetDriver) : NULL; if (NetDriver && NetDriver->GetNetMode() < NM_Client) { FString AddressStr = NetDriver->LowLevelGetNetworkNumber(); int32 Colon = AddressStr.Find(":", ESearchCase::IgnoreCase, ESearchDir::FromEnd); if (Colon != INDEX_NONE) { FString PortStr = AddressStr.Mid(Colon + 1); if (!PortStr.IsEmpty()) { Port = FCString::Atoi(*PortStr); } } } } #endif return Port; }
void UShooterEngine::HandleNetworkFailure(UWorld *World, UNetDriver *NetDriver, ENetworkFailure::Type FailureType, const FString& ErrorString) { // Determine if we need to change the King state based on network failures. // Only handle failure at this level for game or pending net drivers. FName NetDriverName = NetDriver ? NetDriver->NetDriverName : NAME_None; if (NetDriverName == NAME_GameNetDriver || NetDriverName == NAME_PendingNetDriver) { // If this net driver has already been unregistered with this world, then don't handle it. if (World) { UNetDriver * NetDriver = FindNamedNetDriver(World, NetDriverName); if (NetDriver) { bool bGoBackToMain = false; ENetMode FailureNetMode = NetDriver->GetNetMode(); // NetMode of the driver that failed switch (FailureType) { case ENetworkFailure::FailureReceived: break; case ENetworkFailure::PendingConnectionFailure: break; case ENetworkFailure::ConnectionLost: case ENetworkFailure::ConnectionTimeout: // only clients need to bail back to main if they lost connection bGoBackToMain = (FailureNetMode == NM_Client); break; case ENetworkFailure::NetDriverAlreadyExists: case ENetworkFailure::NetDriverCreateFailure: case ENetworkFailure::OutdatedClient: case ENetworkFailure::OutdatedServer: default: break; } if (bGoBackToMain) { UShooterGameInstance* const GI = Cast<UShooterGameInstance>(GameInstance); if (GI) { const FString ReturnReason = NSLOCTEXT( "NetworkErrors", "HostDisconnect", "Lost connection to host." ).ToString(); const FString OKButton = NSLOCTEXT( "DialogButtons", "OKAY", "OK" ).ToString(); GI->ShowMessageThenGotoState( ReturnReason, OKButton, FString(), ShooterGameInstanceState::MainMenu ); } } } } } // standard failure handling. Super::HandleNetworkFailure(World, NetDriver, FailureType, ErrorString); }