http://bugs.winehq.org/show_bug.cgi?id=30127
Bug #: 30127 Summary: Perfect World: Noticeable keyboard input lag happens at certain circumstances Product: Wine Version: 1.3.34 Platform: x86 URL: http://pwi.perfectworld.com/ OS/Version: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: user32 AssignedTo: wine-bugs@winehq.org ReportedBy: mooroon2@mail.ru CC: julliard@winehq.org Classification: Unclassified Regression SHA1: cb3b7237925a24ba4c5696dd079fdc5d99a48577
Created attachment 39286 --> http://bugs.winehq.org/attachment.cgi?id=39286 Patch to disable wined3d usage of EXT_swap_control extension.
------------------------ Here are bisect results: ------------------------
[lexa2@lx2linux build]$ cd /misc/Raid5/Projects/Wine/wine-git/; git reset --hard ; git bisect good HEAD is now at 5a30e31 server: Optionally return the global key state when queueing a hardware message. cb3b7237925a24ba4c5696dd079fdc5d99a48577 is the first bad commit commit cb3b7237925a24ba4c5696dd079fdc5d99a48577 Author: Alexandre Julliard julliard@winehq.org Date: Thu Dec 15 14:30:41 2011 +0100
user32: Cache the global key state to avoid performance issues in applications that poll constantly.
:040000 040000 6fc9980517e631c9e7145313c1634713a36b11f4 dbc782b9be4295845ba663e5830b8114a67b290c M dlls
System specs: 32bit linux kernel 2.6.38.8-32.i686.PAE, AMD Phenom II x4 955, nVIDIA GeForce GTX 550 Ti with 1Gb VRAM, nVIDIA binary drivers v.295.17.
----------------- How to reproduce: ----------------- This bug is a pretty hard to catch as there's one requirement for it to show itself up in this game: FPS should be sufficiently high and thus vsync should be turned off. The game is buggy per itself as it always requests WINED3DPRESENT_INTERVAL_DEFAULT when being run in window, and it behaves somewhat unstable when run in fullscreen mode (window contents stuck without redrawing after a while), so one would have to force-disable VSYNC which isn't easily possible with current nVIDIA linux drivers and/or Wine. Personally I use a simple patch which prevents Wine from calling EXT_swap_control and thus allows me to control vsync using nVIDIA driver control panel. I would attach this patch to this bug report in a few minutes.
There's another bug that affects FPS in this game heavily, which is major slowdown in case wined3d utilizes ARB_map_buffer_rage. This usage had been enabled by commit 68b15bc5f, so I have to revert that commit with another simple patch (or by using "git show 68b15bc5f | git apply -R --").
Having vsync and ARB_map_buffer_rage usage disabled one may proceed with starting up the game and heading towards some location where FPS isn't too low (35+ will do, the more - the better). Easiest way to check current fps is to use "+fps" debug channel.
As soon as game character is at the place where fps is 35+ - try to move the character around by using "WASD" keys. You would notice that about half of short presses (i.e. quickly tap "A" or "D" key, do not hold it pressed for a prolonged time) are merely lost, and game reactions to actions like "press and hold A key" might be delayed for as much as about a second (maybe slightly less, I'm writing "about a second" basing on personal feel and human senses aren't that exact).
Then, exit the game, revert commit cb3b7237, recompile Wine and start the game up again. Proceed with the testing procedure described in the paragraph above and you would notice that the lag had gone.
From inspecting the commit cb3b7237 contents it looks like that input lag
should be somewhat expected with this patch in place, but is shouldn't be larger than 50 ticks - which is not the case obviously, because 50 ticks are not something that "feels like about a second". On the other hand, I'm not that good in knowing all the inside chemistry of Wine's user32 implementation when it comes to handling keyboard input so I might just be misinterpreting the commit contents.
Another moment to note: when the bug is in place (i.e. running the game with non-reverted commit cb3b7237 and at a place where FPS is 35+) there's and easy way to "somewhat workaround" keyboard input lag. All you have to do is to press and hold right mouse button - and there would be no more keyboard input lag. Just in case you don't figure it out: click-n-holding RMB is used in game to change to viewing angle, and the angle changes with the mouse movement while you hold RMB.
P.S. There's another bug in wined3d blt implementation affecting this game, about which I had posted another bug report #30115. Patch that fixes blt implementation for this game had been attached to that bug report, but it is not required/relevant for reproducing input lag bug. OTOH one may wish to use that patch also so the in-game icons would be displayed properly making testing easier.