@@ -230,6 +230,15 @@ GameLODManager::GameLODManager(void)
230230 m_compositeBenchIndex=0 ;
231231 m_numBenchProfiles=0 ;
232232 m_reallyLowMHz = 400 ;
233+ #if defined(GENERALS_ONLINE_HIGH_FPS_SERVER)
234+ m_userGraphSnapshotTaken = false ;
235+ m_userShadowVolumesEnabled = true ;
236+ m_userShadowDecalsEnabled = true ;
237+ m_userHeatEffectsEnabled = true ;
238+ m_isQualityReduced = false ;
239+ m_sustainedGoodFrames = 0 ;
240+ m_userDynamicLOD = DYNAMIC_GAME_LOD_VERY_HIGH ;
241+ #endif
233242
234243 for (Int i=0 ; i<STATIC_GAME_LOD_CUSTOM ; i++)
235244 m_numLevelPresets[i]=0 ;
@@ -394,6 +403,10 @@ void GameLODManager::init(void)
394403 }
395404
396405 setStaticLODLevel (userSetDetail);
406+ #if defined(GENERALS_ONLINE_HIGH_FPS_SERVER)
407+ m_dynamicGameLODInfo[DYNAMIC_GAME_LOD_LOW ].m_minFPS = 56 ;
408+ m_dynamicGameLODInfo[DYNAMIC_GAME_LOD_LOW ].m_minDynamicParticlePriority = ALWAYS_RENDER ;
409+ #endif
397410}
398411
399412void GameLODManager::refreshCustomStaticLODLevel (void )
@@ -767,3 +780,70 @@ Bool GameLODManager::didMemPass( void )
767780{
768781 return m_memPassed;
769782}
783+
784+ #if defined(GENERALS_ONLINE_HIGH_FPS_SERVER)
785+ void GameLODManager::updateGraphicsQualityState (float averageFPS)
786+ {
787+ if (!m_userGraphSnapshotTaken)
788+ {
789+ m_userShadowVolumesEnabled = TheGlobalData->m_useShadowVolumes ;
790+ m_userShadowDecalsEnabled = TheGlobalData->m_useShadowDecals ;
791+ m_userHeatEffectsEnabled = TheGlobalData->m_useHeatEffects ;
792+ m_userDynamicLOD = m_currentDynamicLOD;
793+ m_userGraphSnapshotTaken = true ;
794+ }
795+
796+ if (m_isQualityReduced && TheGameClient && TheGameClient->getFrame () <= 1 )
797+ {
798+ TheWritableGlobalData->m_useShadowVolumes = m_userShadowVolumesEnabled;
799+ TheWritableGlobalData->m_useShadowDecals = m_userShadowDecalsEnabled;
800+ TheWritableGlobalData->m_useHeatEffects = m_userHeatEffectsEnabled;
801+ setDynamicLODLevel (m_userDynamicLOD);
802+ if (TheGameClient)
803+ TheGameClient->allocateShadows ();
804+ m_isQualityReduced = false ;
805+ m_sustainedGoodFrames = 0 ;
806+ }
807+
808+ if (!m_isQualityReduced)
809+ {
810+ m_userShadowVolumesEnabled = TheGlobalData->m_useShadowVolumes ;
811+ m_userShadowDecalsEnabled = TheGlobalData->m_useShadowDecals ;
812+ m_userHeatEffectsEnabled = TheGlobalData->m_useHeatEffects ;
813+ m_userDynamicLOD = m_currentDynamicLOD;
814+ }
815+
816+ m_sustainedGoodFrames = (averageFPS >= 58 .0f ) ? (m_sustainedGoodFrames + 1 ) : 0 ; // Track a duration of sustained good performance
817+
818+ bool shouldReduceQuality = (averageFPS < 56 .0f && TheGameClient && TheGameClient->getFrame () > LOGICFRAMES_PER_SECOND * 10 );
819+ if (shouldReduceQuality && !m_isQualityReduced)
820+ {
821+ setDynamicLODLevel (DYNAMIC_GAME_LOD_LOW );
822+ TheGameClient->releaseShadows ();
823+ TheWritableGlobalData->m_useShadowVolumes = false ;
824+ TheWritableGlobalData->m_useShadowDecals = false ;
825+ TheWritableGlobalData->m_useHeatEffects = false ;
826+ m_isQualityReduced = true ;
827+ }
828+
829+ // Restore to user preferences after sustained good performance
830+ else if (!shouldReduceQuality && m_isQualityReduced)
831+ {
832+ if (m_sustainedGoodFrames > 300 )
833+ {
834+ TheWritableGlobalData->m_useShadowVolumes = m_userShadowVolumesEnabled;
835+ TheWritableGlobalData->m_useShadowDecals = m_userShadowDecalsEnabled;
836+ TheWritableGlobalData->m_useHeatEffects = m_userHeatEffectsEnabled;
837+
838+ if (TheGameClient)
839+ TheGameClient->allocateShadows ();
840+
841+ DynamicGameLODLevel lod = TheGameLODManager->findDynamicLODLevel (averageFPS);
842+ TheGameLODManager->setDynamicLODLevel (lod);
843+
844+ m_isQualityReduced = false ;
845+ m_sustainedGoodFrames = 0 ;
846+ }
847+ }
848+ }
849+ #endif // GENERALS_ONLINE_HIGH_FPS_SERVER
0 commit comments