「 2012年09月 」一覧

VisualStudio 2012でSALを使う


SALとは、Sourcecode Annotation LanguageといってMicrosoftが定義しているコンパイラで使用できる注釈のことです。
これは注釈という名が示すとおり、プログラムコードに注釈という形で情報を付加する仕組みです。

出来るようになることは割と多くあるのですが、主に以下のようなことが出来るようになります。

  • 関数戻り値の確認をチェックするしているコードか判定
  • 関数入力に渡されたバッファに対する範囲内アクセスかどうかの確認
  • 関数出力用の変数に値を格納しているか、格納しないままの実行パスはないか、の確認
  • バッファが書式指定を持つバッファの場合の引数個数確認

大雑把に言えば、渡されるバッファの境界チェックが出来るという感じでしょうか。
あと、エラーを返すような関数で、呼出元が戻り値チェックを省いていることを検知できるとか。安全なプログラムを作るためにこれらの機能をうまく使っていきたいですね。

ちなみにこのSALは、WindowsSDKやDirectX SDKで提供されるヘッダファイルらに既に適用されています。
さて、なぜ今SALなのかといいますと、VisualStudio 2012 Professional にて分析機能が使えるようになり、この分析という部分がSALを使用しているプログラムソースコードを解析することが出来るようになるためです。

続きを読む


ATCテクスチャのデコード


先日のPVRTCに引き続き、ATCテクスチャのデコードにチャレンジしてみました。
ATCでは、AMD_compressed_ATC_texture.txt にあるように3つの種類の方式があるようです。

  • 不透明: ATC_RGB_AMD
  • アルファあり: ATC_RGBA_EXPLICIT_ALPHA_AMD
  • アルファあり: ATC_RGBA_INTERPOLATED_ALPHA_AMD

これらはそれぞれFourCCが割り当てられているようで次のようになっています。
圧縮後をDDSに出力するツール(Compressonator:AMD製)で確認してみました。

  • ‘ATC’: 4bpp: ATC_RGB_AMD
  • ‘ATCA’: 8bpp: ATC_RGBA_EXPLICIT_ALPHA_AMD
  • ‘ATCI’: 8bpp: ATC_RGBA_INTERPOLATED_ALPHA_AMD

ATCはQualcommのSnapdragonでサポートされている形式でもあり、AdrenoSDK 3.0で提供されるツールでも出力が可能となっています。しかしながら EXPLICIT_ALPHA と INTERPOLATED_ALPHA のFourCCが逆に出力されるようです。
テクスチャツールが割と扱いやすいだけにこのバグは修正されて欲しいなと思います。
それともこれらの圧縮形式を使う場合にはKTXフォーマットの方がいいのかも。

とりあえずわかっている情報からATC圧縮形式をデコードしてRGBA8にして、DDSとして出力してみました。次のような感じに変換できており無事に処理できていそうです。


右側には対等な関係にあるDXT圧縮の物を比較のために並べてみました。
だいたい同様のアルファ変化となっていますし、正しそうな気配です。


ネイティブデバッグのためにADT r20をインストールする (うまく動作せず)


ADTのr20からネイティブ部分のデバッグをサポートしたとのことで試してみました。
ここではADT r20をインストールして使えるようにするための手順を書いておきます。
基本的には、以前に説明してあるネイティブデバッグの手順を終わらせている前提です。

現在、デバッガ機能がうまく動作しないため試行錯誤中。以下の内容はメモという感じです。
この通りやってもうまくいかない可能性が高いです。 

事前条件

  • eclipseはインストールされていること
  • Android SDK, NDK が既にインストールされていること(r20以上)
  • cygwinがインストールされていること
ここでは、Android SDK 20.0.3,  NDK r8b を使用して確認しています。

ADTのインストール

eclipseを起動して、メニューから”Help”/”Install New Software”を選択します。選択すると下記のような画面が開きますので、Addボタンを押して、下記の情報を入力します。

  • NAME: ADT
  • Location: https://dl-ssl.google.com/android/eclipse/

そしてOKボタンを押してしばらく待ちます。待っていると下記のような画面が出てくるので、項目にチェックを入れてインストールを継続します。

さらに途中でライセンス同意のための画面が出てきます。このときには下記の画面に示すようにaccept側を選択するようにします。

インストールが終わってeclipseの再起動をしたら、NDKのパスを設定する必要があります。
メニューの”Window”/”Preferences”を選択して、”Android”のカテゴリを選択して開いてください。その中に、”NDK”という項目があるので、NDKを展開してあるフォルダを選択します。

サンプルで動作確認

メニューから “File”/”New”/”Other” とたどって、”Android”/”Android Project from Existing Code”を選びます。そしてNDKに入っていたサンプルを選ぶのですが、最初と言うことで”hello-jni” を選んでみました。

もしここで、Finishボタンを押しても次へ進まないようなことが起こった場合には、環境変数を再確認してください。
環境変数 ANDROID_NDK_ROOT が今回使用している物と一致していない可能性があります。
自分はこのトラブルにあたってしまったので・・・いったいどこが悪いのかとても悩みました。

生成されたプロジェクトを右クリックして、”Android Tools”/”Add Native Support”を選択します。

