Pull to refresh

Самые распространённые вопросы на собеседовании программиста графики

Reading time 5 min
Views 50K
Original author: Eric Arnebäck
Недавно я проходил собеседования в игровых студиях на младшего программиста графики. По итогу я узнал, каких навыков они ожидают от начинающего программиста и какие вопросы могут задать. В этой статье я собрал вопросы в удобный список. Смысл в том, чтобы другие начинающие программисты могли использовать его для подготовки, прежде чем идти на первое собеседование. Но хочу оговориться, что я не рекомендую просто запоминать ответы на эти вопросы. Темы в списке — это темы, которые следует понять и освоить, чтобы решать реальные проблемы программирования графики. Их нужно понять, а не запомнить ответы.

Вопросы делятся по темам: С++, математика, оптимизация и компьютерная графика. Очевидно, это главные темы в повседневной работе. C++ часто используется в реальных задачах, поэтому естественно, что на собеседовании задают много вопросов по нему. Кроме того, в программировании графики требуется лучшее знание математики, чем в большинстве других видов программирования, поэтому математические навыки имеют первостепенное значение. Наконец, для достижения 60 FPS и рендеринга с высокой графической точностью обязательными являются сильные навыки оптимизации. Давайте рассмотрим популярные вопросы в каждой категории.

Вопросы по C++


  • Когда следует использовать виртуальные деструкторы? (Интервьюеры в совершенном восторге от этого вопроса!)
  • В чём разница между выделением памяти в куче и стеке?
  • Какие фичи C++11 и C++14 вы используете?
  • Для чего используются шаблоны?
  • Объясните ключевое слово inline.
  • Что такое прямой и обратный порядок байтов (от старшего к младшему и от младшего к старшему)?
  • Объясните, что такое const-корректность.
  • Какие накладные расходы связаны с вызовом виртуальной функции?
  • Вероятно, в каком-то вопросе вас попросят выполнить некие трюки по жонглированию битами с помощью операторов вроде &, / и им подобным.
  • Вероятно, в каком-то вопросе вас попросят что-то сделать со структурами данных, связанными указателями, вроде дерева. Например, обратить связный список.
  • Каков размер указателя в C++ (то есть что показывает sizeof для указателя)?

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

Вопросы по математике


На самом деле вопросы по математике довольно однообразны.

  • Что такое скалярное произведение?
  • Что такое векторное произведение?
  • Почему следует использовать кватернионы вместо углов Эйлера?
  • Как применить матрицы для преобразования объекта? Например, как с помощью матриц масштабировать, преобразовать и повернуть объект?
  • Как рассчитать пересечение между лучом и плоскостью/сферой/треугольником?
  • Объясните концепции пространства мира, пространства объектов и пространства камеры.

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

Вопросы по оптимизации


  • Как применить иерархию ограничивающих объёмов (или octree, или что-то подобное) для ускорения трассировщика лучей?
  • Расскажите о кэш-памяти (кэши L1, L2 и так далее).
  • Что такое дизайн на основе данных?
  • Объясните, как оптимизировать отсечение по пирамиде видимости с помощью многопоточности и SIMD (например, см. пост в блоге Андреаса Асплунда).
  • У вас есть опыт использования инструментов профилирования производительности для GPU?

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

Вопросы по компьютерной графике


  • Какие вы знаете методы сглаживания (варианты: MSAA, MLAA, FXAA и TXAA)?
  • Каковы типичные элементы движка рендеринга (например, система для обработки отсечения по пирамиде видимости, рендеринга теней, обработки источников света с чем-то вроде отложенного/прямого затенения, система обработки материалов в движке и проч.)?
  • Какие вы знаете методы генерации теней (есть КУЧА техник генерации теней, например, разностные теневые карты, сглаживание порога с помощью экспоненциальной функции и более свежий метод моментов)?
  • В чём плюсы и минусы отложенного рендеринга?
  • Объясните, что такое физически корректный рендеринг?
  • Можете объяснить, как работает уравнение рендеринга?
  • Что такое BRDF? Что имеют в виду, когда говорят, что «BRDF сохраняет энергию»?
  • Как сказываются на производительности ветвления в шейдере (подсказка: почитайте о концепции варпов в архитектуре GPU)?
  • Какие преимущества у новых API, таких как Vulkan и DirectX 12, по сравнению со старыми OpenGL и DirectX 11 (подсказка: главное — сниженная нагрузка на драйвер)?
  • Какую последнюю научную статью по графике вы читали, можете ли её объяснить (это довольно распространённый вопрос)?
  • Опишите весь графический конвейер (вероятно, ответ будет довольно длинным. Вы расскажете о вершинном шейдере и фрагментном шейдере, о перспективно-корректной интерполяции, о Z-буфере, о двойной буферизации фреймбуфера, об альфа-смешивании, матрицах преобразования, однородных координатах, моделях отражения во фрагментном шейдере и так далее).

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

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

Некоторые из вас ещё учатся и выбирают предметы учебной программы для работы в компьютерной графике. Мой совет — сосредоточить усилия в первую очередь на высокопроизводительных вычислениях и прикладной математике. Из предметов по программированию попробуйте освоить многопоточность, компьютерную архитектуру и GPGPU, а также другие темы, связанные с высокопроизводительными вычислениями. Из курсов математики — линейная алгебра, многомерное исчисление (думаю, в США этот курс называется Calculus III), теория вероятностей, численная оптимизация, дифференциальные уравнения и вычислительная геометрия. В первую очередь сосредоточьте внимание именно на прикладной математике, а не на более абстрактных математических темах, таких как топология и абстрактная алгебра, поскольку они не так нужны в компьютерной графике.

В общем, от вас не ожидают, что вы разбираетесь во всех нюансах компьютерной графики. Понятие «компьютерная графика» охватывает широкий диапазон тем, таких как глобальное освещение, отбраковка с учётом препятствий (occlusion culling), генерация теней, трассировка пути, жидкостное моделирование, обработка геометрии, GPGPU, физически корректный рендеринг и так далее. Было бы неразумно ожидать, что джун знает все нюансы этих тем. Но если вы что-то укажете в резюме, будьте готовы подробно ответить на эту тему.

Таким образом, не нужно знать ВСЁ о компьютерной графике. Часто бывает, что вас просят рассказать о главных проектах, над которыми вы работали. Затем интервьюер задаст много дополнительных вопросов и попросит подробно объяснить детали вашего проекта. Поэтому мой совет: перед собеседованием выберите несколько проектов, которыми особенно гордитесь — и готовитесь к подробному объяснению.

По-моему, лучший способ подготовиться к собеседованию — поработать в свободное время над большим количеством сторонних проектов. Демонстрация проектов, над которыми вы работали — хороший способ показать себя и продемонстрировать, что вы действительно увлечены этим делом. Наконец, работа над сторонними проектами позволит отточить навыки программирования. А это, в свою очередь, сильно поможет отвечать на все вопросы, которые я перечислил в этой статье.
Tags:
Hubs:
+49
Comments 53
Comments Comments 53

Articles