The Linux Gamers' HOWTO

В почтовых рассылках и группах новостей, касающихся Linux, непрерывно появляются одинаковые вопросы. Многие из них возникают потому, что люди не знают как все работает в Linux, по крайней мере в том, что касается игр. Надеюсь, этот документ уменьшит траффик и просветит людей. Я не эксперт в этой области, поэтому я надеюсь, что гуру подскажут мне что здесь не так и поправят меня.

[Peter Jay Salzman (p@dirac.org). Перевод: Дмитрий Самойлов (dsamoyloff@mail.ru)]

The Linux Gamers' HOWTO

Версия 0.0.1
Последняя модификация: 18 Мая 2001 12:24
Copyright 2001 Peter Jay Salzman
p@dirac.org
http://www.dirac.org/p
Перевод -- Дмитрий Самойлов (c) 2001
dsamoyloff@mail.ru

В почтовых рассылках и группах новостей, касающихся Linux, непрерывно появляются одинаковые вопросы. Многие из них возникают потому, что люди не знают как все работает в Linux, по крайней мере в том, что касается игр.

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

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

Оглавление

0.0. Введение

Я ненавижу HOWTO с длинными вступлениями и не в тему написанными заключениями, поэтому, чтобы сберечь кучу деревьев, буду краток. Если у вас есть идеи или комментарии, касающиеся этого HOWTO, пожалуйста пишите мне. Присылая свои комментарии, вы даете мне знать, что я делаю что-то полезное. Это, в свою очередь, побуждает меня дополнять этот документ.

0.1. Авторство, Copyright

Автор этого HOWTO и владелец авторских прав на него -- Peter Jay Salzman. Как ни странно, документ публикуется под лицензией GNU GPL.

0.2. Благодарности

Спасибо Mike Phillips за пространные комментарии по этому HOWTO, даже если это в его интересах. :) Спасибо Дмитрию Самойлову за перевод этого документа на русский язык. Я надеюсь, он поспевает за моими обновлениями, так как я буду дополнять этот документ почти каждый день, пока он не достигнет версии 0.1.0 (я стараюсь :-) -- прим. перев.).

0.3. Последняя версия и контактная информация

Последнюю версию документа можно найти по адресу http://www.dirac.org/linux/LG-HOWTO.txt.

Буду рад вашим дополнениям, исправлениям и улучшениям. Также я ищу людей, у которых все еще есть вопросы после прочтения этого документа, или даже тех, кто думает, что некоторые моменты могли бы быть описаны или оформлены лучше. Присылайте всю корреспонденцию мне, Питеру, по адресу p@dirac.org. Вы можете посетить мою вэб-страницу по адресу www.dirac.org/p, или мою Linux-страницу на www.dirac.org/linux.

1.0. Прелюдия

За мои 2 года использования Linux, я обнаружил, что счастье приходит от самодостаточности. А самодостаточность приходит от личных знаний. Это то, для чего написан этот документ. Увеличение ваших знаний в вопросах, которые относятся к играм для Linux.

Половина просьб о помощи, которые я видел в usenet, исходили от людей, которые не имели достаточных знаний даже для того, чтобы правильно сформулировать ворос. Поэтому, первая часть этого документа посвящена различным компонентам, которые составляют вашу графическую систему.

1.1. Что такое Glide?

Позвольте мне ответить постепенно, поскольку вопрос немного запутанный.

Glide2 -- это API плюс драйвер, который обращается к аппаратно ускоренным 3D функциям видеокарт Voodoo I, II и III, основанным на чипсетах производства ныне не существующего 3Dfx.

Glide2 работает на очень низком уровне: он поддерживает определение view point, отображение текстур, отправку треугольников и т. п.. Некоторые возможности Glide2 напоминают OpenGL, а некоторые -- не имеют аналогов.

Программа имеет доступ к специальным возможностям этих карт ТОЛЬКО посредством библиотеки Glide2 одним из двух способов:

  • непосредственно: программа написана для использования Glide2
  • косвенно: программа использует Mesa+Glide2 (Mesa реализует OpenGL через Glide2)
Примерами программ, написанных специально для использования Glide2, могут служить Myth 2, Descent 3, Unreal Tournament, Rune и Deus Ex от компании Loki Software. Подавляющее же большинство игр использует Glide2 косвенно, при помощи Mesa с поддержкой Glide2 (существуют также их порты в OpenGL).

Glide2 больше не является закрытым. Компания 3dfx открыла спецификации и исходный код для open source community. Это обеспечивает заметную долю рынка для Linux. В Linux Glide2 портировал Daryll Strauss.

К несчастью, Glide2 почти "мертв". Он реализован только в X 3.3 (большинство людей использует сейчас 4.0) и используется только картами Voodoo I, II и III. Можно с уверенностью утверждать, что под Glide2 игры больше писаться не будут.

Что же насчет Glide3? Прежде всего, Glide3 -- не "прямой" API. Он существует только для поддержки DRI картами Voodoo III, IV и V под XFree86 4.0. Ни одна игра, используюшая для рендеринга Glide2, не будет работать под Glide3. Как правило, система, поддерживаюшая рендеринг с использованием Glide2, имеет лучшую производительность. Однако, такая конфигурация становится сегодня все менее распространенной.

  Glide    Версия X   Поддерживаемые карты   Замечания
    2      3.3.*      Voodoo I, II, III      Использует устройство 3dfx для
                                             доступа не из-под root.
    3      4.*.*      Voodoo III, IV, V      Использует DRI.
Существуют игры, непосредственно использующие Glide2 (в отличие от использования Glide2 через Mesa). Myth2 -- пример игры, написанной конкретно для Glide2, хотя она также может рендерить и в OpenGL (см. следующий вопрос). Quake3 является примером OpenGL-игры, которая может использовать glide2 при помощи Mesa с поддержкой Glide2.

