@@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
33
33
#include " gamedef.h"
34
34
#include " sound.h"
35
35
#include " event.h"
36
+ #include " profiler.h"
36
37
#include " util/numeric.h"
37
38
#include " util/mathconstants.h"
38
39
@@ -57,10 +58,10 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
57
58
m_fov_x(1.0 ),
58
59
m_fov_y(1.0 ),
59
60
60
- m_added_frametime (0 ),
61
+ m_added_busytime (0 ),
61
62
m_added_frames(0 ),
62
63
m_range_old(0 ),
63
- m_frametime_old (0 ),
64
+ m_busytime_old (0 ),
64
65
m_frametime_counter(0 ),
65
66
m_time_per_range(30 . / 50 ), // a sane default of 30ms per 50 nodes of range
66
67
@@ -242,8 +243,8 @@ void Camera::step(f32 dtime)
242
243
}
243
244
}
244
245
245
- void Camera::update (LocalPlayer* player, f32 frametime, v2u32 screensize ,
246
- f32 tool_reload_ratio)
246
+ void Camera::update (LocalPlayer* player, f32 frametime, f32 busytime ,
247
+ v2u32 screensize, f32 tool_reload_ratio)
247
248
{
248
249
// Get player position
249
250
// Smooth the movement when walking up stairs
@@ -416,7 +417,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, v2u32 screensize,
416
417
m_wieldlight = player->light ;
417
418
418
419
// Render distance feedback loop
419
- updateViewingRange (frametime);
420
+ updateViewingRange (frametime, busytime );
420
421
421
422
// If the player seems to be walking on solid ground,
422
423
// view bobbing is enabled and free_move is off,
@@ -440,23 +441,22 @@ void Camera::update(LocalPlayer* player, f32 frametime, v2u32 screensize,
440
441
}
441
442
}
442
443
443
- void Camera::updateViewingRange (f32 frametime_in)
444
+ void Camera::updateViewingRange (f32 frametime_in, f32 busytime_in )
444
445
{
445
446
if (m_draw_control.range_all )
446
447
return ;
447
448
448
- m_added_frametime += frametime_in ;
449
+ m_added_busytime += busytime_in ;
449
450
m_added_frames += 1 ;
450
451
451
- // Actually this counter kind of sucks because frametime is busytime
452
452
m_frametime_counter -= frametime_in;
453
453
if (m_frametime_counter > 0 )
454
454
return ;
455
- m_frametime_counter = 0.2 ;
455
+ m_frametime_counter = 0.2 ; // Same as ClientMap::updateDrawList interval
456
456
457
457
/* dstream<<__FUNCTION_NAME
458
458
<<": Collected "<<m_added_frames<<" frames, total of "
459
- <<m_added_frametime <<"s."<<std::endl;
459
+ <<m_added_busytime <<"s."<<std::endl;
460
460
461
461
dstream<<"m_draw_control.blocks_drawn="
462
462
<<m_draw_control.blocks_drawn
@@ -466,7 +466,7 @@ void Camera::updateViewingRange(f32 frametime_in)
466
466
467
467
// Get current viewing range and FPS settings
468
468
f32 viewing_range_min = g_settings->getS16 (" viewing_range_nodes_min" );
469
- viewing_range_min = MYMAX (5 .0 , viewing_range_min);
469
+ viewing_range_min = MYMAX (15 .0 , viewing_range_min);
470
470
471
471
f32 viewing_range_max = g_settings->getS16 (" viewing_range_nodes_max" );
472
472
viewing_range_max = MYMAX (viewing_range_min, viewing_range_max);
@@ -503,17 +503,17 @@ void Camera::updateViewingRange(f32 frametime_in)
503
503
504
504
// Calculate the average frametime in the case that all wanted
505
505
// blocks had been drawn
506
- f32 frametime = m_added_frametime / m_added_frames / block_draw_ratio;
506
+ f32 frametime = m_added_busytime / m_added_frames / block_draw_ratio;
507
507
508
- m_added_frametime = 0.0 ;
508
+ m_added_busytime = 0.0 ;
509
509
m_added_frames = 0 ;
510
510
511
511
f32 wanted_frametime_change = wanted_frametime - frametime;
512
512
// dstream<<"wanted_frametime_change="<<wanted_frametime_change<<std::endl;
513
+ g_profiler->avg (" wanted_frametime_change" , wanted_frametime_change);
513
514
514
515
// If needed frametime change is small, just return
515
516
// This value was 0.4 for many months until 2011-10-18 by c55;
516
- // Let's see how this works out.
517
517
if (fabs (wanted_frametime_change) < wanted_frametime*0.33 )
518
518
{
519
519
// dstream<<"ignoring small wanted_frametime_change"<<std::endl;
@@ -524,22 +524,24 @@ void Camera::updateViewingRange(f32 frametime_in)
524
524
f32 new_range = range;
525
525
526
526
f32 d_range = range - m_range_old;
527
- f32 d_frametime = frametime - m_frametime_old ;
527
+ f32 d_busytime = busytime_in - m_busytime_old ;
528
528
if (d_range != 0 )
529
529
{
530
- m_time_per_range = d_frametime / d_range;
530
+ m_time_per_range = d_busytime / d_range;
531
531
}
532
+ // dstream<<"time_per_range="<<m_time_per_range<<std::endl;
533
+ g_profiler->avg (" time_per_range" , m_time_per_range);
532
534
533
535
// The minimum allowed calculated frametime-range derivative:
534
536
// Practically this sets the maximum speed of changing the range.
535
537
// The lower this value, the higher the maximum changing speed.
536
538
// A low value here results in wobbly range (0.001)
539
+ // A low value can cause oscillation in very nonlinear time/range curves.
537
540
// A high value here results in slow changing range (0.0025)
538
541
// SUGG: This could be dynamically adjusted so that when
539
542
// the camera is turning, this is lower
540
- // f32 min_time_per_range = 0.0015;
541
- f32 min_time_per_range = 0.0010 ;
542
- // f32 min_time_per_range = 0.05 / range;
543
+ // f32 min_time_per_range = 0.0010; // Up to 0.4.7
544
+ f32 min_time_per_range = 0.0005 ;
543
545
if (m_time_per_range < min_time_per_range)
544
546
{
545
547
m_time_per_range = min_time_per_range;
@@ -572,10 +574,10 @@ void Camera::updateViewingRange(f32 frametime_in)
572
574
/* dstream<<"new_range="<<new_range_unclamped
573
575
<<", clamped to "<<new_range<<std::endl;*/
574
576
575
- m_draw_control.wanted_range = new_range;
577
+ m_range_old = m_draw_control.wanted_range ;
578
+ m_busytime_old = busytime_in;
576
579
577
- m_range_old = new_range;
578
- m_frametime_old = frametime;
580
+ m_draw_control.wanted_range = new_range;
579
581
}
580
582
581
583
void Camera::setDigging (s32 button)
0 commit comments