Portál AbcLinuxu, 4. května 2025 17:30
S fullscreen hrami na Linuxu je to aktuálně složité, protože je okolo způsobu implementace spousta nejasností. Ryan C. Gordon (icculus) a Sam Lantinga připravili návrh, jak by mohla probíhat indikace fullscreenu pro správce oken a jak by se řešilo přepínání rozlišení. Jde jim o podporu tohoto v SDL. Mezitím se ozval Martin Gräßlin z KDE, kterému se to až tak moc nelíbí, ale i tak vyjádřil návrhu podporu.
Tiskni
Sdílej:
Nejvíc mě štve, že u některých her mám ve fullscreenu přecitlivělou myš, posun o jeden pixel ve Fluxboxu odpovídá tak 400px ve hře....a s tím se na Arrakis fakt nedá hrát
To se hra zblázní i po správném ukončení a klidně vám zanechá "mrtvý" desktop, kde nic nevidíte a po slepu spouštíte xrandr.Tohle mi s chutí dělaj winehry když přijde přes notifikátor nějaká událost. Zajímavé je, že to nedělají e všechny hry co jedou v celoobrazovkovém režimu. u těch o kterých to vím musím ve spouštěči potom kontrolovat stav Pidginu, jestli náhodou nejede Thunderbird, atpd... tohle je občas na pos***í. A to nemluvím o KDE, tam je nejlepší dočasně vypnout kompositor....
Důvod je jednoduchý implementace v SDL nefunguje správně. Tedy funguje ale v případě "správné grafiky/ovladačů a konstalace hvězd".Samozřejmě, v SDL je to špatně, jenže za špatně považuji i to, že se o to hra pomocí SDL pokouší. Změnu rozlišení by si měl zajistit nějak uživatel, ať už nastavením WM, který něco spustí, aby se rozlišení změnilo, nebo nějak jinak. Ale nepřijde mi správné, že mi hra najednou kompletně změní celý layout obrazovky, aniž bych ji o to požádal, či ji tak nastavil. A když už ji o to požádám, musela by si zapamatovat nejen stav před aktivací fullscreenu (tak jak to dělá SDL), ale i další stavy, jak si uživatel sám mění layout obrazovky během hraní hry (např. se rozhodne během hraní aktivovat druhý displej a tam si bude chatovat, číst návod, apod.). To ale přidává do aplikace spoustu kódu, často i zbytečného, protože jen málokterý uživatel se takto chová, ale měl by tam být i pro toho jednoho, jinak to nikdy správně nebude obnovovat správný stav obrazovky. Je mnohem jednodušší nastavit si WM a říct mu "když uvidíš okno to a to, spusť xrandr blabla a až okno zmizí, spusť xrandr blabla". Uživatel tak má kontrolu nad rozlišením pro danou hru a hra se prostě přizpůsobí danému rozlišení, rozhodně by neměla být naprogramována s předpokladem např. "moje okno je vždy 1024x768px".
To je stejná konina jako že projekt napsaný v c++ nebude uvolňovat paměť kterou si před tím alokoval jen pro to že se o to postará systém.Však tohle vám neberu a s tímto souhlasím. Pokud ale člověk nedělá kokotiny typu "dynamická alokace kvůli každý blbosti" a naučí se správně používat různé kontejnery apod. tak ho to vůbec trápit nemusí. A pokud už se k dynamické alokaci musíme uchýlit, je tu třeba std::shared_ptr s téměř nulovým propadem výkonu (kompilátor vše zoptimalizuje) a o kraviny se nemusíme starat. Stačí se správně naučit programovat, neprogramovat stylem "vlastní kontejner pro každou blbost, protože add() se mi píše lépe než push_back()" a nepoužívat debilotiny typu Qt kontejnery, který se zeserou při první vyhozené výjimce apod.
Overhead shared_ptr není v žádném případě minimální, v podstatě ke každému pointeru přidá refcount (size_t) a při každém předání / uvolnění scope se na něm provede in/dekrementace.Presne tak, nehlede k tomu ze reference counting musi byt thread safe a to neni levne ani pri pouziti atomickych operaci.
|=======X screen========| ||-----------|---------|| || Output | Output || || 1 | 2 || ||-----------| || | |---------|| |=======================|a spustíte na monitoru 2. Přesunout na pozici 0,0 je v tomto případě blbost, protože to je monitor 1. Pokud spustíte na monitoru 1, nelze zase změnit velikost X screenu (což je w1+w2 x h2), ale je potřeba změnit rozlišení výstupu 1 tak, aby se nepohnulo z výstupem 2 a nadále mi fungovali aplikace na druhém monitoru. Sice asi není časté, že hrajete hru a zároveň něco děláte na druhém monitoru, ale třeba číst k nějaké složitější hře nějaký návod se občas hodí. Nějaký exclusive fullscreen by s tím vyjebal.
|=======================| ||-------| |---------|| || 1 | | || ||-------| | 2 || | | || | |---------|| |=======================|Někdy by zase uživatel rád hru přes oba monitory a tady nemusí pomoci ani fullscreen hint, protože WM většinou udělá fullscreen v rámci výstupu, na kterém je okno. Nejlepší je tedy v rámci aplikace vůbec rozlišení neřešit a nechat to na uživateli, ať si to nastaví jak chce, kde chce, třeba nějak i v rámci nastavení WM pro danou aplikaci. Aplikace/hra by se měla umět přizpůsobit jakémukoliv rozlišení, co jí hodíte.
Vicemonitorova konfigurace + hry to je tragedie i na widlichVicemonitorova konfigurace je tragedie hlavne na Widlich. Taskbar je jen na jednom monitoru a obsahuje okna ze vsech monitoru - vrchol demence - chcete prepnout okno a musite ujet klidne nekolik tisicu pixelu mysi. Nedej boze, kdyz ty monitory maji ruzne rozliseni.
Jenže když máte 2 monitory, není to sranda...Chápu správně, že máte na mysli jednu plochu na dvou monitorech s různým rozlišením?
Plně se ztotožňuji s tímto názorem!
Aplikace si má jen požádat o fullscreen, WM se pak má rozhodnout, jestli ano/neDo toho jestli ano/ne nemá VM co kecat. Osobně je mi nejsympatičtější tenhle přístup, nejlíp ještě doplněný o nějakou X-wide zkratku, která dotyčnému oknu vezme veškerý fokus a vrátí obrazovku zpět do původního stavu.
Do toho jestli ano/ne nemá VM co kecat.Do toho WM samozřejmě co kecat má, obzvláště, když to uživatel tomu WM nejǎk "přikáže". WM může ignorovat i obyčejný _NET_WM_STATE_FULLSCREEN hint. Např. takový compiz aplikaci nedovolí jít do fullscreenu, dokud si nanastaví, že je možné měnit velikost okna (takový problém má např. torchlight, vytvoří okno s fixní velikostí bez možnosti její změny, pak se snaží přepnout do fullscreenu, ale compiz to nedovolí a lidi si pak stěžují na fóru, že jim v ubuntu nefunguje torchlight ve fullscreenu.
A přesně toto je problém SDL. Drtivá většina jejích aplikací začíná voláním udělej mi okno takhle velké a aplikace je pak celá postavená na rastrovém modelu, kdy není schopná přežít změnu velikosti.
V posledních dvou verzích SDL vývojáři nejprve nahradili xf86vidmode za xrand a pak jej zase vypnuli, protože ať zvolili jakoukouliv metodu, vždy se našel uživatel, kterému automagie dávala špatné výsledky.
Chápu autory, že to mají těžké, ale osobně si myslím, že by měli přestat řešit protichůdné požadavky a prostě by měli dovolit přeškálovat výstup místo měnění videorežimu.
+1
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.