Еще одна разница состоит в том, что Glide2 использует специальный 3dfx-модуль для ядра, чтобы разрешить доступ к 3D-ускорению для обычных пользователей. Другими словами, без него только пользователь root имеет доступ к 3D возможностям карты.

1.2. Что такое OpenGL?

OpenGL -- это графический API высокого уровня, в оригинале разработанный SGI на основе их предыдущего закрытого API Iris GL, и ставший несколько лет назад индустриальным стандартом. Он определяется и утверждается организацией Architectural Revision Board (ARB), которая включает в себя членов SGI, IBM, DEC и Microsoft. OpenGL обеспечивает мощный, полный и обобщенный набор возможностей для графических опреаций в 2D и 3D.

Существует 4 части OpenGL и его канонических расширений:

  • GL: Основные вызовы OpenGL
  • GLU: Дополнительные полезные вызовы
  • GLUI: Интерфейс с кнопками, checkbox'ами и т. п.
  • GLUT: Средства для системно-независимого управления событиями оконной системы (фиксирование движений/щелчков мыши, нажатий на клавиши, управление сигналом выхода из программы и т. п.). Также включает в себя некоторые элементы UI, которые должны были войти в GLUI.
OpenGL -- это не только API, но и его реализация, написанная SGI. Она пытается использовать аппаратное ускорение для различных графических операций, там где это возможно; это зависит от видеокарты, которая установлена в вашем компьютере. Если для некоторой задачи ускорение не доступно, OpenGL осуществляет программный рендеринг. Это значит, что если вы берете OpenGL у SGI и при этом хотитие получить хоть какое-нибудь аппаратное ускорение, то это должна быть реализация, которая написана и откомпилирована специально для вашей видеокарты. Иначе, все что вы получите -- software rendering. То же самое верно и для OpenGL-клонов, таких как Mesa.

OpenGL является open source эквивалентом DirectX. Важное отличие между ними состоит в том, что, поскольку OpenGL открыт (DirectX закрыт), игры написанные для OpenGL гораздо легче портировать в Linux, тогда как портирование DirectX-игр сейчас попросту невозможно. Факт, что если вы начинаете с нуля, то написание игры, которая будет компилироваться и в Linux, и в Win32, является абсолютно тривиальной задачей.

1.3. Что такое Mesa?

Mesa -- это свободная реализация OpenGL API, которую придумал и написал Brian Paul. Несмотря на отсутствие официального сертификата, это практически полностью совместимая с оригиалом OpenGL-реализация, соответствующая спецификациям ARB. Сообщается, что Mesa даже быстрее реализации OpenGL от SGI.

Как и OpenGL, Mesa использует аппаратное ускорение, там где это возможно. Это означает, что существуют разные "версии" или "сборки" Mesa, в зависимости от видеокарты, которая у вас установлена. Если у вас Voodoo I, II или III, то предполагается использование "mesa+glide2" (автор David Bucciarelli), которая является реализацией OpenGL, использующей glide в качестве средства для рендеринга определенных графических операций.

1.4. Что такое DRI?

В рендеринге графики участвуют 3 игрока: приложение-клиент (такое как Quake 3), X-сервер и железо (видеокарта). Раньше клиентам строго запрещалась запись непосредственно в аппаратную часть, и для этого была хорошая причина. Программа, которой позволено напрямую обращаться к железу, различными путями может привести систему к зависанию. Вместо того, чтобы довериться программистам, Linux просто запрещает это делать. Однако, это изменилось с появлением X 4.0 и Direct Rendering Infrastructure (DRI). DRI свободно разрешает X-клиентам коллективную запись информации 3D рендеринга непосредственно в видеокарту безопасным путем.

DRI "убирает с дороги" X-сервер, и 3D драйвер (Mesa или OpenGL) может использовать железо напрямую. Это делает процесс быстрее. Информация 3D рендеринга не должна обязательно аппаратно ускоряться.

С технической точки зрения, это имеет несколько достоинств.

  • Не надо кодировать/декодировать вершины через GLX.
  • Не надо пересылать графику X-серверу через сокет.
  • На машинах с одним процессором, ЦПУ не приходится менять контекст между X и клиентом при рендеринге графики.

1.5. Что такое GLX?

GLX -- это расширение X, используемое OpenGL-программами, "клей" между не зависящим от платформы OpenGL и привязанным к платформе X.

1.6. Что такое Utah GLX?

Проект Utah GLX является предшественником DRI. Он основывается на несколько других дизайнерских решениях в отношении разделения данных и методов доступа к видеокарте. (К примеру, он рассчитывает на привелегии root, вместо создания инфраструктуры ядра, необходимой для безопасного доступа). Он обеспечивает поддержку (на данный момент) нескольких карт, которые не очень хорошо поддерживаются в DRI. В частности, семейство ATI Rage Pro, S3 Virge (хотя тот, кто использует это для игр -- просто чудак) и open source драйвер для TNT/TNT2 (очень недоделанный). Драйвер TNT/TNT2 основан на реверс-инженеринге невнятных исходников драйверов для X 3.3 от nVidia. Однако, они абсолютно незавершенные и на деле не пригодны для использования.

Кстати, пока поддержка G400 не будет *действительно* исправлена в DRI, для нее Utah GLX тоже будет лучшим решением; однако, ко времени опубликования этого HOWTO, это, вероятно, не будет проблемой.

1.7. Что такое xlib?

Иногда встречаются больные (говорю с уважением), которые пишут игры под xlib, иначе я даже не упомянул бы о здесь об этом. xlib -- это набор C-библиотек, предназначенных для программирования под XFree86 на самом низком уровне. Любая графическая программа в X очень активно использует xlib.

