最新のゲームコードで実際に使用されるアセンブリの量はどれくらいですか?[閉まっている]


21

平均して、アセンブリは現代のゲームコードでどれくらいの頻度で使用されますか?

特に、x86、PPC、ARMなどの優れたC ++コンパイラを既に搭載しているプラ​​ットフォームでは、組み込みシステムのゲームはアセンブリを広範囲に使用すると想定しているためです。


4
C ++はアセンブリにコンパイルされません-マシンコードにコンパイルされます。アセンブリ言語は、生成するマシンコードを正確に直接指定する方法です。
キロタン

6
C ++は(一般に)実際にアセンブリにコンパイルされるのではなく、マシンコードに直接コンパイルされます。問題はおそらく、プロジェクトにどれだけの手書きアセンブリがリンクされているか、インラインアセンブリとして記述されているかということです。
ジョシュ

1
とにかく、私はこの質問に対する実用的で有用な答えがあるとは思わない。基本的には、多くの主観的な要因(つまり、コードの作者の意見)のような要因に依存します。
ジョシュ

1
そんなに書き込みが組み立てSPUプログラミングのようないくつかの例外を除いて、これらの日が重要であるが、それを読むことができることは、クラッシュダンプを分析するために重要である
はMaik Semder

4
@Legion -あなたがするコンパイラ/ IDEを引き起こす可能性が発するアセンブリが、それはコンパイラは通常のコンパイルプロセスの一部として組み立て生産することを意味するものではありません。それはそうする必要はなく、その結果、ほとんどは必要ありません。
ジョシュ

回答:


29

答えは、「ゲーム」の意味と「使用」に少し依存します。「使用済み」は「特定のゲームプロジェクトの過程で作成された」ことを意味すると想定します。

私の経験と話をした人からの逸話的データで:

  • ブラウザベースのゲームで?なし。
  • 典型的なPCゲームで?なし。(しかし、低レベルのライブラリにいくつか見られるかもしれません。)
  • iOSとAndroidゲームで?なし。
  • 「AAA」PCゲームとコンソールゲーム?コードベースの少し、おそらく0.05%かもしれません。(ライブラリにはもう少しあります。)

アセンブリ言語の知識は、ゲーム業界での仕事には期待されていませんが、作成するゲームの種類によっては有利になる場合があります。

以前は、コンパイラがCコードの最適化において、手書きのアセンブリを使用する人間よりも優れた仕事をしているという議論がありました。通常、それは真実です、時にはそれは偽です。しかし最近では、CPUの複雑化と「スケールアウト」(つまり、プロセッサの分離)の必要性の組み合わせにより、最適化の努力は通常他の場所で費やされています。

近年、ゲームコードでアセンブリを見たのは__asm int 3、ブレークポイントを強制するステートメントだけでした。アセンブリの個人的な用途は、異常なクラッシュバグを診断するための関数の逆アセンブリを調べることだけでした。


1
SSEの指示はどうですか?
軍団

4
@Legion、人々は通常、組み込み関数、SSEをラップする数学ライブラリ、またはispcなどのSSEにコンパイルするために特別に設計された特殊なミニ言語のいずれかを使用してSSEコードを記述します。アセンブリを直接記述することはまだ非常にまれです。
ネイサンリード

1
iOSゲームに関して:私の記憶が正しければ、3D / MathライブラリOolongはいくつかのインラインARMアセンブリを使用していました。AppleはAccelerateフレームワークをリリースして以来、これはもはや必要ありません。
ニコラスミアリ

Nathanと合意-SSEおよび同様の命令固有の最適化は、通常、ライブラリ内に存在します(通常、得られる総利益が努力する価値がある唯一の場所であるため)。
キロタン

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で記述するのが便利です。

特に現代のコンパイラーはコードをベクトル化するのがひどいので、賢い人間がどれだけうまくやれるかと比較して、CPUがサポートする命令を認識する必要があります。また、コードの配置方法の微妙な詳細がパフォーマンスに大きな影響を与える場合があります、これはマシンが何をしているのかを理解しないと明らかではありません。

アセンブリでコーディングすることはできませんが、アセンブリで多くのデバッグを行います。コンパイラーの最適化は、デバッガーが追いつかない方法で積極的にコードを再編成するため、多くの場合、「リリースモード」ビルドをデバッグするときに行う最良の方法は、逆アセンブラを開いてコードをトレースすることです。クラッシュの「フォレンジックデバッグ」に関するこのGDCトークは、そのレベルでのデバッグの多くの理由と方法を示しています。


3
+1 CrashworksがSOで「ゲーム用に本当に低レベルの最適化されたコードを書く人」としてよく知られているからです -このトピックを知っている人は彼です。
BlueRaja-ダニーPflughoeft

@ BlueRaja-DannyPflughoeft「よく知られている」?おめでとうございます!=)ネイサンリードのコメントを踏まえると、Naughty Dogで低レベルの最適化スキルの多くを学んだのは面白い偶然です。
クラッシュワークス

他の場所では、デバッグにおけるアセンブリの重要性も聞いています。だから私はそれを学ぶつもりです。洞察とリンクをありがとう。
軍団

7

ハンドアセンブリを必要としていた問題の数は少なくなっています。読みやすさとデバッグ機能が失われると、スピードが向上する可能性があります。また、ほとんどの場合、速度の問題はアセンブリでは改善できないものではないため、コードのセクションの最後の最適化手順の1つとしてのみ実行する必要があります。最近では、CPUの速度は大幅に向上していますが、メモリの速度は向上していません。多くの場合、データがCPUをどのように流れるかを制御することが重要です。

最新のコンパイラーでは、ユーザーが触れたレジスターを処理する必要があるため、アセンブリコードを中心に最適化することも難しく、通常、手作りのコードで命令を並べ替えることはできません。アセンブリの必要性を減らすために、低レベルの概念にアクセスするのに役立つ組み込み関数もありますが、コンパイラーにとって使いやすく、反対にではなくユーザーと連携できるようになっています。

そうは言っても、PS3のSPUは、たとえばここで説明するように手動の命令パイプラインを使用して、プロセッサを最大限に活用するためにアセンブリを使用しなければならない領域の1つです


1
でもPS3上で、人々は通常はない、非常に裸のアセンブリ内のプログラムを。アセンブリのような構文でコードを記述できるツールがあり、マシン命令を指定しますが、レジスターの割り当て、命令のスケジューリング、ループのパイプライン処理を行います。まあ、Naughty Dogが実際にすべてを手作業で行っているのかもしれませんが、ほとんどのPS3 SPU開発者でさえ私の経験にはありません。:)
ネイサンリード

1
@NathanReed PS2の時代、手動ループパイプライン処理は実際にNaughty Dogのプログラマーインタビューの一部でした。
クラッシュワークス

-1

実際、私たちはマルチプラットフォームの世界に住んでおり、ゲームコードの一部はローカルプラットフォームに合わせて調整する必要があります。そうする必要はありませんが、ローカルハードウェアを利用するとメリットがあります。

これはゲームやゲームロジックに関するものではなく、ゲームロジックが依存するコードの最適なパフォーマンスのためのハードウェアの局所性に関するものです。たとえば、マクロを使用してコードセクションをラップし、1つのソースコードがあり、それが構築されたプラットフォーム。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.