みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語でDirectXの制御 ゲームプログラミング

C言語→APIと勉強しDirectXの学習に着手したのですが、参考サイトの多くが制御をC++で行っていました。(拡張子が.cpp)
DirectXの構成上C++は必須になると聞いてはいるのですが、取り敢えずCでやれるところまでやってみたいと思っています。
結局Web上でCを使用したDirectXの解説サイトを見つけることが出来なかったため、参考になるサイトなどあれば教えていただけないでしょうか。
また、同様に有用な書籍などありましたら教えてください。

投稿日時 - 2009-04-20 09:56:46

QNo.4894094

困ってます

質問者が選んだベストアンサー

DirectX8系ならいくつか存在するみたいです。
http://rina.jpn.ph/~rance/directx8/index.html
http://www.interq.or.jp/black/minami-m/
http://monsho.hp.infoseek.co.jp/game.html

投稿日時 - 2009-04-20 10:41:52

お礼

回答有り難う御座います。
8系ですか。下位バージョンであれば互換性の点では問題ないと思いますが、9系サンプルソースの解析をしようとしたとき若干躓きそうです。
DirectX自体詳しくないのでわかりませんが、8.0で学ぶとすれば9.0との差異などをプラスアルファで理解しておかなければなりませんね。
C++系は多くのサイトがDXライブラリの使用を前提としているので、クラスに関する知識が深まらないというのが好ましくない点です。(あるいはLibやヘッダを解析しながらという方法もありますが)

投稿日時 - 2009-04-20 11:06:20

ANo.1

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

zwi

>マルチタスク、マルチスレッド処理とはまた別なものなのでしょうか。
上記の2つはシングルコアCPUでも動きます。正確に書くならCPUマルチコア・マルチCPUにより並行処理プログラミングですね。マルチタスク、マルチスレッドの概念とは完全に同じではありません。

SIMDはCPUコア内の演算回路の拡張に対応した命令コードです。専用のレジスタ上に置いた複数のデータ同士を1命令で加算とか減算したりするために使います。C言語だと文法上表現できないんですよ。
x86のSIMD命令(MMXやSSE)。拡張に次ぐ拡張でややこしいことに。
http://ja.wikipedia.org/wiki/Streaming_SIMD_Extensions
http://krypton1.at.infoseek.co.jp/x86/x86.htm

投稿日時 - 2009-04-20 17:18:08

お礼

度重なる回答、誠に感謝しております。
>正確に書くならCPUマルチコア・マルチCPUにより並行処理プログラミングですね。マルチタスク、マルチスレッドの概念とは完全に同じではありません。
・ハードウェアよりな考え方ということですね。
物理的に処理する領域(レジスタ)が分かれているということでしょうか。
>x86のSIMD命令(MMXやSSE)
・参考サイトをある程度理解するのに少々時間を要しました。
CやC++ではSSEを出すことはできないんですね。
>C言語だと文法上表現できないんですよ。
・C言語はメモリに直接アクセスできる言語なのでレジスタに対してもアクセス可能なのではないかと考えていました。

投稿日時 - 2009-04-20 18:06:49

ANo.7

zwi

>・CPUですか?つまりCPUのスペックでCかC++かを選ぶということでしょうか。(あくまで一要因として)

ゲームボーイ程度の8ビットCPUではC言語でも厳しいですね。命令コード自体がコンパイラに向いていません。16ビット系でC言語、32ビットでC/C++言語の混在と大雑把に考えてよいと思います(私見ですが)。
C++が使えるようになったのはメモリ量の増大とCPUクロックの大幅アップのお陰です。あとはゲームプログラマが開発ツールなどのプログラムでVC++を使ってC++に慣れてきたことかな?
部品化、ライブラリ化だとかだとC++の方が開発効率良いですからね。

セガの人が書いた「ゲームプログラマになる前に覚えておきたい技術」
http://www.shuwasystem.co.jp/gpro-sp/
もC++で書かれてますね。

>つまり非常に多用される処理においてはアセンブラを使用する場合がある、という認識でよろしいでしょうか

行列演算とか、やたら計算は多いのにシンプルな処理はアセンブラで書かないと効率よく処理できない場合があります。あと物理演算系とか。それにx86コア等のSIMD系の命令コードを持つCPUでSIMD系のコードを出してくれるC/C++コンパイラはありませんので、必然的にアセンブラを使います。
http://www.atmarkit.co.jp/icd/root/31/5783731.html

投稿日時 - 2009-04-20 15:56:11

お礼