По праву можно сказать, что xlib запутанна и сложна. Я бы сказал, что это наиболее трудное и требующее наибольшего времени на освоение явление в программировании. Программа, которая просто подключается к X-серверу, выводит окно и больше вообще ничего не делает, может состоять из 40 строк, включающих в себя запутанные вызовы функций с очень длинными именами. По этой причине, существует масса библиотек, которые скрывают от нас детали xlib-программирования. Некоторые из них фокусируются на рисовании в окнах (такие как SDL). Другие больше сконцентрированы на элементах управления в окнах (например, выпадающие меню, радио-кнопки, и текстовые поля); эти библиотеки, соответственно, называют наборами элементов управления. Gtk -- мать всех подобных библиотек, но есть и много других, таких как fltk и Qt.

1.8. Что такое SDL?

SDL (Simple DirectMedia Layer) -- это библиотека от Sam Lantiga из Loki Software (закончившего UCD!!). В действительности, это meta-библиотека; в том смысле, что она не только графическая, скрывающая программирование под xlib, но еще и обеспечивающая простой интерфейс к звуку, музыке и обработке системных событий. Она распространяется под лицензией LGPL и обеспечивает также поддержку джойстика и OpenGL. 40-строчная запутанная программа, которую я упоминал в секции о xlib, при помощи SDL может быть легко написана в 6 строк читабельного кода.

Наиболее сильная сторона SDL -- ее кроссплатформенность. За исключением нескольких деталей, касающихся заголовочных файлов и компиляции, программа написанная для SDL может быть откомпилирована под Linux, *BSD, Windows*, MacOS and BeOS. Существуют расширения SDL, написанные разными людьми, для таких вещей, как поддержка любых нужных вам графических форматов, проигрывания видео в формате mpeg, отображения шрифтов truetype, поддержка спрайтов, а также почти всего другого, что существует под Солнцем. Вполне очевидно, что SDL -- это пример того, к чему должны стремиться все остальные библиотеки. Единственный недостаток -- нехватка документации (вздох), но, насколько я понимаю, книга об SDL не за горами. Если вы программируете игры, окажите услугу человечеству -- используйте SDL.

У Сэма есть скрытый мотив для написания такой крутой библиотеки. Он -- ведущий программист компании Loki Software, которая использовала SDL во всех своих играх, за исключением Quake3.

1.9. Что такое GGI?

Я сам не очень уверен, что знаю. Не может-ли кто-нибудь пожертвовать параграф-другой?

1.10. Что такое SVGAlib? Фрэймбуфер? Консоль?

Если вам еще никто этого не объяснил, консоль -- это темный текстовый экран, который вы видите после включения вашего компьютера (при условии, что у вас не происходит запуск xdm или gdm). Ее можно противопоставить среде X, в которой имеются всевозможные GUI-приложения, такие как xterm. Распространенным заблуждением является мнение, что X обозначает графику, а консоль -- отсутствие таковой. В консоли, несомненно, графика есть -- она полноэкранна, крайне быстра и крайне убедительна.

SVGAlib -- это графическая библиотека, позволяющая вам отображать графику в консоли. Существует много игр, использующих SVGAlib и я являюсь большим поклонником этой библиотеки и вообще графических консольных игрушек. SVGAlib вызывает небольшой хруст в суставах, потому что исполняемый файл должен запускаться из-под root или быть setuid, но библиотека должна запускаться под root только при первом старте приложения. Она сразу же освобождается от root'ового статуса.

Фрэймбуферы подобны консоли, но они работают в графическом, а не текстовом режиме. Почему может понадобится симулировать текстовый режим из графического? Это позволяет нам запускать графические приложения, такие как просмотрщики postscript, прямо из консоли. Это также позволяет выбрать не только размер консольного шрифта, но и вообще другой шрифт! Представляете себе в консоли шрифт Comic Sans MS? В LDP есть хороший HOWTO о фрэймбуферах.

2.0. Определения: Видеокарта и 3D терминология

2.1. Что такое T&L?

T&L расшифровывается как "Texture and Lighting". Набор инструкций T&L в видеокарте позволяет ей обрабатывать все текстурные и световые эффекты видеоигры, в противоположность передаче их для обработки центральному процессору. Это, естесственно, увеличивает скорость игры. Пока не так много игр использует T&L, но одно из заметных исключений -- Quake3.

2.2. Что такое FSAA?

FSAA -- это "Full Screen Anti-Aliasing" (полноэкранный анти-алиасинг). Anti-Aliasing -- это художественная техника для рендеринга изображения, увеличения его до большего разрешения и потом уменьшения его обратно до меньшего разрешения. Это приводит к исчезновению эффекта "квадратности", при котором случайные пиксели, составляющие изогнутые поверхности, выглядят незакругленными, или изломанными. FSAA значительно улучшает внешний вид игры, но может ухудшить общую производительность понижением частоты кадров, поскольку видеокарте приходится каждый раз рендерить по нескольку изображений.

3.0. XFree86 и Вы

Если вы собираетесь играть под X, немного знаний о нем вам не повредит. Я считаю, что "X Window User HOWTO" и особенно "man XF86Config" должны быть прочитаны *обязательно*. Не ленитесь, прочитайте их. Они имеют крайне высокое соотношение информация/объем. Многие проблемы могут быть легко исправлены, если вы ориентируетесь в файле XF86Config (или XF86Config-4).

3.1. Получение информации о вашем X

3.1.1. Probeonly

