Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Hry

Oprava propadu snímků při rychlé myši vyšla v Godotu 4.7.2 po čtyřech letech

Herní engine Godot přijal úpravu, po které pohyb myší nesrazí počet snímků za sekundu tak jako dřív. Hlášení o té chybě je z dubna 2022 a zavřelo ho až začlenění 24. července 2026; ve stabilní řadě je úprava od údržbového vydání 4.7.2 z 18. srpna. Vinu nese způsob, jakým si program vybírá zprávy z fronty Windows.

· aktualizováno 1. 9. 2026 · 198 zhlédnutí

Černá bezdrátová herní myš vedle malého přijímače do USB
Bezdrátová herní myš Logitech G903 Lightspeed s přijímačem do USB. Foto: Jacek Halicki, Wikimedia Commons (CC BY-SA 4.0)

Šedesát snímků, dokud se nehne myší

Hlášení #60646 podal 30. dubna 2022 uživatel vystupující jako Thoughtquake. Na Godotu 3.4.2 a Windows 10 si sestavil co nejjednodušší projekt: jeden sprite, který jede za kurzorem, a popisek s počtem snímků za sekundu. Se zapnutou synchronizací na obnovovací frekvenci monitoru mu projekt běžel na 60 snímcích. Jakmile začal rychle kroužit myší, spadl počet snímků výrazně, občas až pod 30. S vypnutou synchronizací měl přes tisíc snímků a pohyb myší mu nevadil.

Nejpodivnější byl třetí poznatek: když v editoru zapnul profiler, tedy nástroj, který měří, kolik času zabere která část snímku, propad zmizel. Měření program obvykle zpomalí, ne zrychlí. Na macOS ani na Linuxu autor hlášení nic takového nepozoroval. Diskuse pod hlášením narostla na 57 příspěvků a správci k němu časem připsali klíčová slova „8khz“ a „8000 hz“, aby ho lidé s rychlými myšmi vůbec našli.

Windows posílají pohyb myši dvakrát

Kořen problému nemá s Godotem nic společného a popsal ho v září 2024 Peter „Durante“ Thoman ze studia PH3 Games, které se živí porty her na PC. Windows nabízejí dvě cesty, jak se k pohybu myši dostat. Ta starší jsou obyčejné zprávy okna: systém do nich promítne zrychlení kurzoru a nedá přesnost pod jeden pixel, takže na míření ve hře se nehodí. Novější cesta je raw input, tedy surová data přímo ze zařízení.

Háček je v tom, že když si program raw input zaregistruje a nepožádá výslovně o potlačení té staré cesty, chodí mu obojí. Fronta zpráv se pak u myši s vysokou vzorkovací frekvencí, anglicky polling rate, zaplní zprávami, které nikdo nečte. Thoman to změřil na hře držící strop kolem 360 snímků: při rázném třesení myší s frekvencí 8 000 Hz spadla na zhruba 133 snímků a doba mezi snímky přestala být vyrovnaná. Ze stejného důvodu se podle něj s dražšími myšmi rozbíjejí i velké komerční hry.

Godot k tomu přidával vlastní podíl. Zprávy raw inputu si vybíral z fronty po jedné, voláním PeekMessage, a přesně tohle podle komentáře v novém kódu srazí obsluhu zpráv od zhruba 2 000 Hz. Zprávy o pohybu kurzoru navíc systém dodává tak hustě, že fronta při pohybu myší nikdy nedojde na konec a smyčka se točí, dokud hráč myš nepoloží.

Napřed celá dávka, teprve pak zbytek fronty

Úpravu #109639 napsal Hugo Locurcio, spolupracovali na ní Pāvels Nadtočajevs a Jon Tamayo. Postup odpovídá tomu, co doporučuje Thomanův text. Ještě než se rozeběhne obsluha zpráv, vysype nová funkce celou frontu surového vstupu naráz voláním GetRawInputBuffer. Obsluha pak z fronty bere všechno kromě raw inputu a zprávy o pohybu kurzoru pouští dál nejvýš jednou za snímek. Nic se neztratí: nesou poslední známou polohu a relativní pohyb se dopočítá z rozdílu dvou poloh za sebou.