回答有り難う御座います。
>メモリ量の増大とCPUクロックの大幅アップのお陰です。
・高性能CPUの場合CとC++の処理速度はほとんど変わらないが、上記の様なCPUを使用する場合に差が出てくるということですね。
>行列演算とか、やたら計算は多いのにシンプルな処理はアセンブラで書かないと効率よく処理できない場合があります。あと物理演算系とか。
・成程、単純計算の集合はコンパイラが最適化してくれるのかなと思っていましたがそういうわけでもないのですね。
>x86コア等のSIMD系の命令コードを持つCPUでSIMD系のコードを出してくれるC/C++コンパイラはありませんので、必然的にアセンブラを使います。
・参考サイトを読んでみましたが少々難解で理解しきれていない部分が多いです。
CやC++ではSIMD系コードでCPUに命令を与えてやることはできないから、機械語と一対一であるアセンブラで直接命令を与えてやる必要がある。という解釈でよろしいでしょうか。
マルチタスク、マルチスレッド処理とはまた別なものなのでしょうか。

投稿日時 - 2009-04-20 16:31:49

ANo.6

zwi

>DSではC言語が使用されているのですか。

いや断言はしませんよ。DSはARM系CPUですからC++でも問題なく使用できるスペックのCPUですからね。もちろんC++で開発しているメーカーもあると思いますよ。

>疑問なのですが、それでも尚アセンブラが使用され続けている理由はやはり処理速度の面なのではないのでしょうか。(つまりゲーム開発においてCやC++では速度面で不十分な面が存在するということでは?)

アセンブラで熟練者がコードが書けば、CやC++より速いコードがかけますがコンパイラのオプティマイザもバカにできません。ただアセンブラは可読性とメンテナンス性が悪すぎます。やはり、現在の大量のコードを書く時代にはC++の方が開発効率が良いです。
アセンブラはライブラリなどで高速性が必要な一部分で使われることはありますよ。

投稿日時 - 2009-04-20 14:26:19

お礼

度々の御回答誠に有り難う御座います。
>いや断言はしませんよ。DSはARM系CPUですからC++でも問題なく使用できるスペックのCPUですからね。もちろんC++で開発しているメーカーもあると思いますよ。
・CPUですか?つまりCPUのスペックでCかC++かを選ぶということでしょうか。(あくまで一要因として)
>アセンブラで熟練者がコードが書けば、CやC++より速いコードがかけますがコンパイラのオプティマイザもバカにできません。
・確かにコンパイラの最適化処理は相当なものだという話を耳にしたことがあります。
私自身は使用していない変数をコンパイル時に除外してくれる程度の機能しか理解していませんが。
>アセンブラはライブラリなどで高速性が必要な一部分で使われることはありますよ。
・つまり非常に多用される処理においてはアセンブラを使用する場合がある、という認識でよろしいでしょうか。
確かにアセンブラのみでゲーム開発となると解析効率は相当に悪そうですね。

投稿日時 - 2009-04-20 15:08:02

ANo.5

zwi

>その上でCを選択した理由に、ゲーム会社の採用条件にがアセンブラやC言語が多く見られたからです。

まぁ、今時のゲーム会社はC++を使っていると思いますけどね。特にPS3やXbox360の開発。DSならC言語かも知れませんけど。

>DXライブラリなどを使用してしまうと自分でクラスを作る必要性が薄くなってしまうので、学習用としてはどうなのだろうと思っています。

DXライブラリはDirectX周りの細かい仕様を知らずに作れてしまうのが問題ですね。まぁ目的を2Dゲームを作ることに置くのか、DirectXの習得を主眼に置くのかでDXライブラリの価値が違うと思います。楽に開発した貰うためのDXライブラリですし。
ゲーム開発メーカーのプログラマーも社内のライブラリやゲームエンジンを使っているので、担当する部分でDirectXの知識はかなり差があったりしますけど。

投稿日時 - 2009-04-20 12:25:39

お礼

回答有り難う御座います。
>まぁ、今時のゲーム会社はC++を使っていると思いますけどね。特にPS3やXbox360の開発。DSならC言語かも知れませんけど。
・現在の主流がC++というのは初めて知りました。
DSではC言語が使用されているのですか。
>ゲーム開発メーカーのプログラマーも社内のライブラリやゲームエンジンを使っているので、担当する部分でDirectXの知識はかなり差があったりしますけど。
・会社ごとに独自のライブラリを使用しているということですよね。
そうなるとDirectXを理解するという点も踏まえ、独自の関数群を作ってゲームを作ってみたいな、と思ってしまいます。

投稿日時 - 2009-04-20 12:54:56

