From 3749141fee842b897627b003f88aab9efc9bc021 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 28 Dec 2020 01:08:25 +0100 Subject: [PATCH] Add some special early output when the position changes. --- config.pm | 1 + remoteglot.pl | 34 ++++++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/config.pm b/config.pm index 44ed56b..7f7e23c 100644 --- a/config.pm +++ b/config.pm @@ -58,6 +58,7 @@ our %engine2_config = ( our $engine2_grpc_backend = undef; # Not used by us, but will be communicated to serve-analysis.js. our $update_max_interval = 1.0; +our $update_force_after_move = 0.2; our @masters = ( 'Sesse', ); diff --git a/remoteglot.pl b/remoteglot.pl index 9d611c0..455d730 100755 --- a/remoteglot.pl +++ b/remoteglot.pl @@ -76,6 +76,10 @@ my $last_move; my $last_text = ''; my ($pos_calculating, $pos_calculating_second_engine); +# If not undef, we've started calculating this position but haven't ever given out +# any analysis for it, so we're on a forced timer to do so. +my $pos_calculating_started = undef; + setoptions($engine, \%remoteglotconf::engine_config); uciprint($engine, "ucinewgame"); @@ -388,12 +392,22 @@ sub handle_position { # the position.) # # Do not output anything new to the main analysis; that's - # going to be obsolete really soon. + # going to be obsolete really soon. (Exception: If we've never + # output anything for this move, ie., it didn't hit the 200ms + # limit, spit it out to the user anyway. It's probably a really + # fast blitz game or something, and it's good to show the moves + # as they come in even without great analysis.) $pos_calculating->{'white_clock'} = $pos->{'white_clock'}; $pos_calculating->{'black_clock'} = $pos->{'black_clock'}; delete $pos_calculating->{'white_clock_target'}; delete $pos_calculating->{'black_clock_target'}; - output_json(1); + + if (defined($pos_calculating_started)) { + output_json(0); + } else { + output_json(1); + } + $pos_calculating_started = [Time::HiRes::gettimeofday]; # Ask the engine to stop; we will throw away its data until it # sends us "bestmove", signaling the end of it. @@ -411,6 +425,7 @@ sub handle_position { uciprint($engine, "position fen " . $pos->fen()); uciprint($engine, "go infinite"); $pos_calculating = $pos; + $pos_calculating_started = [Time::HiRes::gettimeofday]; if (defined($engine2)) { if (defined($pos_calculating_second_engine)) { @@ -634,15 +649,22 @@ sub output { return if (!defined($pos_calculating)); # Don't update too often. - my $age = Time::HiRes::tv_interval($latest_update); - if ($age < $remoteglotconf::update_max_interval) { - my $wait = $remoteglotconf::update_max_interval + 0.01 - $age; - $output_timer = AnyEvent->timer(after => $wait, cb => \&output); + my $wait = $remoteglotconf::update_max_interval - Time::HiRes::tv_interval($latest_update); + my $new_pos_wait = defined($pos_calculating_started) ? + $remoteglotconf::update_force_after_move - Time::HiRes::tv_interval($pos_calculating_started) + : 10000.0; + $wait = $new_pos_wait if ($new_pos_wait < $wait); + if ($wait > 0.0) { + $output_timer = AnyEvent->timer(after => $wait + 0.01, cb => \&output); return; } my $info = $engine->{'info'}; + # We're outputting something for this position now, so the special handling + # for new positions is off. + undef $pos_calculating_started; + # # If we have tablebase data from a previous lookup, replace the # engine data with the data from the tablebase. -- 2.39.2