Найкращий спосіб набути досвіду роботи на C ++ для роботи в іграх (з C #) [закрито]


19

Я розробник програмного забезпечення, який маю досвід роботи з C # (5 років досвіду) поряд з кількома іншими мовами.

Моя «робота мрії» - це робота у відеоіграх як розробник.

Більшість робочих місць вимагають знання C ++, яких у мене зараз немає (за винятком деяких основ).

Я оглянувся, і більшість великих ігрових компаній вимагають чогось 3-5 років попереднього досвіду роботи з C ++.

Моє запитання - який би був хороший маршрут, щоб я піднявся до цього необхідного рівня досвіду, що йде від C #?

Я продумав кілька можливих способів зробити це:

Отримайте більше знань про C ++ з книг. Брати участь у проектах з відкритим кодом, які написані на C ++. Який був би найкращий спосіб вивчити C ++ та мати досвід роботи на ньому, зокрема для ігрової індустрії?


1
Дякую, я перевірю це. Хоча я не впевнений, це точно таке саме питання, оскільки я не початківець у програмуванні.
spaceOwl

3
Ніхто не переймається тим, як чи звідки ви отримали свій досвід, чи платили ви за це чи ні. Якщо ви хочете отримати досвід C ++, починайте програмувати C ++.
Майк Семдер

@liortal Repost: Дивіться також Які є чудові поради для початківця? (деякі диваки видалили всі мої коментарі до цієї теми).
bobobobo

Відповіді:


29

Як розробник ігор, головним моїм клопотом найняти хлопця C # буде брак знань низького рівня.

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

Якби я брав інтерв'ю з вами, я б менше піклувався про C ++ у вашому резюме, а більше про те, чи можете ви відповісти на мої запитання щодо співбесіди C / C ++ / низького рівня. Я зафіксую декілька стандартних запитань щодо інтерв'ю, у яких можуть виникнути проблеми (попередження: я не експерт C #)

  • Як класу C ++ закладені в пам'яті? Намалюйте схему байтів. Включайте vtable покажчики та доповнення / вирівнювання змінних членів. Що з похідним класом? А як щодо класу з множинними похідними
  • Як відбувається виклик віртуальної функції на низькому рівні? Поговоріть про такі операції складання, як прочитання значення в пам'яті та перехід до адреси.
  • Знайте інформацію про формати C, static_cast та dynam_cast між покажчиками на типи з різними відносинами успадкування. Наприклад, класи B і C походять від класу A. Що відбувається, коли ви намагаєтеся передати з A * до B * (або B * до C *), використовуючи ці різні касти? (Я згадую, тому що я не думаю, що C # навіть дозволить ці конкретні касти.)
  • Чому страшно передавати вектор значення stl замість посилання? (Я зазначу, що більшість типів у C # є типовими типами, і, таким чином, помилку в C # в принципі неможливо.)
  • Що означає, щоб структура або функція були кешовими? Чому структура масивів може працювати краще, ніж масив структур?
  • Зрозумійте купу, стек та статичну пам'ять. Якщо об'єкт був виділений новим, де він живе в пам'яті процесу? Що з локальною змінною? Глобальна змінна?
  • Що витік пам'яті? Які існують найкращі практики їх уникнення? (Згадую, оскільки в C # немає видалення !)
  • Як би ви налагодили помилку порушення доступу до пам'яті? А як бути, якщо збій стався в бібліотеці середнього програмного забезпечення, для якої у вас немає вихідного коду?

1
Репост: Я вже знаю корисність того, щоб знати, де вказівники Vtable є в пам'яті, тому що я натрапив на помилку, пов’язану з цим раніше . Однак чим корисне 2-е питання взагалі? Як знання "операцій рівня складання, таких як зчитування значення в пам'яті", робить одного компетентним програмістом C ++?
bobobobo

Мій інтерв'ю Blizzard для інтернату WoW UI торкнувся пунктів 1, 2, 3 (меншою мірою), 5 та 7. Він також задав питання про налагодження / тестування (подібне до пункту 8). Я думаю, що ця відповідь є точно місцем навіть у загальному випадку для компаній, що займаються розробкою ігор вищого рівня.
Дін Лицар

2
@DeanKnight Я в цьому не сумніваюся. Але я все ж хотів би знати, як ОП вважає, що подібне питання робить когось хорошим програмістом на C ++ (оригінальне питання про те, як стати кращим програмістом на C ++), а не просто допомагати комусь на співбесіді.
bobobobo

2
Ви звучаєте скептично, bobobobo, але ваше посилання про помилку vtable pointer є чудовим прикладом того, як знати внутрішню інформацію про виклики віртуальних функцій корисно. Розглянемо аналогічну помилку, де замість нульового вказівника нульовим є сміття . Одним із способів зрозуміти, що це сміття, було б перейти до розбирання виклику віртуальної функції і побачити, як ваша програма відпадає нікуди, замість того, щоб перейти до дійсного vtable або допустимого методу.
Ерік Ундерсандер

1

Що сказав Ерік. Я також додам, щоб уникнути "нового" там, де це не обов'язково. Це дуже часто зустрічається в C #, але вважається поганою практикою в C ++ 11, а також повільніше, ніж розподіл стеків, і більш небезпечним, оскільки вам доведеться вручну розміщувати його.

Я б також був обережним зі старими книгами, вони вчать старі практики. Я особисто віддаю перевагу надійним форумам / веб-сайтам, stackoverflow / isocpp.


Спасибі. Я шукав більш широкі, більш загальні поради / рекомендації щодо того, що робити, а не мовні особливості для вивчення.
spaceOwl

"Уникання new" - це справді не розумна рекомендація. Ви використовуєте, newколи у вас є покажчики. Якщо class Derived : Base, то a Base var = Derived();є незаконним, але Base *var = new Derived();законним. Тож вам потрібні покажчики, щоб поліморфізм працював правильно, багато.
bobobobo

Так, але ви можете використовувати std :: unique_ptr для досягнення поліморфізму та уникнення голого покажчика (хоча у вас все одно буде нове ключове слово у конструкторі unique_ptr)
Ерік Б

Вибачте, я помилився у вищенаведеному коментарі. Base var = Derived() працювало б , але це було б нарізаною і, невідомо вам, інформацією, загубленою var. Щоб вирішити проблему нарізки, ви можете використовувати вказівники.
bobobobo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.