DirectX и как я его съел

автор: Little
рубрика: Linux


  1. Wintch 14 Mar 2008 3:36 pm

    Спасибо большое за статью, ждем продолжения под названием “DirectX и как я его съел” :)

Ну что вам сказать, уважаемые посетители... Говорят, этот блог сделан для людей. Предупреждаю сразу, практической ценности в данном действии для запуска игр я не вижу! Если на версиях вайн до 0.9.50 такой финт давал возможность просто запустить (не поиграть) игры, которые без него не запускались, то с поздними версиями большинство игр работает и так.

На самом деле, я не сам придумал эту фишку. Оригинальная статья на английском языке доступна здесь, если кому интересно, можно почитать.

DirectX - это набор API (application programming interface - интерфейс программирования приложений), который является стандартом де-факто для создания мультимедийных приложений и игр в среде Microsoft Windows. На сегодняшний день подавляющее большинство игр использует именно этот API, поэтому его реализация под wine является одной из важнейших задач. На момент написания статей S.T.A.L.K.E.R. и Halflife 2 Episode two (OrangeBox) под вайном была официально заявлена поддержка DirectX 8.1. Большинство же современных игр разработаны под более современные версии - DirectX 9.0c и DirectX10. Не знаю, как с 10 директом - я так ни разу и не поработал в висте достаточно, чтобы насладиться его прелестями, а без 9-го запускать игрушки тяжело. В частности, в вышеописанных статьях описано как запускать игры именно в режиме DirectX8 - только в таком режиме они работают нормально.

Однако, приблизительно в одно время с запуском Сталкера, я наткнулся на статью по установке свежей версии Директ-икс в Линуксе, как ни странно, все заработало. Попробую сделать это еще раз вместе с Вами.

Итак, первый шаг, который я всегда предпринимаю, прежде чем начинать учить кого-либо - создание чистого пространства wine. Поясню зачем - при написании статьи я могу забыть про сделанные мной ранее настройки, в результате чего у вас не получится то, что получается у меня.

nicolay@localhost ~ $ ls -d ./.wine*
./.wine ./.wine-1000 ./.wine_new
nicolay@localhost ~ $ mv ./.wine ./.wine_old
nicolay@localhost ~ $ ls -d ./.wine*
./.wine-1000 ./.wine_new ./.wine_old
nicolay@localhost ~ $ wineprefixcreate
/home/nicolay/.wine updated successfully.
nicolay@localhost ~ $ ls -d ./.wine*
./.wine ./.wine-1000 ./.wine_new ./.wine_old
nicolay@localhost ~ $

Таким образом, мы получили новую чистую директорию для работы. Само-собой, старую директорию я сохранил - мне совершенно не улыбается потом восстанавливать все заново.

В новую директорию установим шрифты с помощью winetricks. Я давно положил этот скрипт /usr/local/bin, поэтому запускается он у меня независимо от самого вайна и его конфигурации:

nicolay@localhost ~ $ winetricks corefonts
Executing sha1sum --status -c /home/nicolay/winetrickscache/arial32.exe.sha1sum
Executing sha1sum --status -c /home/nicolay/winetrickscache/times32.exe.sha1sum
Executing wine /home/nicolay/winetrickscache/arial32.exe
Executing wine /home/nicolay/winetrickscache/times32.exe
Install of corefonts done
winetricks done.
nicolay@localhost ~ $ winetricks tahoma
Executing sha1sum --status -c /home/nicolay/winetrickscache/wd97vwr32.exe.sha1sum
Executing cabextract --directory=/home/nicolay/.wine/drive_c/winetrickstmp /home/nicolay/winetrickscache/wd97vwr32.exe
Extracting cabinet: /home/nicolay/winetrickscache/wd97vwr32.exe
extracting /home/nicolay/.wine/drive_c/winetrickstmp/wviewer.INF
extracting /home/nicolay/.wine/drive_c/winetrickstmp/License.txt
extracting /home/nicolay/.wine/drive_c/winetrickstmp/setup.exe
extracting /home/nicolay/.wine/drive_c/winetrickstmp/Setup.ini
extracting /home/nicolay/.wine/drive_c/winetrickstmp/setup.lst
extracting /home/nicolay/.wine/drive_c/winetrickstmp/Viewer1.cab
extracting /home/nicolay/.wine/drive_c/winetrickstmp/Setup.tdf

 

