49{
51 {
52 SCOPE_CYCLE_COUNTER(STAT_OptimizationThreadTick);
54 APlayerCameraManager* PlayerCamera = UGameplayStatics::GetPlayerCameraManager(
GameWorld, 0);
55 APlayerController* PlayerController = UGameplayStatics::GetPlayerController(
GameWorld, 0);
56 APawn* PlayerPawn = PlayerController ? PlayerController->GetPawn() : nullptr;
57
58 SET_DWORD_STAT(STAT_NPC_Count, 0);
59 SET_DWORD_STAT(STAT_InvisibleCount, 0);
60 SET_DWORD_STAT(STAT_NoOptimizedCount, 0);
61 SET_DWORD_STAT(Stat_FirstWaveCount, 0);
62 SET_DWORD_STAT(Stat_SecondWaveCount, 0);
63 SET_DWORD_STAT(Stat_ThirdWaveCount, 0);
64
65 const float FOV =
CVarMaxFOV.GetValueOnAnyThread();
66
67
69 {
70 SCOPE_CYCLE_COUNTER(STAT_OptimizationComponentsTick);
71
73 uint32 OptimizedCount = 0;
74
76 {
77 if (!IsValid(it))
78 continue;
79
81
82 INC_DWORD_STAT(STAT_NPC_Count);
83
84
85 {
86 switch (CurrentWave)
87 {
88 case EOptimizationWave::Invisible:
89 INC_DWORD_STAT(STAT_InvisibleCount);
90 break;
91 case EOptimizationWave::NoOptimization:
92 INC_DWORD_STAT(STAT_NoOptimizedCount);
93 break;
94 case EOptimizationWave::FirstWave:
95 INC_DWORD_STAT(Stat_FirstWaveCount);
96 break;
97 case EOptimizationWave::SecondWave:
98 INC_DWORD_STAT(Stat_SecondWaveCount);
99 break;
100 case EOptimizationWave::ThirdWave:
101 INC_DWORD_STAT(Stat_ThirdWaveCount);
102 break;
103 }
104 }
105
106 if (it->IsNeedToBeOptimized())
107 continue;
108
109 if (OptimizedCount >= MaxOptimizedInOneFrame)
110 break;
111
112 const bool IsVisible = it->IgnoreCameraSight ? true :
IsInCameraSight(PlayerCamera, PlayerPawn, it, FOV);
114
115 if (CurrentWave != NewWave && !it->IsForceOptimizationWaveEnabled())
116 {
117 it->SetOptimizationWave(NewWave);
118 it->SetIsNeedToBeOptimized(true);
119
120 OptimizedCount++;
121 }
122 }
123 }
125
126 FPlatformProcess::Sleep(0.01f);
127 }
128
129 return 0;
130}
EOptimizationWave
Definition NPC_Optimizator_Types.h:12
static TAutoConsoleVariable< float > CVarMaxFOV(TEXT("npc.optimizator.fov"), 90.f, TEXT("Camera FOV for checking NPCs in frame\n"), ECVF_Scalability)
static TAutoConsoleVariable< int32 > CVarMaxOptimizationOnOneFrame(TEXT("npc.optimizator.MaxOptimizedOnOneFrame"), 15, TEXT("How many NPC can be optimizated in one frame\n"), ECVF_Scalability)
static bool IsInCameraSight(const APlayerCameraManager *Camera, const APawn *LocalPlayer, IOptimizationProxy *Proxy, float InFOV)
Definition OptimizationManager.cpp:205
static EOptimizationWave GetOptimizationWave(const APawn *LocalPlayer, const APlayerCameraManager *Camera, IOptimizationProxy *Proxy, bool IsVisible)
Definition OptimizationManager.cpp:236