Open Source
Banner Network

Сборка Wine[X] для игровых задач

by Serge Ryabchun <sr at energy dot uch dot net>

Поскольку смотрю, что вопрос подымается довольно часто, решил вставить свои пару центов.

Какой linux ставить?

Здесь я не советчик. Я предпочитаю RedHat + часть пакетов с ALTlinux.

Сервер.

Нужен ли сервер или можно обойтись одноранговой сеткой? Ну если у вас так много денег, что вы в состоянии нанять человека, который будет строить линух на 8-20 тачек, то зачем вам линух? Купите себе win98 и закройте тему. Вобщем вопрос не нужен ли сервер, а какой он нужен.

В задачи сервера входит:

  1. раздать /home и /usr (NFS)
  2. раздать /mnt/floppy и /mnt/cdrom (samba)
  3. раздать /где-там-стоят-вин-геймы (samba)
  4. раздать /где-там-стоят-геймы (NFS)
  5. запустить всякие разные геймерские выделенные сервера
  6. если вы инетом торгуете, то имеет смысл поставить squid
  7. ну и, если вы сподвигнетесь ещё и на X-терминалы для инет/офис юзеров, то сервер вам понадобится для KDE/Gnome/OpenOffice/чего-ещё пускать
  8. (-20) фонтсервер, печать, etc.

Думайте, считайте. Для 1-4 за глаза хватит PII300/64M, а вот уже 5-7 потребует чего-то большего. Особенно память.

Геймерские машины.

К сожалению, на сегодня для линукса есть ровно одна фирма делающая видеокарточки с нормальным opengl и называется nNvidia. С радионом8500 я поигрался два часа, но хоть какого-то 3D там не обнаружил. (прим. ред.: пока или максимум 7200, или взять R-DDR и все -- 7500 сотоварищи должны быть в XF86 4.2) Память, ну CounterStrike отъедает 96M+, так что 128M минимум. Процессор, вообще-то wine/winex в 2D редкий тормоз*, но как ни странно, часть глюков на Duron800+ исчезают, хотя не странно, если проследить чего там вызывается.

*поправка - я еще не проверил, но судя по коду в последних winex сильно поднята скорость в 2D.

HDD от 1Gb, больше не нужно, можете продать свои 20-40Gb, накупить на металлоломе 4Gb, разницы как раз на сервер хватит ;-)

Получаем D800+/GF2MX+/128M+/1Gb+

Wine/WineX

Как _ЭТО_ собрать ручками?

autoconf
CFLAGS="-mcpu=i386 -march=i686 -O2" LDFLAGS="-s" \
./configure \
	--prefix=/usr \
	--with-x \
	--enable-dll \
	--disable-debug \
        --disable-trace \
        --enable-opengl \
	--enable-mesaos

make
(make -k programs)
make install

Заметьте, что c gcc2.96 -mcpu и -march необходимы. Без них на четырёх _одинаковых_ машинах сделанных через dump/restore я получил совершенно разные результаты:

  1. coredump gcc на сборке dlls/ntdll
  2. coredump wine при первой закачке шрифтов
  3. неправильная работа мыши в некоторых играх
  4. правильная, imho, сборка

gcc2.95 собирает правильно, gcc3 бросает кору с простынёй кода, на котором сдох. gcc2.96-81 из RH71 нормально собирает с -O3, gcc2.96-98 из RH72 с -O3 собирает, но wine бросает кору на старте, с -O2 всё нормально. Короче, 2.96 - та ещё песня.

Потом ещё нужно сделать programs/regapi/regapi setValue < windefault.reg для получения правильного регистри. Кстати, если у вас свежепроставленный wine вывалится с матом на запускать нужно с опцией -desktop, то либо он не находит правильной регистри, либо winedefault.reg поменялся, те необходимо regapi запустить снова.

Всё, можете пробовать.

CounterStrike тормозит безбожно.

Ну с меню пока ничего не поделать. Хорошо ещё, что в cvs глюк с запуском сервера поправлен, правда за счет ещё хужей отрисовки меню, чёрт с ней, с отрисовкой, зато консоль работает, как надо. А opengl сейчас поправим. Всё, что нам понадобится, описано в первых 30 строках dlls/opengl32/make_opengl . Если у вас winex уже слит, то вам припёрло ;-) Если нет, то лучше слейте, всё равно вам понадобятся несколько файликов и легче залить winex целиком, чем кликать мышом по oss.sgi.com несколько раз на один файл. В winex всё это лежит в dlls/opengl32/specs. В wine ложим туда же. Прикладываем следующий патч, можно и ручками

--- wine/dlls/opengl32/make_opengl	Wed Aug 29 22:37:07 2001
+++ wine-ogl/dlls/opengl32/make_opengl	Thu Nov  8 12:54:47 2001
@@ -43,11 +43,11 @@
 $ext_file  = "opengl_ext.c";
 
 # Set to 0 for removing the ENTER / LEAVE GL calls
-$gen_thread_safe = 1;
+$gen_thread_safe = 0;
 # Prefix used for the local variables
-$ext_prefix = "func_";
+$ext_prefix = "";
 # If set to 1, generate TRACEs for each OpenGL function
-$gen_traces = 1;
+$gen_traces = 0;

и
(cd dlls/opengl32; ./make_opengl specs 1.2)
make install

О, теперь мы поехали быстрее. На нынешних билдах отставание от нейтива ~20%, а на билдах конца августа-начала сентября около 10%. Можете проверить с wine-20010824. Там windows.c еще лежит в x11drv, теперь перехала в wineserver. Вот и получили дополнительный тормоз. В высоких разрешениях отставание уходит в ноль, здесь уже карта тормозит.