All done, no errors.
Executing cabextract --directory=/home/nicolay/.wine/drive_c/winetrickstmp /home/nicolay/.wine/drive_c/winetrickstmp/Viewer1.cab
Extracting cabinet: /home/nicolay/.wine/drive_c/winetrickstmp/Viewer1.cab
extracting /home/nicolay/.wine/drive_c/winetrickstmp/ACMSETUP.EXE
extracting /home/nicolay/.wine/drive_c/winetrickstmp/ACMSETUP.HLP
extracting /home/nicolay/.wine/drive_c/winetrickstmp/MSSETUP.DLL
extracting /home/nicolay/.wine/drive_c/winetrickstmp/viewer.DLL
extracting /home/nicolay/.wine/drive_c/winetrickstmp/acmereg.DLL
extracting /home/nicolay/.wine/drive_c/winetrickstmp/wviewer.stf
extracting /home/nicolay/.wine/drive_c/winetrickstmp/hlink.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/hlinkprx.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/docobj.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/msv7enu.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/mso97v.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/msorfs.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/readme.doc
extracting /home/nicolay/.wine/drive_c/winetrickstmp/t2embed.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/urlmon.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/riched20.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/wininet.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/wordview.exe
extracting /home/nicolay/.wine/drive_c/winetrickstmp/wwint32v.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/tahoma.ttf
extracting /home/nicolay/.wine/drive_c/winetrickstmp/install.txt
extracting /home/nicolay/.wine/drive_c/winetrickstmp/npdoc.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/oleplug.dll
extracting /home/nicolay/.wine/drive_c/winetrickstmp/oleplug.ini
extracting /home/nicolay/.wine/drive_c/winetrickstmp/errormsg.dll

 

All done, no errors.
Executing cp -f /home/nicolay/.wine/drive_c/winetrickstmp/tahoma.ttf /home/nicolay/.wine/drive_c/windows/fonts/tahoma.ttf
Install of tahoma done
winetricks done.
nicolay@localhost ~ $

Далее запускаем winecfg и настраиваем звук. Как обычно я выбираю oss, хотя, говорят, в новых версиях вайна поддержка альсы становится все лучше.

