X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=remoteglot.pl;h=455d73066d56a24c41f2636ccb799f7a23b16262;hb=3749141fee842b897627b003f88aab9efc9bc021;hp=9d611c0e6cfe2700cc0f8a5118f36b2e318b72fa;hpb=09d3665b67729593880a9baba48e723f592b3bf3;p=remoteglot 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.