Сколько сборок действительно используется в современном игровом коде? [закрыто]

21

В среднем, как часто сборка используется в современном игровом коде?

В частности, на платформах, которые уже имеют хорошие компиляторы C ++, такие как x86, PPC или ARM - потому что я предполагаю, что игры на встроенных системах широко используют ассемблер.

Легион
источник
4
C ++ не компилируется в сборку - он компилируется в машинный код. Язык ассемблера - это способ напрямую указать, какой именно машинный код вы хотите сгенерировать.
Kylotan
6
C ++ (обычно) на самом деле не компилируется в ассемблер, он компилируется непосредственно в машинный код. Вопрос, вероятно, относится к тому, сколько рукописной сборки связано с проектом или записано как встроенная сборка.
1
Несмотря на это, я не думаю, что есть практический, полезный ответ на этот вопрос. Это в основном зависит от подобных факторов, многие из которых являются субъективными (то есть мнения авторов кода).
1
В наши дни не так уж важно писать ассемблер, за некоторыми исключениями, такими как программирование SPU, но умение читать это важно для анализа аварийных дампов
Maik Semder
4
@Legion - вы можете заставить компилятор / IDE выдавать сборку, но это не значит, что компилятор создает сборку как часть обычного процесса компиляции. Для этого нет необходимости, и, следовательно, большинство этого не делают.

Ответы:

29

Ответ немного зависит от того, что вы подразумеваете под «игрой», и «используется». Я предполагаю, что «использованный» означает «написанный в ходе конкретного игрового проекта».

По моему опыту и неподтвержденным данным от людей, с которыми я разговаривал:

  • в браузерных играх? Никто.
  • в типичных компьютерных играх? Никто. (Но вы можете увидеть некоторые в низкоуровневых библиотеках.)
  • в iOS и Android играх? Никто.
  • "ААА" компьютерные и консольные игры? Может быть, немного, возможно, 0,05% кодовой базы. (С немного больше в библиотеках.)

Знание языка ассемблера не ожидается для работы в игровой индустрии, но в зависимости от типа игр, которые вы делаете, это может оказаться полезным.

Раньше был аргумент, что компилятор лучше оптимизирует код на C, чем человек с рукописной сборкой. Обычно это правда, иногда это ложь. Но в наши дни сочетание постоянно растущей сложности ЦП и необходимости масштабирования (то есть для разделения процессоров) означает, что усилия по оптимизации обычно проводятся в другом месте.

В последние годы я видел только ассемблер в коде игры с __asm int 3заявлениями о принудительной установке точек останова, и мое единственное личное использование ассемблера было при рассмотрении разборки функции для диагностики необычных ошибок при сбое.

Kylotan
источник
1
Как насчет инструкций SSE?
Легион
4
@ Legion, люди обычно пишут код SSE, используя встроенные или математические библиотеки, которые обертывают материал SSE, или на специализированном мини-языке, специально разработанном для компиляции в SSE, таком как ispc . Написание сборок напрямую все еще довольно редко.
Натан Рид
1
Что касается игр для iOS: если я правильно помню, в библиотеке 3D / Math Oolong использовалась встроенная сборка ARM. Это больше не нужно, так как Apple выпустила платформу Accelerate.
Николас Миари
Согласна с Натаном - SSE и подобные оптимизации для конкретных инструкций обычно существуют в библиотеках (поскольку они, как правило, являются единственными местами, где общая полученная прибыль стоит вложенных усилий).
Kylotan
26

Большая часть высокопроизводительного кода в современных консольных играх написана с использованием своего рода промежуточного звена между ассемблером и C ++: внутренними особенностями компилятора . Эти конструкции выглядят и анализируются как функции C ++, но фактически транслируются в отдельные машинные инструкции . Так, например, моя функция «зажимать каждое значение вектора V, чтобы быть> = a и <= b» выглядит так

// for each v.x, ensure v.x >= a.x && v.x <= b.x
inline __m128 ClampSIMD( const __m128 &v, const __m128 & a, const __m128 & b )
{
    return _mm_max_ps( a, _mm_min_ps( v, b ) );
}

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

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

Хотя мы не можем кодировать в сборке, мы все равно много отлаживаем в сборке. Оптимизация компиляторов агрессивно реорганизует код таким образом, что отладчики не могут справиться с этим, поэтому часто при отладке сборки «режима выпуска» лучше всего открывать дизассемблер и таким образом отслеживать код. Этот доклад GDC о «судебной отладке» сбоев иллюстрирует многие причины и способы отладки на этом уровне.

Crashworks
источник
3
+1 просто потому, что Crashworks в SO хорошо известен как «тот парень, который пишет действительно низкоуровневый оптимизированный код для игр» - если кто-то знает об этой теме, то это он.
BlueRaja - Дэнни Пфлюгофт
@ BlueRaja-DannyPflughoeft "Хорошо известно"? Я польщен! =) Забавное совпадение, в свете комментариев Натана Рида, состоит в том, что я выучил многие из моих навыков оптимизации низкого уровня в Naughty Dog.
Crashworks
В других местах я также слышал о важности сборки при отладке. Так что я собираюсь выучить это. Спасибо за понимание и ссылки.
Легион
7

Проблем, которые раньше требовали ручной сборки, становится все меньше. То, что вы «можете» набрать в скорости, вы потеряете в удобочитаемости и возможности отладки. Это также следует делать только в качестве одного из самых последних шагов оптимизации для разделов кода, поскольку в большинстве случаев проблемы со скоростью не являются чем-то, что нельзя улучшить с помощью сборки. В наши дни процессоры стали намного быстрее, а скорости памяти - нет, часто важнее контролировать, как данные проходят через процессор, чем что-либо еще.

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

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

Роджер Перкинс
источник
1
Даже на PS3 люди обычно не совсем программируют на голой сборке. Существует инструмент, который позволяет вам писать код в синтаксисе, подобном ассемблеру, где вы указываете машинные инструкции, но он выполняет распределение регистров, планирование команд и конвейерную обработку цикла для вас. Ну, может, Naughty Dog действительно делает все это вручную, но даже большинство разработчиков PS3 SPU этого не делают. :)
Натан Рид
1
@NathanReed В дни PS2 конвейерная обработка циклов вручную была частью интервью программиста Naughty Dog.
Crashworks
-1

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

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

Homer
источник