Существует много путей получения информации о вашем X. Популярным методом является использование probeonly. В консоли (без запущенного X) введите:
X -probeonly 2> X.out
Да, одно тире; довольно о стандартах. Вывод X идет в stderr, поэтому надо его перенаправить в файл X.out при помощи "2>". Этот файл, главным образом, содержит все, что нужно знать о X. Давайте же, посмотрите на него. Он до отказа набит полезной информацией. Важно знать разницу между маркерами:
(--) автоопределение     (**) из конфигурационного файла  (==) по умолчанию
(++) из командной строки (!!) замечание                   (II) информация
(WW) предупреждение      (EE) ошибка                      (??) неизвестно
Вот пример того, как я могу получить полезную информацию из этого вывода:
  • я работаю с глубиной цвета 16 bpp:
    (**) TDFX(0): Depth 16, (--) framebuffer bpp 16
    
  • X определил чипсет моей видеокарты и объем ее памяти:
    (--) Chipset 3dfx Voodoo5 found
    (--) TDFX(0): VideoRAM: 32768 kByte Mapping 65536 kByte
Как я уже сказал, здесь есть все. Иногда трудно найти то, что ищешь. К тому же, если X уже запущен, вы должны сначала убить его, а иногда вы не хотите этого делать. Есть и другие способы получить информацию о X, но я не думаю, что какой-нибудь из них может дать такое изобилие знаний как этот. Рассмотрим их вкратце.

В Debian (и, возможно, в других дистрибутивах?) вывод startx идет в файл /var/log/Xfree86.0.log, таким образом вам не придется прибегать к "-probeonly".

3.1.2. xvidtune

xvidtune придет на помощь когда ваш экран в X слишком сдвинут вправо, или если вертикальный размер изображения слишком мал для вашего монитора. Однако, это еще и хороший инструмент для диагностики. Он сообщит вам:
  • Диапазоны вертикальной и горизонтальной разверток, заданные в вашем файле XF86Config
  • 4 числа для горизонтали и 4 числа для вертикали, которые определяют ваш видеорежим (первое для горизонтали и первое для вертикали дают разрешение экрана)
  • "dot clock" при котором работает ваша видеокарта

3.1.3. xwininfo

xwininfo дает вам все виды информации об окнах X. В действительности, "фоновое" или "корневое" окно рассматривается как обычное. Поэтому, когда xwininfo попросит вас кликнуть мышью на окне, о котором вы хотите получить информацию, кликните на фоне. Вам выведут такую информацию, как:
  • Разрешение экрана "Width" и "Height"
  • Глубина цвета "Depth"
и некоторые другие параметры, которые хотя и представляют интерес, но не относятся непосредственно к теме нашего разговора; такие как "Window Gravity State", который показывает где имеют тенденцию размещаться новые окна.

3.1.4. Другие источники информации

xdpyinfo показывает такую полезную информацию, как версию X и загруженные расширения (бесценно, если вам надо посмотреть что отсутствует в вашей системе, скажем GLX, DRI, XFree86-VidMode и. т. п.).

3.2. Получение информация о вашей 3D системе

glxinfo расскажет много полезного об OpenGL (используется-ли direct rendering, версии установленных glx и mesa, строки vendor/renderer, используемые библиотеки GL и еще много чего).

4.0. Различные темы

4.1. Memory Type Register Ranges

4.2. Выжимание производительности из вашей системы любой ценой

4.3. О библиотеках в Linux

5.0. Когда плохие вещи происходят с хорошими людьми

Конечно, мы не можем рассмотреть каждую неприятность, которая может произойти, но я выделю некоторые общие моменты.

Есть два типа Плохих Вещей: случайные и повторяющиеся. Крайне сложно выявить или исправить случайные проблемы, над которыми вы не имеете никакого контроля, и не знаете когда они происходят, а когда нет. Однако, когда проблема повторяется "когда я на третьем уровне и нажимаю два раза стрелку влево", то можно что-нибудь сделать.

5.1. ЧГИ!

Читайте гр*баную инструкцию [это вольный перевод известной фразы RTFM,-прим. ред.]. Инструкция может принимать одну из нескольких форм. С open source играми поставляются файлы readme. К коммерческим играм прилагается книжка с инструкцией и, может быть, какие-нибудь файлы readme на CD. Не забудьте о вэб-сайте игры. Возможно, автор много раз сталкивался с людьми, у которых возникла такая же проблема, и выложил на сайте соответствующую информацию. Хорошим примером может служить Loki Software с их online FAQs.

Если вы ненавидите ЧГИ, по крайней мере заимейте привычку пользоваться grep, вместо того, чтобы не заниматься ЧГИ вообще. Так, если ваша игра некорректно работает с сетью, вы всегда можете сделать "grep network *". Это лучше, чем вообще не смотреть на ГИ. Но все же надо попытаться прочитать инструкцию; люди, которые хотят все получать на блюдечке с голубой каемочкой, должны использовать продукты Microsoft, а не Linux.

5.2. Ищите обновления и патчи

Если это open source игра, которую вы сами откомпилировали, сходите на сайт игры и убедитесь, что у вас самая свежая версия. Если игра входит в дистрибутив, проверьте, не выпустил-ли его разработчик обновленный пакет rpm или deb для этой игры.

Разработчики коммерческих игр, такие как Loki, выпускают для своих игр патчи. Зачастую, игра имеет МНОГО патчей (Myth2), а некоторые без патчей доставляют определенные проблемы (Heretic2). Вы должны проверять сайт на наличие патчей вне зависимости от того, имеются у вас сейчас проблемы с игрой, или нет!

Кстати, у Loki теперь есть специальная утилита, которая ищет на вашем винчестере игры их производства и автоматически их обновляет. Спасибо им большое, это была отличная идея! Посмотрите на http://updates.lokigames.com.

5.3. Группы новостей

Если вы не знаете что такое netnews/newsgroups/nntp/usenet, то вам определенно стоит потратить 30 минут времени, чтобы узнать об этом. Установите программу для чтения новостей. Я предпочитаю консольные инструменты, поэтому использую tin, однако slrn тоже популярен. В Netscape также есть отличная графическая программа для этого.