ここまで出来たら一度ためしに実行してみます。うまく実行は出来たでしょうか?
自分の環境ではC/C++のコードにブレークポイントを置いてみたりしているのですが、うまく動作しませんでした。
NativeActivityなら動作するとか聞きましたが、そちらのほうもダメっぽい。まだ何か見落としている設定があるのかも知れません。


「ゲームプログラマになる前に覚えておきたい技術」 VS2012対応


VisualStudio2012の季節がやってきたので、「ゲームプログラマになる前に覚えておきたい技術」のサンプルプロジェクト群を対応してみました。基本的にVisualStudio2010版なのですが、元々が 2008用のためいくつか設定し直しやソースコードを変更している部分があります。

必要な物(準備)

  • VisualStudio 2012 (RTM版で動作チェックしています)
  • DirectX SDK 2010June をインストールしておいてください。
  • 書籍にありますが、環境変数 GAME_LIB_DIR を設定しておいてください。
    → ユーザー環境変数にセットしておく方がよいかもしれません。

詳しい手順は以前の2010用の記事を参考にしてください。
こちら →  http://blog.techlab-xe.net/archives/368

ファイル本体はこちら。 GamePgVS20xx-V4

■注意事項

公開しているアーカイブの再配布を禁止します。
また、公開したアーカイブを使用したことによる損害については、
筆者および公開した私自身がその責務を負いません。
利用する際には、自己責任でご利用下さい。

■その他

意外と気付かないで苦労される方が多いので書いておきたいと思います。
「ゲームプログラマになる前に覚えておきたい技術」で使用しているプロジェクトの設定ですが、実行に別途VCランタイムを必要としないスタティックリンク版の設定となっています。
設定の”コード生成”部分 において、”マルチスレッド” or “マルチスレッドデバッグ” が設定されています。通常プロジェクトの生成直後は、”マルチスレッドDLL” / “マルチスレッドデバッグDLL” が設定されます。
この差異に気付かずにプログラムを作成し、リンクで失敗するなどの話を見かけますので、自作プログラムで使用される場合にはこの点をご確認ください。


VisualStudio 2012とDirectX SDK


どうやらVisualStudio2012を使う状況においては、DirectXSDKにも注意が必要のようです。
VisualStudio2010を使う際にもDirectXSDKの諸注意がありましたが、2012においても同様に注意が必要のようです。

まず結論からいうと、うまく動作するDirectX SDK にはある範囲があるようです。
手元にインストールしてあったSDKを調べてみるとこんな感じです。

  • DirectX SDK 2008 Nov NG
  • DirectX SDK 2009 Aug OK
  • DirectX SDK 2010 June OK

以下、失敗したときの参考事例と言うことでメモっておきます。

よく言われているのがDXSDK_DIRのインクルードを設定する部分です。
プロジェクトのプロパティで”C/C++” / “追加のインクルードディレクトリ” に $(DXSDK_DIR)Include を追加すると下記のようにエラーが出ます(一部抜粋)。

これについては、プロジェクトのプロパティから、
“VC++ディレクトリ”/”インクルードディレクトリ”の末尾に、$(DXSDK_DIR)include を追加してあげることでエラーが消えます。

しかし、先ほど言ったようにこれだけでは不完全でした。
XAudio2.hをインクルードするソースコードだとこの対策をしても下記のようなエラーが環境によっては出てしまうことがあります。

これは、_WIN32_WINNT がどこかで定義されていることが原因です。
それがVisualStudio2012が標準で参照するWindowsSDKDirの中にあるXaudio2.hでエラーとなっています。このヘッダでは_WIN32_WINNTはWindows8の値がくることを想定しているようです。

よって、このままではWindows8以外を想定したビルドは通りません。
WindowsXP~7等で動作するアプリケーションのためにはDirectX SDKに含まれているXAudio2のヘッダを使う必要がありそうです。

このためには、DirectXのヘッダを読み込む優先順をあげる必要があります。
それは先ほどの$(DXSDK_DIR)Includeを設定した部分にあります。
優先順をあげて、VisualStudio2012の標準ヘッダ群より先にするために、”C/C++”/”追加のインクルードディレクトリ”のほうに設定します。ただし、2008Novのバージョンではエラーとなったことを上記の方で既に体験しています・・・・。

そこで、DirectX SDKのバージョンを上げてみます。2009Augではどうだろうか、と。
試してみたところ、うまくビルドが通りました。
インクルードの順序を確認してみましたが、DirectXSDKのほうのヘッダを参照していることも確認できました。

同様に2010Juneでも確認してみましたが、同様に成功しました。

まとめると、DirectXSDKを正しく使用するためには以下の手順となります。

  1. DirectX SDKは2009Aug以降を使用すること。できれば公式にVisualStudio2010対応してるとされていた2010Juneがよいと思います。
  2. DirectXSDKのインクルードパスの設定は、プロジェクトのプロパティのVC++ディレクトリに対して行わず、”C/C++”の”追加のインクルードディレクトリ”にて行うこと。

この2点が大切です。
これを守らないと変なインクルードの順序となり、予期せぬ不都合が起こるかもしれません。

チェック環境

  • Windows7 Pro SP1 (x64)
  • VisualStudio 2012 RTM
  • DirectX SDK  2008Nov, 2009Aug, 2010Jun

現在はもっと新しい記事があります。
VisualStudio 2012とDirectX SDK 再び