ANo.4

#3です。
ゲーム会社でもいまどきはC++が普通ですよ。特にDirectXなんてわざわざCで書いたりはしません。

採用条件にアセンブラやCという話は、それらを理解していたほうが、よりコンピュータの本質的なところでの理解ができていると思われるからでしょう。

>・アセンブラは単純に理解しにくい。
>・C++、XNAは処理速度や容量を突き詰めていく場合どうしてもクラスの存在がネックとなると聞きました。
これも誤解です。アセンブラなんて理解するのは簡単ですよ。ただ、CやC++と同じことをするのに、数倍~数十倍の行数となるため最近ではあまり出番がないだけです。
クラスも素人が適当に書いたのならともかく、うまく書けば、容量には影響しません。なので、ゲームにC++が使われていなというのは違います。

投稿日時 - 2009-04-20 12:24:47

お礼

再度の御回答有難う御座います。
>ゲーム会社でもいまどきはC++が普通ですよ。特にDirectXなんてわざわざCで書いたりはしません。
・そうでしたか、参考にした会社が偏っていたみたいですね。
>採用条件にアセンブラやCという話は、それらを理解していたほうが、よりコンピュータの本質的なところでの理解ができていると思われるからでしょう。
・そうなると業務上C言語が使用される機会は少なく(あるいはまったくない)、メモリやクラスなどの意義を理解するにあたってアセンブラやC言語の知識が必要であるということでしょうか。
>これも誤解です。アセンブラなんて理解するのは簡単ですよ。ただ、CやC++と同じことをするのに、数倍~数十倍の行数となるため最近ではあまり出番がないだけです。
・疑問なのですが、それでも尚アセンブラが使用され続けている理由はやはり処理速度の面なのではないのでしょうか。(つまりゲーム開発においてCやC++では速度面で不十分な面が存在するということでは?)
>クラスも素人が適当に書いたのならともかく、うまく書けば、容量には影響しません。なので、ゲームにC++が使われていなというのは違います。
・成程、そうなると現在ゲーム業界の主流はC++ということですね。

投稿日時 - 2009-04-20 12:46:13

ANo.3

すなおにC++でやったほうが、何倍も簡単だと思いますよ。
Cを学んだ人がC++を学ぶための本としては、
「CプログラマのためのC++入門」がおすすめです。
http://www.bohyoh.com/Books/CppForCP/
これを読めば、C++なんてCとそんなに変わらないということがわかるはず。

投稿日時 - 2009-04-20 11:32:26

お礼

回答有り難う御座います。
実を言いますとC++もある程度は学習済みです。
その上でCを選択した理由に、ゲーム会社の採用条件にがアセンブラやC言語が多く見られたからです。
ゲーム会社に就職するつもりはありませんが、現行企業のゲーム制作技術を学ぶにあたってどの言語が最適かと考え、とりあえずC言語を選択しました。(単純に企業の技術を真似てみたかったのです)
アセンブラ、C++、あるいはXNA(これはWindowsとXBOX360ですね)なんてものもありましたが、
・アセンブラは単純に理解しにくい。
・C++、XNAは処理速度や容量を突き詰めていく場合どうしてもクラスの存在がネックとなると聞きました。
C言語で勉強して、やはり難しいと思った時は素直にC++で勉強しようと思います。

投稿日時 - 2009-04-20 12:01:40

ANo.2

zwi

DirexctX8と9の違いは、そう大きくなかったはずです。
http://dench.flatlib.jp/dxlist.html#dx9
まぁ、C++のライブラリを使う分にはクラスは構造体に関数のポインタを入れたのと似ていると言った感じの解釈で十分だと思いますけど。

投稿日時 - 2009-04-20 11:26:38

お礼

再度の御回答有り難う御座います。
上記のサイトを読んでみたところ、3D系の処理を中心に変更が加わっているという解釈で宜しいでしょうか。(Shaderとか頂点フォーマットというのは3D系の用語ですよね)
現時点で3D系のゲームプログラミングを学習する予定はありませんので、先ほどご提示いただいたサイトを参考に勉強を始めてみようと思います。
C++既存の関数群を使用することに抵抗はないのですが、ゲームプログラミングに特化した(?)DXライブラリなどを使用してしまうと自分でクラスを作る必要性が薄くなってしまうので、学習用としてはどうなのだろうと思っています。
もっともクラスを作ること自体かなり難易度が高いらしいので、素直に既存ライブラリを使ったほうが賢明なのかもしれませんが。

投稿日時 - 2009-04-20 11:49:33

あなたにオススメの質問