Surová fronta se přitom vybírá až do prázdna, ne po pevných dávkách. Kdyby se v jednom průchodu bral jen malý počet zpráv, po delším zadrhnutí by se náskok nedohnal, protože fronta ve Windows pojme deset tisíc zpráv. Zbytek, tedy klávesy, znaky, tlačítka a kolečko, se vybírá do posledního kusu. Komentář v kódu u toho vysvětluje proč: kdyby se omezily i ony, oddělila by se zpráva o znaku od zprávy o stisku klávesy do jiného snímku, engine by je přestal párovat a klávesy by se hlásily dvakrát.

Třetí soubor v úpravě se pohybu myši netýká vůbec. Přibylo v něm volání DisableProcessWindowsGhosting, kterým program systému zakáže nahradit vlastní okno takzvaným duchem ve chvíli, kdy hlavní vlákno na okamžik zamrzne. Ten náhradník spolkne kliknutí, kterým se uživatel do okna vrací, editor pak nedostane zprávu o získání zaměření a zůstane natrvalo v úsporném režimu pro okna v pozadí. Dohromady je to 266 přidaných a 91 odebraných řádků ve třech souborech.

Ve stabilní řadě to zatím není

Úprava byla otevřená od 15. srpna 2025 a začleněná 24. července 2026, tedy skoro rok. Sešlo se pod ní čtyřiadvacet příspěvků a autor v ní opakovaně žádal o vyzkoušení na různých sestavách, se zapnutou i vypnutou synchronizací a s grafickým tabletem. Veřejně ji vývojáři ohlásili 7. srpna 2026 ve vývojovém snímku Godotu 4.8 dev 3, do kterého 91 přispěvatelů poslalo 176 oprav.

K hráčům se ale jen tak nedostane. Řada 4.8 v době ohlášení neměla ani uzávěrku nových funkcí, ta měla podle blogu enginu přijít nejdřív o měsíc později. Stabilní je zatím řada 4.7, jejíž údržbová verze 4.7.2 dostala 3. srpna 2026 první kandidátskou verzi, a oprava je zařazená do milníku 4.8 bez štítku pro přenesení do starší řady.

Pohyb myší stojí snímky pořád, jen míň. Autor uvádí měření z vlastní sestavy s bezdrátovou myší s frekvencí 8 000 Hz a monitorem s obnovovací frekvencí 480 Hz: testovací projekt s vypnutou synchronizací běžel na 3 735 snímcích za sekundu, dokud myš stála, a na 902 až 1 604 snímcích podle režimu myši, když s ní hýbal, jak nejrychleji dokázal. Otevřená zůstala i drobnost: v režimu se zachycenou myší problikne kurzor na jeden snímek, když hráč při pohybu klikne nebo zatočí kolečkem. Měření z června 2026 ukázalo, že se to děje i bez úpravy, jen se to hůř vyvolá, takže se to vyhodnotilo jako neškodné.

Hugo Locurcio k opravě slíbil samostatný text s podrobným rozborem. Do té doby zůstává nejbližším popisem mechanismu Thomanův článek z roku 2024, na který odkazuje i komentář ve zdrojovém kódu Godotu.

Doplněno 30. srpna 2026

Původní znění tohohle článku psalo, že úprava míří do Godotu 4.8. Ve vývojové větvi zůstala, ale správci ji zároveň zařadili do údržbového vydání 4.7.2, které vyšlo 18. srpna 2026. Jeho seznam změn ji jmenuje pod číslem GH-109639 a hlavičkový soubor display_server_windows.h má ve značce 4.7.2-stable metodu process_raw_input, kterou značka 4.7.1-stable nemá. Do stabilní řady se tedy dostala dřív, než tenhle text předpokládal.

Zdroje

Hry

Windows Godot Herní enginy Vstupní zařízení

← zpět na výpis