Кстати, версию вайна на текущий момент я использую 0.9.55, хотя уже вышла 0.9.57.Объясняется это тем, что в версиях 0.9.56 и 0.9.57 есть баг (http://bugs.winehq.org/show_bug.cgi?id=11950) с отображение иконок в TheBat. А я им пользуюсь для работы с почтой, поэтому перейти но новую версию не спешу. Кстати, режим GLSL в новых версиях вайна включается по-умолчанию. Так что, в реестр мы пока не полезм, хотя, если кому-то интересно - читайте статью про Сталкера. Итак, попробуем наш халфлайф2 под вайном без дополнительных настроек:

 

 

nicolay@localhost ~ $ mkdir ./.wine/drive_c/games
nicolay@localhost ~ $ cp -r ./.wine_old/drive_c/games/orangebox ./.wine/drive_c/games/
nicolay@localhost ~ $ cd .wine/drive_c/games/orangebox/
nicolay@localhost ~/.wine/drive_c/games/orangebox $ wine hl2.exe -game ep2 -console

Стартовый экран Halflife2Тетка из халвы в начале игрыВода

Для сравнения парочку скриншотов в режиме DX80:

nicolay@localhost ~/.wine/drive_c/games/orangebox $ wine hl2.exe -game ep2 -console -dxlevel 80

Вода в 80Тетка в режиме 80

Первый же взгляд на воду показывает, что алгоритмы ее отображения разные. Но извините, 10 кадров в секунду не стоят этого улучшения. Так что, поддерживаемый вайном режим 9.0 пока оставляет желать много лучшего. Попробуем воспользоваться родными библиотеками DirectX от Майкрософт.

nicolay@localhost ~/.wine/drive_c/games/orangebox $ cd ~/DirectX9/
nicolay@localhost ~/DirectX9 $ wine DXSETUP.exe
fixme:mscoree:GetCORVersion (0x7cfe22e4, 600, 0x7cfe22d0): semi-stub!
fixme:mscoree:LoadLibraryShim (0xad2cf8 L"fusion.dll", (nil), (nil), 0x7cfe19dc): semi-stub

Попытка 1

Попытка №раз успехом, как всегда не увенчалась. Читаем исходную статью: "next up is to install a native mscoree.dll and streamci.dll into /system32 from a windows install and set them to native Windows". Ага, как раз в mscoree мы и наблюдали ошибку. Единственно,устанавливатьих нативными необходимости нет - они и так не включены в вайн, поэтому в любом случае будут использоваться виндовые версии. Архив с библиотеками я давно скачал где-то в сети, адрес, к сожалению не помню. Можно, конечно, было бы пришить файлы к статье. Однако, сидеть мне неохота, да и комсомольцы не ищут легких путей.

http://www.yandex.ru/yandsearch?text=mscoree.dll+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C

Первая же ссылка в результатах поиска: http://www.dll-files.ru/

Отлично, с этого сайта получили mscoree.zip, streamci.zip. Распаковываем:

nicolay@localhost ~/DirectX9 $ unzip ~/download/mscoree.zip -d ~/.wine/drive_c/windows/system32
...
inflating: /home/nicolay/.wine/drive_c/windows/system32/mscoree.dll
inflating: /home/nicolay/.wine/drive_c/windows/system32/readme.txt
nicolay@localhost ~/DirectX9 $ unzip ~/download/streamci.zip -d ~/.wine/drive_c/windows/system32
...
inflating: /home/nicolay/.wine/drive_c/windows/system32/streamci.dll
replace /home/nicolay/.wine/drive_c/windows/system32/readme.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: /home/nicolay/.wine/drive_c/windows/system32/readme.txt
nicolay@localhost ~/DirectX9 $ ls ~/.wine/drive_c/windows/system32
... mscoree.dll ... streamci.dll ...

Итак, требуемые библиотеки есть. Попытка номер два:

nicolay@localhost ~/DirectX9 $ wine DXSETUP.exe
ДиректХ успешно установлен.

ДиректХ успешно установлен и просит перезагрузить компьютер. Теперь необходимо прописать использование нативных библиотек DirectX, как и сказано в статье. Запускаем winecfg, добавляем одну библиотеку (например, d3d8), затем "vim ~/.wine/user.reg", находим это замещение и добавляем все остальные библиотеки. В результате должно получиться:

...
"HardwareAcceleration"="Emulation"

[Software\\Wine\\DllOverrides] 1205672385
"d3d8"="builtin"
"d3d9"="builtin"
"d3dim"="native"
"d3drm"="native"
"d3dx8"="native"
"d3dxof"="native"
"dciman32"="native"
"ddrawex"="native"
"devenum"="native"
"dinput"="builtin"
"dinput8"="builtin"
"dmband"="native"
"dmcompos"="native"
"dmime"="native"
"dmloader"="native"
"dmscript"="native"
"dmstyle"="native"
"dmsynth"="native"
"dmusic"="native"
"dmusic32"="native"
"dnsapi"="native"
"dplay"="native"
"dplayx"="native"
"dpnaddr"="native"
"dpnet"="native"
"dpnhpast"="native"
"dpnlobby"="native"
"dsound"="builtin"
"dswave"="native"
"dxdiagn"="native"
"mscoree"="native"
"msdmo"="native"
"qcap"="native"
"quartz"="native"
"streamci"="native"

[Software\\Wine\\Drivers] 1205667777
...

Итак, что кажет нам dxdiag?

nicolay@localhost ~/.wine/drive_c/games/orangebox $ wine dxdiag

Запуск dxdiag

 

 

Версия 9.0c, работает dsound, directdraw, direct3d. Не работает directmusic - ну нет у нас midi-интерфейса.Ищем ссылочку в комментариях к оригинальной статье - http://www.kirupa.templarian.com/gm.dls:

nicolay@localhost ~/.wine/drive_c/games/orangebox $ wget -P ~/.wine/drive_c/windows/system32 http://www.kirupa.templarian.com/gm.dls
--16:15:06-- http://www.kirupa.templarian.com/gm.dls
=> `/home/nicolay/.wine/drive_c/windows/system32/gm.dls'
Распознаётся www.kirupa.templarian.com... 74.208.41.115
Устанавливается соединение с www.kirupa.templarian.com|74.208.41.115|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 3


Карта
rss
Карта