К примеру, так можно подключиться к серверу новостей Loki:

  • tin -g news.lokigames.com
  • Большинство программ для чтения новостей будут соединяться с сервером, адрес которого содержится в переменной окружения NNTPSERVER. Вы можете установить ее командой:
    NNTPSERVER=news.lokigames.com
    tin -r
    
  • Большинство программ также заглядывает в файл /etc/nntpserver в поисках адреса сервера новостей.

5.4. Google

Все, что отправляется в usenet, архивируется на этом сайте. Раньше архив назывался deja (www.deja.com), но потом он был куплен google. Большинство людей все еще знают его как deja, поэтому я буду использовать это название.

Вы не являетесь настоящим пользователем Linux, пока вы не используете deja для решения своих проблем. В подавляющем большинстве случаев, вопрос о вашей проблеме (относящейся к играм или нет) уже появлялся на deja. Более того, наверняка уже был дан ответ на него. И не однажды, не дважды, а много раз. Если вам не понятен первый из ответов на ваш ворос (или он не помог), скорее всего вы получите и другие. Deja должен стать одним из ваших рефлексов на любую проблему.

Отправляйтесь на http://groups.google.com/advanced_group_search

Все очень просто. К примеру, если моя проблема в том, что Quake III падает всякий раз когда Lucy прыгает, я бы ввел в строке "Find messages with all of the words" следующее:

linux quake3 crash lucy jumps
или, если вы не можете заставить работать звук в Unreal Tournament:
linux UT sound problem
Вы можете включить в поиск название своей звуковой карты. Есть поля, позволяющие ограничить поиск определенными группами новостей. Выделите время, прочитайте и разберитесь, что обозначает каждое из них. Обещаю, этот сервис вас не разочарует. Используйте его и вы станете гораздо счастливее.

5.5. Отладка: стек и файлы core

Это отличается от того, что вы делали бы с коммерческой игрой. В случае игр с открытыми исходниками вы можете помочь автору, предоставив ему файл core или stack trace. В двух словах, core (он же core dump) -- это файл, содержащий "состояние" программы на момент сбоя. Он содержит полезную для программиста информацию о природе сбоя -- что стало причиной и что делала программа, когда это произошло. Если вы хотите побольше узнать о файлах core, у меня есть отличный gdb tutorial по адресу http://www.dirac.org/linux.

В крайнем случае автор заинтересуется содержимым стека на момент крушения. Вот как вы можете получить его.

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

ulimit -c unlimited
Теперь вы должны перекомпилировать программу и передать gcc опцию -g (объяснение этого лежит за рамками данного документа). Теперь запустите игру и сделайте то, что приводит программу к сбою и очередной генерации core. Запуститие отладчик с файлом core в качестве второго аргумента:
gdb CoolGameExecutable core
А после приглашения (gdb) введите "backtrace". Вы увидите что-то типа:
#0 printf (format=0x80484a4 "z is %d.\n") at printf.c:30
#1 0x8048431 in display (z=5) at try1.c:11
#2 0x8048406 in main () at try1.c:6
Это может быть долго, но все же, при помощи мыши скопируйте эту информацию в файл. Напишите автору письмо, в котором сообщите:
  1. Название игры
  2. Любые сообщения об ошибках, которые появляются на экране при сбое игры
  3. Что приводит к сбою и является ли он повторяющимся
  4. Стек программы
Если у вас широкий канал в Интернет, спросите автора не хочет-ли он получить файл core, созданный программой. Если он захочет, отправьте. Не забудьте сначала спросить, так как файлы core могут быть очень, очень большими.

5.6. Отложенные игры

Если в игре есть сохранение текущего состояния, то отправка автору отложенной игры очень важна, так как это позволит ему воспроизвести у себя проблему. Для коммерческих игр это более полезно, чем отправка файла core или стека, потому что они не могут быть перекомпилированы для включения отладочной информации. Опять же, стоит сначала спросить нужно-ли это, а уже потом отправлять, так как эти файлы обычно велики; но такая компания как Loki имеет достаточно широкий канал. Mike Phillips из Loki Software напоминает, что отправка отложенных игр -- это хорошая идея.

Стоит-ли добавлять, что все это имеет смысл проделывать лишь в том случае, если игра постоянно падает в определенной месте. Если же игра сбоит каждый раз, когда вы ее запускаете, или работает крайне медленно, файл с отложенной игрой ничем особенно помочь не поможет.

5.7. Что делать, если не найден файл или библиотека (лучшая жизнь через strace)

Иногда вы можете видеть сообщение об ошибке, указывающее на то, что не был найден файл. Файл может быть библиотекой:
% ./exult
./exult: error while loading shared libraries: libSDL-1.2.so.0: cannot load
shared object file: No such file or directory
или разновидностью файла с данными, таким как wad или map:
% qf-client-sdl
IP address 192.168.0.2:27001
UDP Initialized
Error: W_LoadWadFile: couldn't load gfx.wad
Предположим, что gfx.wad уже есть в системе, но не может быть найден, потому что находится не в том каталоге, в котором должен находиться. Тогда ГДЕ же он должен лежать? Не будет-ли полезно узнать где именно программа его ищет?

