ゲームの仕事でC ++の実務経験を積む最良の方法(C#から提供)[終了]


19

私はソフトウェア開発者であり、他のいくつかの言語とともにC#(5年の経験)を経験しています。

私の「夢の仕事」は、開発者としてビデオゲームで働いています。

ほとんどの仕事にはC ++の知識が必要ですが、私は現在持っていません(一部の基本を除きます)。

私は見て回ったが、ほとんどの大手ゲーム会社は、C ++の3〜5年の過去の経験に沿って何かを必要としています。

私の質問は、C#から来て、この必要な経験レベルに到達するための良いルートは何でしょうか?

私はそれを行ういくつかの可能な方法を考えました:

C ++についての知識を書籍から入手してください。C ++で記述されたオープンソースプロジェクトに参加します。特にゲーム業界で、C ++を学習し、実用レベルの経験を積むための最良の方法は何でしょうか?


1
おかげで私はそれをチェックアウトします。プログラミングの初心者ではないので、これがまったく同じ質問かどうかはわかりませんが。
spaceOwl

3
経験をどのように、どこで得たのか、それに対する支払いを受けたかどうかは誰も気にしません。C ++の経験が必要な場合は、C ++のプログラミングを開始してください。
マイクセンダー

@liortal Repost:初心者向けの素晴らしいヒントは何ですか?(一部の変人は、このスレッドに関する私のコメントをすべて削除しました)。
ボボボボ

回答:


29

ゲーム開発者として、C#を雇う私の主な関心事は、低レベルの知識の欠如です。

そのため、クラスのデータレイアウトの再配置やコードの書き換えなど、SIMD命令を活用するような低レベルの最適化が必要なプロジェクトを検討してください。C ++オープンソースゲームを取得して最適化し、履歴書にフレームレートの増加を投稿します。

私があなたにインタビューしていたら、履歴書のC ++についてはあまり気にせず、私のC / C ++ /低レベルのインタビューの質問に答えられるかどうかについてはもっと気にします。面倒なかもしれないいくつかの標準的なインタビューの質問に突き刺します(警告:私はC#の専門家ではありません):

  • C ++クラスはメモリ内でどのようにレイアウトされますか?バイトの図を描きます。vtableポインターとメンバー変数のパディング/アライメントを含めます。派生クラスはどうですか?多重派生クラスはどうですか?
  • 低レベルで仮想関数呼び出しはどのように発生しますか?メモリ内の値の読み取りやアドレスへのジャンプなどのアセンブリ操作について話します。
  • さまざまな継承関係を持つ型へのポインター間のCスタイルのキャスト、static_cast、およびdynamic_castについて理解します。たとえば、クラスBとCは両方ともクラスAから派生しています。これらのさまざまなキャストを使用してA *からB *(またはB *からC *)にキャストしようとするとどうなりますか?(C#がこれらの特定のキャストさえ許可するとは思わないので、私は言及します。)
  • 参照ではなく値でstlベクトルを渡すのが恐ろしいのはなぜですか?(C#のほとんどの型は参照型であり、したがって、C#でこの種の間違いを犯すことは基本的に不可能だからです。)
  • 構造または機能がキャッシュフレンドリーであるとはどういう意味ですか?なぜ構造体の配列が構造体の配列よりも優れているのでしょうか?
  • ヒープ、スタック、および静的メモリを理解します。オブジェクトにnewが割り当てられた場合、プロセスのメモリのどこに存在しますか?ローカル変数はどうですか?グローバル変数?
  • メモリリークとは何ですか?それらを避けるためのいくつかのベストプラクティスは何ですか?(C#には削除がないので言及します!)
  • メモリアクセス違反のクラッシュをどのようにデバッグしますか?ソースコードがないミドルウェアライブラリでクラッシュが発生した場合はどうでしょうか。

1
再投稿:vtableのポインタがメモリのどこにいるか、私はに走ったので、私はすでに知っての有用性を知る前にすることを含むバグ。しかし、2番目の質問はどのように役立ちますか?「メモリに値を読み込むようなアセンブリレベルの操作」を知っていると、有能なC ++プログラマーになるのはどうしてでしょうか
ボボボボ

WoW UIインターンスポットに関するブリザードのインタビューでは、ポイント1、2、3(程度は低いが)、5、7に触れました。彼はデバッグ/テストについても質問しました(ポイント8と同様)。上位レベルのゲーム開発会社の一般的な場合でも。
ディーンナイト

2
@DeanKnight私はそれを疑いません。しかし、私はOPがその種の質問が誰かを良いC ++プログラマー(元の質問はより良いC ++プログラマーになる方法に関するものです)にするのではなく、誰かがインタビューのエースを助けるのとはどう違うのかを知りたいです。
ボボボボ

2
あなたは懐疑的で、ボボボボに聞こえますが、vtableポインターのバグについてのリンクは、仮想関数呼び出しの内部を知ることがどのように役立つかの良い例です。同様のバグを考えてみましょう。vtableポインターがnullである代わりに、ガベージです。ガベージであることに気付く 1つの方法は、仮想関数呼び出しの逆アセンブリを実行し、有効なvtableまたは有効なメソッドに移動する代わりに、プログラムがどこにも行かないことを確認することです。
エリックアンダーサンダー

1

エリックが言ったこと。また、必要のない「新しい」ものを避けるために付け加えます。C#では非常に一般的ですが、C ++ 11では悪い習慣と見なされ、スタックの割り当てよりも遅く、手動で割り当てを解除する必要があるため、より危険です。

私も古い本に注意します、彼らは古い習慣を教えます。個人的には、信頼できるフォーラム/ウェブサイト、stackoverflow / isocppを好みます。


ありがとう。勉強する言語の詳細ではなく、何をすべきかについての、より広く、より一般的なアドバイス/推奨事項を探していました。
spaceOwl

「回避new」は、実際には賢明な推奨事項ではありません。newポインターがあるときに使用します。の場合class Derived : Base、a Base var = Derived();は違法ですがBase *var = new Derived();、合法です。したがって、ポリモーフィズムを適切に機能させるためには、ポインターが必要です。
ボボボボ

はい。ただし、std :: unique_ptrを使用してポリモーフィズムを達成し、ネイキッドポインターを避けることができます(unique_ptrコンストラクターに新しいキーワードが残っていますが)
Eric B

申し訳ありませんが、上記のコメントを間違えました。 Base var = Derived() 働くだろうが、それはされるだろうスライスと、あなたに知られず、情報がで失われましたvar。スライスの問題を修正するには、ポインターを使用できます。
ボボボボ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.