Если судить по тому, что build, который раздается transgaming.com сабскрайберам бегает шибко быстрее, чем тот, что получается с cvs через configure;make, то билдят они его именно таким образом.

Стало лучше, но всё равно тормозит безбожно.

Мнээ, а выгрузите-ка саундовые модули и зпретите звук. Полегчало? Значит вам припёрло. Вам предстоят поиски правильного саундового модуля. В нескольких случаях мне помогла ALSA 0.9, в одном замена звуковой карты.

SeriousSam не едет.

И не поедет, пока не приложите следующий патчик, kgm, с августа никак не замылю его в wine-devel, руки не доходят.

--- wine/graphics/x11drv/opengl.c	Wed Aug 29 22:37:08 2001
+++ wine-ogl/graphics/x11drv/opengl.c	Thu Nov  8 12:56:15 2001
@@ -200,7 +200,7 @@
   ppfd->nVersion = 1;
   
   /* These flags are always the same... */
-  ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_GENERIC_ACCELERATED;
+  ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_SWAP_COPY;
   /* Now the flags extraced from the Visual */
   ENTER_GL();

Это с winex, в wine на две строки выше.

Что ставить wine или winex.

Ну, во-первых, winex две ветки. Одна доступна в cvs, другая доступна только в собранном виде. Пока разница между ними по словам Transgaming.com только в наличии/отсутствии SafeDisc и SecuRom, но если судить по вялой активности в доступном cvs, то разницы там больше, хотя может и ошибаюсь *.

*поправка - это они в другое здание переезжали.

Какого-нибудь кошерного снапшота не было, нет и не будет. Это даже не бета, это вечная альфа. Что-то правится, что-то ламается. Если сейчас поправили консоль в CounterStrike, то заламали ONI. Поправят ONI, перестанет ездить FAKK2 или что-то другое. Это вечная песня. Хотите, что бы оно у вас хоть как-то работало держите их все, вернее, все под которыми что-то работает лучше. Те ставить куда-нибудь в

	/usr/local/wine${DATE} и /usr/local/winex${DATE}
а запускать через /usr/local/bin/wine${DATE} и /usr/local/bin/winex${DATE} Надеюсь, что такое PATH и LD_LIBRARY_PATH известно

Вообщем-то я соответствующие wine.spec и winex.spec сочинил. Может завтра до ума доведу.

Как пускать геймы.

Ессесно, на другом сервере. Причин несколько.

  1. драйвера от nvidia + wine - сладкая парочка. Лично у меня такого ни разу не получалось (докаркался :), уже получилось), но видел неоднократно, при том что в клубах я появляюсь крайне редко. Вобщем wine сносит X или X сносит wine, клавиатура и мыша блокируются. Остается или зайти по сетке и сделать ребут или нажать на ресет. Причём надзиратель говорит, что есть избранные кадры - стоит такому избранному сесть погамить "и всё у нас пойдет через жопу" (c) ДМБ, дикий прапор. Так и вспомнишь про стелянный глаз. Но если запущено на другом сервере, то после сноса обычно таки возвращается на первый X. Кстати, поэтому самое первое, что должно быть поставлено на геймерскую машину - acpid. Да и ресет отстегнуть от мамы желательно ;-)
  2. wm может делать с мышом|кибордом что-то совершенно непотребное. Не удивляйтесь, если у вас Q3 перестала на клавиши реагировать. очень может быть, что под Q3 всплыло меню или еще чего. Пойдут вопросы типа http://www.transgaming.com/showthread.php?msg=1869&forum=7&thread=1869
  3. у вас двухкнопочные мыши и включена эмуляция третьей кнопки, не удивляйтесь, что рокетджамп на мыше не выходит.
  4. StarCraft и иже с ним знает только 640x480. А хочется в фулскрине и не в ублюдочном, когда физическое и виртуальное разрешение не совпадает, а нормально.

    Поэтому пускаем:

       xinit /usr/local/bin/STARCRAFT -- :1 -layout gamer640x16
    

    Правильные layout-ы напишете сами.

    А что нужно написать в /usr/local/bin/STARTCRAFT

    #!/bin/bash
    
    export WINEPREFIX=/var/wine/apps/starcraft
    
    cd /var/wine/disks/g/starcraft
    wine20010824 game
    

    Как ставить геймы.

    Самый оптимальный путь - ставить под windows с diff regbefore regafter. Можно и из под wine, но здесь как получится. Игры требуют cdrom. Во-первых, не крекайте игру. У нас и так куча проблем, а тут ещё и непонятно wine глючит или крякалка так крякнула. Во-вторых, неизвестно как посмотрит на крякнутую игру "Общество защиты Билла Гейтса от голодной смерти". Так что поделим геймы на три группы:

    1. не требуют вообще - с этими нет никаких проблем
    2. требуют наличие файлика на cdrom - тоже понятно, "Path" = "/куда-надо"
    3. требуют наличие cdrom - для wine /dev/loop выглядит также как и /dev/cdrom так, что снимаете образ, маунтите его и "Device" = "/dev/loop" Если гейма может частично ставиться, то для экономии места так её и ставить. Для некоторых достаточно снять первые несколько мегабайт образа.

    Какой WM пользовать.

    А какой угодно. Но у нашего юзера gamer прописано icewm.


    HTMLизация и публикация на совести Михаила Шигорина <mike at altlinux dot ru>.
    Спасибо, Сергей!