Это то, в чем блистает strace. strace говорит вам какие системные вызовы были сделаны, с какими аргументами и каковы были возвращенные значения. В моей книге `Kernel Module Programming Guide' (скоро выйдет в рамках LDP) я выделил все, что вы хотели бы знать о starce. Но вот краткая выдержка с использованием канонического примера того, что же из себя представляет strace. Введите команду:

strace -o ./LS_LOG /bin/ls
Опция -o направляет вывод strace в файл; здесь -- в LS_LOG. Последний аргумент -- проверяемая программа, здесь -- "ls". Посмотрите на содержимое LS_LOG. Весьма впечатляет, да? Вот типичная строка:
open(".", O_RDONLY|O_NONBLOCK|0x18000)  = 4
Мы использовали системный вызов open(), чтобы открыть "." с различными аргументами и было возвращено значение "4". Что он будет делать с файлами, которые не может найти?

Предположим, я хочу посмотреть демо StateOfMind, потому что оно мне никогда не надоедает. Я пытаюсь его запустить и происходит что-то нехорошее:

% ./mind.i86_linux.glibc2.1
Loading & massaging...
Error:Can't open data file 'mind.dat'.
Давайте используем strace, чтобы выяснить где именно программа искала этот файл.
strace ./mind.i86_linux.glibc2.1 2> ./StateOfMind_LOG
Запустив vim (потому что он крут) и включив поиск всех вхождений "mind.dat", я обнаружил следующие строки:
open("/usr/share/mind.dat",O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "Error:", 6Error:)   = 6
write(2, "Can\'t open data file \'mind.dat\'."..., ) = 33
Мы видим, что он искал mind.dat только в одном каталоге. Ясно, что mind.dat не в /usr/share. Теперь мы можем найти mind.dat (locate maind.dat) и переместить его в /usr/share.

Этот метод работает также и для библиотек. Предположим, библиотека libmp3.so.2 находится в /usr/local/include, но ваша новая игра "Kill-Metallica" не может ее найти. Вы можете использовать strace, чтобы определить где же Kill-Metallica искала библиотеку и создать в этом каталоге символическую ссылку на /usr/local/include/libmp3.so.2.

strace -- очень мощная утилита. Когда разбираешься почему что-то не было найдено, это ваш лучший союзник, это даже быстрее, чем поиск в исходниках. Последнее замечание: вы не можете искать информацию в исходниках коммерческих игр от Lokisoft или Tribsoft. Однако, вы все же можете использовать с ними strace!

6.0 Железо

6.1 Какая видеокарта самая лучшая?

Если вы используете Linux, вы должны быть достаточно умны, чтобы знать, что не существует простого ответа на этот вопрос. Пожалуй, сегодня можно выбрать из трех вариантов аппаратного 3D ускорения:
  1. 3dfx карты Voodoo
  2. Nvidia GeForce
  3. ATI Radeon
Королем горы в FPS выглядит GeForce, но только при низкой глубине цвета и невысоком разрешении. При более глубоком цвете, более высоком разрешении, королем является Radeon. Однако, GeForce дает немного лучшую картинку, хотя это может измениться как только в DRI-драйвер Radeon будет добавлена поддержка T&L.

Другой фактор -- принципы. По разным причинам, OpenGL-драйверы от Nvidia являются проприетарными и их исходники закрыты -- вы можете получить их только в бинарном виде. Драйверы от ATI и 3dfx полностью открыты. Лично я думаю, что это говорит в их пользу.

6.2. Какая звуковая карта самая лучшая?

Теперь, когда Linux начинает дозревать, этот вопрос не столь критичен, как был ранее. Давным-давно, звуковые карты без встроенных чипов MIDI (большинство PCI карт) не играли MIDI. Это, главным образом, было проблемой для таких вещей как xdoom или lxdoom, использующих musserv. Сегодня у нас есть такие эмуляторы MIDI, как Timidity, который не требует аппаратной поддержки MIDI. По правде сказать, у меня было много карт и я не могу найти какую-нибудь разницу между ними.

Думаю, ваше решение должно основываться на том, какая звуковая карта, насколько вы знаете, легче всего настраивается. sndconfig от RedHat не совершенен. Я видел, как он определил Creative PCI-128 как Soundblaster Live. Если у вас уже есть звуковая карта и она прекрасно работает, то это весьма хорошо. Если она работает не достаточно хорошо, то у вас, возможно, такая проблема, как конфликт IRQ. Если вы отправляетесь в магазин за звуковой картой, купите то, что отнимет всего секунду на настройку. Когда конфликт IRQ предстает перед вами во всей своей "красе", с картами PCI, как правило, иметь дело легче, чем с ISA.

Более серьезный вопрос -- колонки, но даже здесь разница невелика. У меня были дорогие колонки Altec Lansing, которые звучали лишь немного лучше, чем более дешевые. Обычно, при покупке колонок вы получаете ровно столько, сколько за них заплатили, однако не ждите феноменальной разницы. Единственное, что могу порекоммендовать -- купите что-нибудь с отдельным саб-вуфером; это действительно дает большую разницу в цене дополнительной мощности и соединительных проводов (идеальное применение для технологии Bluetooth или 802.11b).

6.3. Мыши

незакончено

7.0. Разное

7.1. Почему у меня не работает 3D ускорение? Почему Quake3 работает так медленно?

Если вы получаете около 1 fps, то ваша система не использует аппаратное ускорение 3D графики. Происходит одно из двух:
  1. Ваша 3D система не настроена (более вероятно)
  2. Игра X не настроена (менее вероятно)
Первый шаг -- выяснение того, что же конкретно происходит.
  1. Если у вас X 4.0 (пользователи X 3.* переходят прямо к пункту 2), посмотрите на вывод "X -probeonly". Вы увидите:
    (II) XXXXXX: direct rendering enabled
    
    либо
    (II) XXXXXX: direct rendering disabled
    
    где XXXXXXX -- некоторая строка, которая зависит от вашей видеокарты. Если это direct rendering disabled, ваша настройка X явно неправильна. Игра тут ни при чем. Вам нужно разобраться почему DRI не включается.

    Заметьте, что если вы прошли этот тест, ваша система СПОСОБНА производить direct rendering. Однако, ваши библиотеки все еще могут быть не в порядке. Поэтому, перейдем к пункту 2.

  2. Есть программа под названием gears, которая входит в пакет "mesademos". Вы можете получить mesademos при помощи debian (apt-get install mesademos), либо поискать rpm на rpmfind.net. Вы также можете скачать исходники с сайта mesa и откомпилировать их самостоятельно.
  3. Запустив gear, вы увидите вращающиеся шестерни. В xterm, в котором вы запустили gears, будет выводиться "X frames in Y seconds = X/Y FPS". Вы можете сравнить ваши показания с таблицей, приведенной ниже. Лучший вариант -- убить перед этим все некритичные процессы. Не имея миллион запущенных демонов, вы не будете волноваться, что ваш FPS не так хорош, как на похожей машине в таблице. Нет нужды запускать gears под root.
    CPU TYPE     VIDEO CARD     X VERSION    AVERAGE FPS
    
    Самостоятельная компиляция модулей Mesa и DRI может увеличить FPS на целых 20 кадров в секунду; реальное увеличение производительности! Так вот, если ваш FPS где-то на 30 меньше, чем на сравнимой с вашей машине, то скорее всего gears работает в software режиме. Другими словами, ваша видеокарта не ускоряет аппаратно 3D графику.

    Так же важно различие в FPS при разных размерах окна. Измените размер окна gears. Сделайте его большим, маленьким и на весь экран. Если аппаратное 3D ускорение работает, то FPS должен оставаться постоянным. В противном случае, 3D рендеринг, вероятно, производится программно, а не аппаратно.

7.2. Проблемы, характерные для Voodoo

В X 3.3 Voodoo производит аппаратное ускорение только при глубине цвета 16bpp и молча отказывается от него, если вы попробуете запустить X при цвете 32bpp. В X 4.0 ускорение работает при 16bpp и 24bpp, но X не сможет стартовать, если вы используете глубину цвета, которая не поддерживается Voodoo.

7.3. Почему не работает моя звуковая карта?

Прежде всего, дело может быть не в игре, а в вашей настройке. На сколько я знаю, есть 3 способа получить звук в Linux: свободные OSS драйверы, поставляемые с ядром Linux, драйверы Alsa и коммерческие драйверы OSS. Лично я предпочитаю свободные драйверы OSS, но многие люди верны Alsa. Коммерческие драйверы OSS хороши в том случае, если вы не можете заставить работать свою карту бесплатными способами. Не пренебрегайте ими; они очень недорогие (10-20 долларов), поддерживают самые новые карты и избавляют вас от многих вопросов в процессе настройки.

Есть 4 вещи, с которыми могут возникнуть проблемы:

  1. Разделение IRQ
  2. Неправильно настроенный драйвер
  3. Кто-то уже обращается к вашей звуковой карте
  4. Вы используете не тот драйвер

7.3.1. Разделение IRQ

Первое, что нужно сделать -- это выяснить нет-ли у вас конфликта IRQ. Карты ISA не могут разделять IRQ. Карты PCI -- могут, но определенные типы карт с широким диапазоном просто не любят делиться. Сюда входят сетевые и звуковые карты. Чтобы выяснить есть-ли у вас конфликт, введите "cat /proc/interrupts". На моей системе вывод такой:
# cat /proc/interrupts
           CPU0       CPU1
  0:   24185341          0          XT-PIC  timer
  1:     224714          0          XT-PIC  keyboard
  2:          0          0          XT-PIC  cascade
  5:    2478476          0          XT-PIC  soundblaster
  5:     325924          0          XT-PIC  eth0
 11:     131326          0          XT-PIC  aic7xxx
 12:    2457456          0          XT-PIC  PS/2 Mouse
 14:     556955          0          XT-PIC  ide0
 NMI:         0          0
 LOC:  24186046   24186026
 ERR:      1353
В нем присутствует вторая колонка, потому что на моей машине установлено 2 CPU (это называется SMP). Если у вас один процессор (называется UP, uniprocessor), то будет только одна колонка CPU. Числа слева -- назначенные IRQ, а строки справа показывают какое устройство испольует этот IRQ. Вы можете видеть, что у меня есть конфликт между звуковой картой (soundblaster) и сетевой картой (eth0). Они обе делят IRQ5. На самом деле, я специально подстроил этот пример, потому что хотел показать вам как выглядит конфликт IRQ. Но если бы у меня действительно был такой конфликт, то либо сетевая, либо звуковая карта отказалась бы работать.

Если моя звуковая карта PCI, предпочтительный способ исправить это -- просто переставить одну из карт в другой слот и надеяться, что BIOS разберется с этим. Более сложный способ -- пойти в BIOS и назначить IRQ на соответствующие слоты. Современные BIOS'ы позволяют это сделать.

Если карта ISA и при этом имеется IRQ конфликт, то я вынужден признать, что не знаю что с этим делать. Может быть, кто-нибудь согласится предоставить для этого HOWTO подробное описание того, как использовать isapnp и pnpdump.

7.3.2. Неправильно настроенный драйвер

Иногда карта привязана к определенному IRQ. Это встречается только среди карт ISA. Некоторые карты ISA могут быть настроены на нужный IRQ при помощи джамперов на самой карте. С такими типами карт вам необходимо передать драйверу правильный IRQ и доступ к памяти, I/O порт.

Эта проблема относится к звуковой карте и лежит за рамками темы этого HOWTO. (Я должен написать о том, как передать информацию в драйвер).

7.3.3. Кто-то уже обращается к вашей звуковой карте

Возможно, какое-то приложение уже обращается к ваше звуковой карте. К примеру, у вас может быть запущен проигрыватель MP3 и поставлен на паузу. Если кто-то уже обращается к карте, другие приложения не смогут этого сделать. Сделайте "ps ax" и ищите виновного. Несмотря на то, что esd (звуковой демон enlightenment) написан с расчетом на разделение звуковой карты между разными приложениями, я обнаружил, что иногда он не работает корректно. Убейте esd (killall -9 esd) и проверьте звук еще раз.

7.3.4. Вы используете не тот драйвер (или вообще его не используете)

Есть только 2 пути настроить вашу звуковую карту:
  1. Ядро должно быть откомпилировано с поддержкой звука
  2. В память должен быть загружен необходимый драйвер
Вы можете выяснить какой драйвер использует ваша карта, введя в консоли "lsmod" или посмотрев на вывод "dmesg". Поскольку звук важен для меня, я всегда компилирую ядро с поддержкой звука. Если драйвер у вас не загружен, то надо узнать что было вкомпилировано в ваше ядро. Это не так очевидно. Ваш лучший выбор -- откомпилировать ядро самостоятельно. Кстати, позвольте мне заметить, что компилирование вашего собственного ядра -- первый шаг в направлении получения опыта с Linux. В первый раз это болезненно, но как только вы это сделаете правильно, дальше все будет очень просто, особенно, если вы сохраняете старые .config-файлы и используете такие вещи, как "make oldconfig". Подробности -- в Kernel HOWTO.

Если вы не компилировали ядро самостоятельно, велики шансы того, что ваша система настроена на загрузку звуковых драйверов в качестве модулей. Так делают в дистрибутивах. Абсолютно все откомпилировали в качестве модулей и пытаемся загрузить это все. Поэтому, если вы не увидели драйвер звуковой карты при помощи lsmod, то ваша карта, вероятно, еще не настроена.

8.0 Вэб-сайты

8.1 Сайты, посвященные играм

8.2 Сайты коммерческих игр

  • Tux Games: www.tuxgames.com

    Магазин для покупки любых имеющихся на рынке коммерческих игр для Linux (кстати, у таких издателей как Tribsoft и Loki Software тоже есть online-магазины на их сайтах).

  • Loki Software: www.lokigames.com

    Как компания, создавшая quake3 для Linux, Loki является отцом игростроения в этой системе. Они были первыми и, кроме того, имеют на своем счету наибольшее число игр. Loki портирует игры в Linux, используя, главным образом, библиотеку SDL. У них есть столько игр (и у меня есть большинство их них ;) ), что я даже не буду пытаться описать их все.

  • Tribsoft: www.tribsoft.com

    У них виднеется на горизонте несколько отлично выглядящих rpg и симуляторов! На данный момент у них есть только Jagged Alliance 2, но скоро появятся Europai Universalis, Majesty и Unfinished Business.

    Jagged Alliance 2 -- это смесь rpg и симулятора. Вы -- наемник, который должен свергнуть жестокого диктатора в стране третьего мира. У нее есть некоторые проблемы со стабильностью, но это очень привлекательная игра и она хорошо сделана. Она получила награду как "самая сложная игра". Вы должны сами увидеть ее сложность, чтобы поверить.

  • Hopkins FBI: www.hopkinsfbi.com

    Это моя самая любимая игра навеки. Более жестокая чем Quake. Более пошлая чем Hustler. Более убойная чем Liberacce. Это комиксы на экране вашего монитора. Если кто-нибудь знает почему автор не хочет сделать Hopkins II -- скажите мне, пожалуйста!

  • Terminus: www.vvisions.com/terminus/index2.html

    Я купил ее, но пока не играл. Все еще обрабатываю Soldier Of Fortune. ;)

  • Phantom EFX: www.phantomefx.com

    Они предлагают вам Reel Deal Slots. Я поиграл в демо и оно очень неплохо сделано! Потом они выпустят Reel Deal Casino (первый квартал 2001) и Casino Tycon (доступно TBA).

  • Theocracy: www.theocracy.com

    Стратегия реального времени, где вы являетесь лидером Ацтеков от Ubisoft. Вы могли бы и не узнать никогда, что есть порт этой игры в Linux. За 10 минут серфинга я еле-еле нашел какие-то упоминания, что она доступна в Linux. Очевидно, доход от продажи Linux-версий здесь погоды не делает. Даже нет никакого упоминания на happypenguin.org!

  • Hyperion Software: http://www.hyperion-software.com

    Эта компания портировала Shogo: Mobile Armor Division (основанный на Robotech FPS, вдохновленный аниме). Они также портируют SiN, очень круто выглядящий FPS; выглядит похоже на SoF. Демо -- просто супер, но я слышал, что проект может быть приостановлен. Скрестите ваши пальцы.

8.3 Сайты об играх, достойные внимания

Три главные проекта Doom:
  1. prboom.sourceforge.net - Кросс-платформенный порт движка Doom/Doom II под GPL
  2. www.doomlegacy.com - Кросс-платформенный порт движка Doom/Doom II под GPL
  3. zdoom.notgod.com - Кросс-платформенный порт движка Doom/Doom II НЕ под GPL (исходники доступны)

tuxaqfh.sourceforge.net - Tux: A Quest For Herring

8.4 Другие сайты

Гораздо проще заставить работать "родной" код, но для программ, которые никогда не будут портированы в Linux, всегда есть эмуляция.
  • www.dosemu.org - Сайт DOSEMU - эмуляция DOS и немного win32
  • www.winehq.org - Сайт WINE - эмуляция Win32
  • www.transgaming.com - Нацелены на улучшение поддержки DirectX в проекте WINE.
[Источник: linux-ve.net]

[ опубликовано 14/06/2003 ]

Peter Jay Salzman (p@dirac.org). Перевод: Дмитрий Самойлов (dsamoyloff@mail.ru) - The Linux Gamers' HOWTO   Версия для печати