2011/07/12

DarkPlacesというQuake1互換のエンジンがあったので最近気になっていたけど2010年の4月からNewsのページが更新されてなっかたのでエンジンも円熟して枯れたものになってんのかなーと思ってたんだけど、6月以降、更新頻度が高くなってるみたい。

作者のLordHavoc'sさんは家庭用ゲーム機版のNexuizの開発にも参加しているのでそちらも気になるな。この辺は詳しくないけど、Nexuizは元々DarkPlacesエンジンで作られたものだけど今回の家庭用ゲーム機版ではなんか知らんけど(おい)CryEngine 3に差し替えられた。んでなんかしらんけどフォークしたのがXonotic。

新しくリリースされたDarkPlacesエンジンでは実験的にソフトウェアによるレンダリング(3Dグラフィックスの描画をGPUではなくCPUで計算する)とDirect3D9によるレンダリングが追加されたみたい。どちらも今のところ推奨されていない。

ソフトウェアレンダリングの方はフレームレートが低いが描画自体はとても正確らしい。Direct3D9の方は影の生成処理がOpenGLの場合よりかなり遅くなるっぽい。どちらも今後の最適化に期待。

あと、6時間毎に自動ビルドされた開発版のダウンロードが可能になり、LinuxとOS X版を排除してその分サイズが小さいWindows 32bit版と 64bit版のビルドも新たに追加されている。

以下は用意されたバイナリではなく自分でビルドしたい場合のメモ。

DarkPlacesの配布物にはソースコードも同梱されているがWindowsでビルドする場合、visual studioのプロジェクトしか同梱されていないっぽいのでMinGWでビルドしたい場合は(つーか他の*nix系OSも含む)SVNリポジトリから直接開発版のソースをダウンロードしないとだめかも。いやWindowsバイナリオンリーのやつダウンロードしたからかもしんないけど。とにかくmakefileがあればいい。

ビルドには事前にDarkPlacesのlibjpegやogg等、依存ライブラリがインストールされている必要がある。

自分の環境ではmingw32-make 3.82とmake 3.81があってなぜかmingw32-makeだとダメでmakeだとコンパイルできた。

そのままmake releaseと打つとlinux版のビルドはじめちゃうのでこういったことを回避するためにmake時にmakefileで定義された変数の値を上書きする必要がある。

make release DP_MAKE_TARGET=mingwだけだとccがないと怒られたのでCC=gccも追加する。

make release DP_MAKE_TARGET=mingw CC=gcc

これでコンパイルが通るはずだけどインストールされているSDLのバージョンが1.3だとvid_sdl.cで使われているSDL_SysWMInfoがSDL 1.2と定義が違うので途中でコケる。
のでvid_sdl.cのコンパイルエラーで指摘された箇所のinfo.windowをinfo.info.win.windowに書き換える。

まぁdarkplaces-sdl.exeなくてもdarkplaces.exeだけでよければSDL版はビルドしなくても大丈夫だけど。

makeの変数って-eオプションで上書きするんだとおもってたけど、makeの内側に書けばかってに上書きされるのね。

DP_MAKE_TARGET=mingw CC=gcc make release -e

make release DP_MAKE_TARGET=mingw CC=gcc

どっちでもOK。

http://icculus.org/twilight/darkplaces/index.html

2011/07/08

WinDumpをローカルで。

ネットワークについて素人が書いているので間違いがあるかも。というかよくわかっていない。

メモ

  • tcpdump - パケットを解析するためのソフトウェア
  • libpcap - パケットを解析をするためのライブラリ
  • WinPcap - libpcapのwindows版。WinDumpやWireShar等、多くのソフトウェアで使われている
  • WinDump - tcpdumpのwindows向けの実装
  • WireShark - GUIで操作するネットワークプロトコルアナライザー


windumpでローカルのパケットキャプチャをしたかったのでhttp://wiki.wireshark.org/CaptureSetup/Loopback を参考にとりあえず解決。


以下は翻訳もまじえてるのでなんか変な感じ。

windowsのTCP/IPスタックではループバックインターフェイスを実装していないのでwinpcapではローカルループバックアドレスの127.0.0.1をキャプチャできない。(127.0.0.1がインターフェイスを使ってループバックを実装してないのでキャプチャできないという意味かな)
そこでMicrosoft Loopback Adapter等のネットワークアダプター(インターフェイスと同義かな?)を追加するが、これで期待通りの結果が得られるかはわからない。

Windows 7 での追加方法はhttp://blogs.wankuma.com/hatsune/archive/2010/05/13/189032.aspxを参考にした。

このアダプターは擬似ループバックアダプターを提供するが127.0.0.1では動作しない。このアダプター独自にIPアドレスを割り当てて使用する。
ループバックアダプターはシステム上にひとつしかインストールしてはいけない。
このループバックアダプタでキャプチャするにはWinPcap 3.1以上の必要がある。

ループバックアダプターのプロパティを開き静的にIPアドレスとマスクを設定する。
Windows 7 の場合、コントロールパネル -> ネットワークとインターネット -> ネットワークと共有センター
で左カラムの「アダプターの設定の変更」からMicrosoft Loopback Adapterを選ぶ。

WireSharkのwikiだと、そのあとarpやrouteコマンドをつかってるんだけどこれは必要なのかわからない。

とにかくループバックアダプターが使えるならWinDump -D でインターフェイスが表示される。
自分の場合はアダプターをインストール後にPCを再起動しないと表示されなかった。

んで自分で書いたプログラムとかの通信をループバックアダプターに設定した静的なIPアドレス(127.0.0.1ではない)で行うんだけど、この辺はよくわからない。自分で設定したのと通信するときの実際のアドレスが若干違うというかなんというか。arp -a で表示されるアドレスに適当に通信してるんだけど。IPアドレスとサブネットマスクとかよくわかってないので。まぁとりあえずキャプチャできてるので今は良しとしよう。


他にも方法はあってrouteコマンドでなんかする(?)みたい。

上記はWinPcapを使ったソフトウェアの対処法なのでTDIなどのカーネルモードで動作する低レイヤーのライブラリを使ったソフトウェア(TDIMonとかLocal NetWork Monitor等)ならそのままlocalhost(127.0.0.1)をキャプチャできるはず。

2011/07/01

std::vector<int> x;
はスコープを抜けると自動的に要素のメモリも解放される。

std::vector<int*> y;
上のように要素をポインタにした場合は勝手に解放されないので
自分で解放しないと要素はメモリリークする。

それぞれの要素を自分で解放する。

std::vector<int*> y;
y.push_back(new int(1));
    ....
for (unsigned int i = 0; i < y.size(); ++i) {
  delete y[i]; //配列の場合は delete[] y[i]
}
// イテレータで解放する場合
for (auto i = y.begin(); i != y.end(); ++i) {
  delete i;
}

自分で解放するよりスマートポインタとか使ったほうがいいのかな?