[Bug 49564] Tomb Raider I (using DosBox) hangs after starting

WineHQ Bugzilla wine-bugs at winehq.org
Sun Aug 9 03:02:12 CDT 2020


https://bugs.winehq.org/show_bug.cgi?id=49564

--- Comment #4 from qsniyg <qsniyg at mail.com> ---
(In reply to Arek Hiler from comment #3)
> So I have tried:
> -static const int user_shared_data_timeout = 16;
> +static const int user_shared_data_timeout = 15;
> 
> Sadly, the game sill crashes. My current guess is that dosbox.exe doesn't
> like very unstable deltas between ticks, which we have now because we update
> timestamps at "random" intervals - on each server request. I am yet to
> verify that

The issue with dosbox is that it sleeps for one millisecond, then expects that
GetTickCount will be incremented. I submitted a test for this here:
https://github.com/wine-mirror/wine/commit/4617f83fcf0a34fe41b0e38dde1567195395efca

It's supposed to have a near-100% increment rate, but now it has a 6% increment
rate instead (which makes sense, 100/16 = 6.25). So it seems like Sleep()ing
somehow signals to windows that it should update the tick count, even if it's
below the 15-16ms resolution?

I'm not sure about Doom II, but Tomb Raider has the source code for its patched
dosbox included with the release. This is the relevant section (in dosbox.cpp):


static Bitu Normal_Loop(void) {
--- snip ---
        Bit32u ticksNew;
        ticksNew=GetTicks();
        ticksScheduled += ticksAdded;
        if (ticksNew > ticksLast) {
            ticksRemain = ticksNew-ticksLast;
            ticksLast = ticksNew;
            ticksDone += ticksRemain;
            if ( ticksRemain > 20 ) {
                ticksRemain = 20;
            }
            ticksAdded = ticksRemain;
--- snip ---
        } else {
            ticksAdded = 0;
            SDL_Delay(1); // <--
            ticksDone -= GetTicks() - ticksNew; // <--
            if (ticksDone < 0)
                ticksDone = 0;
        }

This means ticksDone will very rarely decrement in the else block. From a quick
glance at the surrounding code, I wasn't able to really figure out what the
result of this meant, but it works properly when GetTicks() is incremented
after sleeping for a millisecond.

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list