; ============================================================================= ; ProjectEleri - IOS platform engine config ; ============================================================================= ; Layered on top of Config/DefaultEngine.ini for the IOS target platform ONLY ; (config hierarchy pattern /Config//Engine.ini, ; see UBT ConfigHierarchy.cs and FConfigCacheIni), so nothing in this file ; changes PC / Mac / Android behaviour. ; ; Purpose: benchmarking. Unreal's IOS defaults lock the game to 30 FPS and to ; the display's vertical sync; this file removes both. ; ; NOTE: the editor's Project Settings -> Platforms -> iOS panel is evaluated on ; the *host* platform (Mac) and therefore does not read this file - it will ; still display the engine defaults ("30 FPS", "Use VSync"). The values below ; are what the packaged IOS build actually uses. ; ; To revert: delete this file (or comment out the entries below). ; ============================================================================= [/Script/IOSRuntimeSettings.IOSRuntimeSettings] ; --- the 30 FPS lock -------------------------------------------------------- ; Engine default is PUFRL_30 (Engine/Config/BaseEngine.ini + IOSRuntimeSettings ; ctor). That value is consumed twice: ; * FIOSPlatformRHIFramePacer::IsEnabled() computes ; FrameInterval = GetMaxRefreshRate() / FrameRateLock = 60 / 30 = 2 ; and runs its CADisplayLink at 60/2 = 30 Hz, which gates every rendered ; frame -> a hard 30 FPS ceiling on device. ; * FMetalDevice::FMetalDevice() stores it into GMetalPresentFramePacing, ; which is used by presentDrawableAfterMinimumDuration(). ; PUFRL_None parses to 0, so the pacer runs at the full refresh rate instead. FrameRateLock=PUFRL_None ; FIOSPlatformRHIFramePacer::GetMaxRefreshRate() returns a hard-coded 60 unless ; this is True; with it enabled it returns [UIScreen mainScreen] ; .maximumFramesPerSecond, i.e. the real panel rate (120Hz on ProMotion devices). ; Required to benchmark above 60 FPS. bEnableDynamicMaxFPS=True ; Emits CADisableMinimumFrameDurationOnPhone into the Info.plist ; generated by UEDeployIOS. Without that key iOS clamps the app to 60Hz even when ; the frame pacer is allowed to go higher. It is a build-time value: rebuild the ; IOS target with UBT so Build/IOS/UBTGenerated/Info.Template.plist is regenerated ; (it is consumed by BUILD/BuildIOS.sh when xcodebuild builds the .app). bSupportHighRefreshRates=True [/Script/Engine.Engine] ; --- no frame rate smoothing ------------------------------------------------ ; Frame rate smoothing is the only thing that applies SmoothedFrameRateRange ; (Config/DefaultEngine.ini currently has UpperBound=200). Engine/Config/ ; BaseEngine.ini already ships bSmoothFrameRate=false, so this is belt and ; braces: it keeps the IOS frame rate uncapped even if the "Smooth Frame Rate" ; project setting is ever switched on in the editor, which would otherwise ; re-introduce a ceiling behind a setting that does not look IOS specific. bSmoothFrameRate=False [SystemSettings] ; --- no vsync --------------------------------------------------------------- ; Unreal derives bLockToVsync from this CVar (Runtime/Engine/Private/ ; UnrealClient.cpp), which on Metal becomes CAMetalLayer.displaySyncEnabled: ; with the game running fullscreen, 0 => false => presents never wait for the ; display. It also stops the IOS frame pacer from re-tuning the CADisplayLink ; interval from rhi.SyncInterval (Engine/Config/Android/AndroidEngine.ini uses ; the same key, [ConsoleVariables] r.VSync=1, for the opposite reason). r.VSync=0 ; --- no FPS cap ------------------------------------------------------------- ; t.MaxFPS <= 0 means uncapped (Runtime/Engine/Private/UnrealEngine.cpp, default ; is already 0 - set explicitly so no stray value can re-introduce a cap). t.MaxFPS=0