[FIRE-31472] Allow some stats to be maintained when frame limiting.

meow-7.2.2
Beq 2022-05-16 14:21:24 +01:00
parent 30137a2ce8
commit f1d4262ec1
2 changed files with 57 additions and 43 deletions

View File

@ -306,20 +306,11 @@ void FSFloaterPerformance::draw()
pct_swap_time = llclamp(pct_swap_time,0.,100.);
pct_scene_render_time = llclamp(pct_scene_render_time,0.,100.);
args["AV_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_avatar_time));
args["HUDS_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_huds_time));
args["UI_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_ui_time));
args["IDLE_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_idle_time));
args["SWAP_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_swap_time));
args["SCENERY_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_scene_render_time));
// update the top line status - also check whether we're sleeping/limiting
args["TOT_FRAME_TIME"] = llformat("%02u", (U32)llround(tot_frame_time_ns/1000000));
args["FPSCAP"] = llformat("%02u", (U32)fpsCap);
args["FPSTARGET"] = llformat("%02u", (U32)targetFPS);
getChild<LLTextBox>("av_frame_stats")->setText(getString("av_frame_pct", args));
getChild<LLTextBox>("huds_frame_stats")->setText(getString("huds_frame_pct", args));
getChild<LLTextBox>("frame_breakdown")->setText(getString("frame_stats", args));
auto textbox = getChild<LLTextBox>("fps_warning");
if (tot_sleep_time_raw > 0) // We are sleeping because view is not focussed
{
@ -345,7 +336,30 @@ void FSFloaterPerformance::draw()
{
textbox->setVisible(false);
}
// pre-fill the args
if(!unreliable)
{
args["AV_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_avatar_time));
args["HUDS_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_huds_time));
args["UI_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_ui_time));
args["IDLE_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_idle_time));
args["SWAP_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_swap_time));
args["SCENERY_FRAME_PCT"] = llformat("%02u", (U32)llround(pct_scene_render_time));
}
else
{
args["AV_FRAME_PCT"] = "--";
args["HUDS_FRAME_PCT"] = "--";
args["UI_FRAME_PCT"] = "--";
args["IDLE_FRAME_PCT"] = "--";
args["SWAP_FRAME_PCT"] = "--";
args["SCENERY_FRAME_PCT"] = "--";
}
getChild<LLTextBox>("av_frame_stats")->setText(getString("av_frame_pct", args));
getChild<LLTextBox>("huds_frame_stats")->setText(getString("huds_frame_pct", args));
getChild<LLTextBox>("frame_breakdown")->setText(getString("frame_stats", args));
auto button = getChild<LLButton>("AutoTuneFPS");
if((bool)button->getToggleState() != FSPerfStats::tunables.userAutoTuneEnabled)
{

View File

@ -186,39 +186,39 @@ namespace FSPerfStats
sceneStats[static_cast<size_t>(statEntry)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS);
// LL_INFOS("scenestats") << "Scenestat: " << static_cast<size_t>(statEntry) << " before=" << avg << " new=" << val << " newavg=" << statsDoubleBuffer[writeBuffer][static_cast<size_t>(ObjType_t::OT_GENERAL)][LLUUID::null][static_cast<size_t>(statEntry)] << LL_ENDL;
}
auto& statsMap = statsDoubleBuffer[writeBuffer][static_cast<size_t>(ObjType_t::OT_ATTACHMENT)];
for(auto& stat_entry : statsMap)
{
auto val = stat_entry.second[static_cast<size_t>(ST::RENDER_COMBINED)];
if(val > SMOOTHING_PERIODS){
auto avg = statsDoubleBuffer[writeBuffer ^ 1][static_cast<size_t>(ObjType_t::OT_ATTACHMENT)][stat_entry.first][static_cast<size_t>(ST::RENDER_COMBINED)];
stat_entry.second[static_cast<size_t>(ST::RENDER_COMBINED)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS);
}
}
auto& statsMapAv = statsDoubleBuffer[writeBuffer][static_cast<size_t>(ObjType_t::OT_AVATAR)];
for(auto& stat_entry : statsMapAv)
{
for(auto& stat : avatarStatsToAvg)
{
auto val = stat_entry.second[static_cast<size_t>(stat)];
if(val > SMOOTHING_PERIODS)
{
auto avg = statsDoubleBuffer[writeBuffer ^ 1][static_cast<size_t>(ObjType_t::OT_AVATAR)][stat_entry.first][static_cast<size_t>(stat)];
stat_entry.second[static_cast<size_t>(stat)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS);
}
}
}
// swap the buffers
if(enabled())
{
std::lock_guard<std::mutex> lock{bufferToggleLock};
writeBuffer ^= 1;
}; // note we are relying on atomic updates here. The risk is low and would cause minor errors in the stats display.
}
// Allow attachment times etc to update even when FPS limited or sleeping.
auto& statsMap = statsDoubleBuffer[writeBuffer][static_cast<size_t>(ObjType_t::OT_ATTACHMENT)];
for(auto& stat_entry : statsMap)
{
auto val = stat_entry.second[static_cast<size_t>(ST::RENDER_COMBINED)];
if(val > SMOOTHING_PERIODS){
auto avg = statsDoubleBuffer[writeBuffer ^ 1][static_cast<size_t>(ObjType_t::OT_ATTACHMENT)][stat_entry.first][static_cast<size_t>(ST::RENDER_COMBINED)];
stat_entry.second[static_cast<size_t>(ST::RENDER_COMBINED)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS);
}
}
auto& statsMapAv = statsDoubleBuffer[writeBuffer][static_cast<size_t>(ObjType_t::OT_AVATAR)];
for(auto& stat_entry : statsMapAv)
{
for(auto& stat : avatarStatsToAvg)
{
auto val = stat_entry.second[static_cast<size_t>(stat)];
if(val > SMOOTHING_PERIODS)
{
auto avg = statsDoubleBuffer[writeBuffer ^ 1][static_cast<size_t>(ObjType_t::OT_AVATAR)][stat_entry.first][static_cast<size_t>(stat)];
stat_entry.second[static_cast<size_t>(stat)] = avg + (val / SMOOTHING_PERIODS) - (avg / SMOOTHING_PERIODS);
}
}
}
// swap the buffers
if(enabled())
{
std::lock_guard<std::mutex> lock{bufferToggleLock};
writeBuffer ^= 1;
}; // note we are relying on atomic updates here. The risk is low and would cause minor errors in the stats display.
// clean the write maps in all cases.
auto& statsTypeMatrix = statsDoubleBuffer[writeBuffer];