Chiharu の日記

絵描き C/C++ プログラマーの日記です。

C++

マルチ プラットフォーム対応 〜Win32 から Linux まで

先日の日記の続き。 パラレル・フォースをマルチ プラットフォーム (主に PandaBoard) 対応すべく、Windows 固有 API 利用箇所を徐々に修正していっています。 機能 Windows Linux 補足 Sound XAudio2 ??? 検討がついてません。というか Windows 版の実装を…

ファイル I/O 〜Win32 から C++ 標準ライブラリへ

先日の日記の続き。 GCC ビルド環境のファイル I/O を Win32 から C++ 標準ライブラリの ifstream 等に変更しました。この辺は標準ライブラリだけあって、つつがなく移行が完了しました。 ただ、相変わらず getFileSize 的な API がなかったり、エラーハンド…

WaitForMuitipleObjects 〜POSIX スレッドでは?

先日の日記の続き。 Win32API のイベント処理に対応する POSIX スレッドの API は下記のようです。 Win32API POSIX 概要 CreateEvent pthread_cond_init 同期オブジェクトの初期化 CloseHandle pthread_cond_destroy 同期オブジェクトの解放 SetEvent pthrea…

Parallel force - パラレル・フォース 〜GCC4 対応を完了

先日の日記の続き。 PandaBoard が届くまで、まだしばらくかかるので、パラレル・フォースの GCC4 向けの移植作業を進めていました。もともと Windows 向けに作っていたので、まず手始めに Cygwin 環境でのビルドに対応しました。C++0x 万歳的なコードですの…

オブジェクト指向 〜参考資料

C++

えーと。オブジェクト指向を学習するのに適した本って何かあるでしょうか。職場で客先から「オブジェクト指向を理解したいが参考書はないか?」と聞かれて答えに窮したのでブログに展開。 私の場合、プログラミング言語の勉強当初に C++ ばかりを追いかけて…

Parallel force - パラレル・フォース 〜CPU 占有率

先日の日記の続き。 改めて Core i7 で CPU 占有率を見ると、高負荷時にまんべんなくコアを使う…ということはなく、結構まばらに CPU リソースを消費しているなぁと感じます。フレーム同期のためにウェイトが入っているので 100% まで上昇しないのは理解でき…

Parallel force - パラレル・フォース 〜デモ更新

前回更新時から随分と期間が経ってしまいましたので、現時点でのコードをまとめてデモを更新しました。今回から x64 ビルド バイナリを追加しました。マルチコア エンジンなので効果がそれと分かるように、デモ画面に CPU 使用率を表示するバーを追加しまし…

setjmp/longjmp とデストラクタ 〜Visual C++ の場合

C++

先ほどの続き。 Egtra さんの指摘で、x86 でも /EH オプションが有効の場合には setjmp/longjmp でデストラクタが起動することが分かりました。 状況を確認してみましょう。まず、下記のクラスを用意して ctor/dtor の呼び出し状況がコンソールから分かるよ…

x86 から x64 へ 〜利点いろいろ

C++

x86 と比べて x64 になって良かったなぁと思う点など。 汎用レジスタ数が 8 個から 16 個に増えた 関数の引数がレジスタ渡しがデフォルトに(冒頭の数パラメータのみ レジスタのスタック退避が激減 SSE2 を確実に使用可能 浮動小数演算に x87 FPU でなく SSE…

描画処理のまとめ 〜アセンブラとの戦い

先ほどまで Parallel force - パラレル・フォースの描画処理をまとめてました。具体的にはコンパイラの出力するアセンブラ コードとにらめっこしてました。見直していると、画素あたりの処理が複雑なようで、下記の問題が発生していました。 画素あたりの処…

Visual C++ 2010 Express 〜x64 ビルドできない?

C++

あれ? 久しぶりに Visual C++ 2010 Express で x64 ビルドしようとしたら、 >エラー: プロジェクトに "ConfigurationGeneral" 規則がありません。な、エラーが表示されてビルドできなくなっていました。おかしいなぁ、なんでだろ。x64 ビルドできていたころ…

C++0x の nullptr 〜GCC であれれ?

C++

先日の日記の続き。 さらに先日の日記のコードを Cygwin 環境で、 $ gcc test_memcpy.cpp -msse2 -std=c++0x -lstdc++ -O3こんな感じでコンパイルしたら、 test_memcpy.cpp: In function ‘void xmmcpy_da_sa(void*, const void*, size_t)’: test_memcpy.cpp:…

XMM レジスタによるメモリ アクセス 〜SSE2 (movdqa と movdqu) の特性

C++

先日の日記の続き。 興味深い計測結果が出ていました。 確かにNehalem系CPUは、以前のCPUと比べてMOVDQUの性能が改善されています。cache lineを跨がなければMOVDQAと同じ速度が出ています。 MOVDQUの特性について ふむ。movdqu は Core i シリーズで高速化…

Parallel force - パラレル・フォース 〜XMM レジスタによるメモリアクセス

Paralell force - パラレル・フォースのレンダラの画素アクセスは下記の方針で対応しています。 可能な限り XMM レジスタを使用する 可能な限り movdqa 命令でロードおよびストアする 前者はともかくとして、後者がなかなか曲者なのです。 movdqa の使用条件…

C++0x の乱数 〜あれれ?

C++

std::uniform_int_distribution って負の値を正常に返せないのかな。VC でしか試していないのですが、んー。なんでなんだろ。 std::mt19937 aRandEngine; std::uniform_int_distribution<int> aRandDist(-2, 2); const auto aRand = aRandDist(aRandEngine); // -</int>…

C/C++ プログラミングの迷信と誤解 〜買いました、そして読みました、けれど。

C++

株式会社きじねこの C/C++ 迷信集をまとめた書籍が出たということで、買ってみました。 ―――んー。買ったんですけどねぇ。読んだんですけどねぇ。 書籍にした価値はないかな。誤解のないように言っておくと、書籍に記載される情報自体は貴重です。とっても。…

std::allocate_shared 〜カスタム アロケータ

C++

先日の日記の続き。std::allocate_shared 用のカスタム アロケータとして、簡易的なメモリ プールを用意してみました。 namespace { template <int unit> class memory_manager { private: union trait { trait* next; unsigned char body[unit]; }; public: memory_ma</int>…

std::allocate_shared 〜ちょっと計測

C++

先日の日記の続き。 C++0x の高機能スマート ポインタ std::shared_ptr の構築/破棄処理の速度を計測してみました。VC2010 でコンパイル オプションは /O2 /EHsc /DNDEBUG。相対評価なんで PC スペックは割愛。 #include <memory> #include <vector> #include <iostream> #include <ctime> #in</ctime></iostream></vector></memory>…

std::allocate_shared 〜気になるヘルパ

C++

うーん。日本語の情報があんましないですね、このヘルパ。make_shared の延長で、アロケータ指定して一括確保できるのかな。ちょっと調べてみよう。

std::make_shared 〜ただのヘルパじゃない!

C++

C++0x のスマート ポインタの中で、私が一番良く使うのは std::shared_ptr です。 std::shared_ptr<Image> foo1(const std::uint32_t iWidth, const std::uint32_t iHeight, const std::size_t iRowbytes) { std::shared_ptr<Image> aImage(new Image(iWidth, iHeight, iRo</image></image>…

コンストラクタで例外はアリか? 〜私はアリ派

C++

ネタ元: わんくま東京勉強会#56 懇親会ふぉろー えー。とりあえず C++ に限定して、私はアリ派。 確かに、下記のようなクラス定義はまずいですが…、 class FileReader { public: FileReader(const char* iFileName):mFile(fopen(iFileName, "r")), mBuffer(4…

C++0x 〜auto のその後

C++

先日の日記の続き。 やりたかったことは下記のようなことで、任意の整数型からレジスタ長に合わせた整数型を選択したいというものでした。 const std::uint16_t src = 0; auto_fast dst = src; // auto_fast = std::uint_fast16_t にしたいけど無理 トラック…

C++0x 〜auto に対する不満

C++

以前の日記にも書きましたが、C++0x のauto は便利です。左辺値の型推論とでも言うんでしょうか。 // C++0x より前 std::vector<int>::iterator aIt = aVec.begin(); と書いていたものが、 // C++0x auto aIt = aVec.begin(); で済むようになる。と。 これはすご</int>…

Parallel force - パラレル・フォース 〜タスク登録処理

パラレル・フォースではスプライト関連処理として下記のクラスを用意しています。 (多分そのうちまた増えますが、現状はこんな感じ。 外部公開クラス ISprite: スプライトの基底クラス(インタフェース) FillSprite: 単一色の塗りつぶしスプライト ImageSp…

わんくま同盟 〜名古屋勉強会 #16

C++

この前、わんくま同盟の名古屋勉強会 #16 に参加してきました。 今月はお小遣いがあまりなかったので親睦会は不参加で、昼の部のセッションだけ聴衆として参加しました。感想は下記。とても刺激的でした。 関数型言語祭り スピーカーの皆さんやる気ありまく…

Parallel force - パラレル・フォース 〜デバッグ

そろそろゲームらしいものを作ろうと、色々弄っていたらぼちぼちバグが出てきました。出てきたバグをぷちぷちつぶしました。 コードを編集していると、相方から「またグレーの画面出してる。グレーの画面そんなに楽しいの?」と言われてます。折角なのでその…

Parallel force - パラレル・フォース 〜バックバッファのフリップ

もー、バックバッファ コピーの設計が気持ち悪くて気持ち悪くて再設計しました。詳細はこちら。 結局フリップに対応しました。多分、これでバックバッファの扱いは完成形です。前よりちょっと速くなっているはず。SSE2 使ってキャッシュ制御して、やっと落ち…

Parallel force - パラレル・フォース 〜表画面への転送 (4)

現状のコードをまとめました。詳細はこちら。 裏画面合成処理における分割描画についても、ちょこちょこ最適化しました。SSSE3 を使用したグレースケール画素データのロードと、描画タスクのクリッピングが対象です。Intel Atom だと 1 割くらい速くなってい…

Parallel force - パラレル・フォース 〜表画面への転送 (3)

バックバッファのコピー回避でーきたっと。ベスト エフォート型の回避だけど、パフォーマンス上がりました。よかったよかったー。 とりあえず今日はここまで。

Parallel force - パラレル・フォース 〜表画面への転送 (2)

先の日記の日付を 2 度にわたって間違える始末。眠いとミスも増えますね。気をつけよう。 さて、バックバッファの扱いをちょっと再考しています。 昨日の日記のとおり、現在、描画処理に『裏画面の合成』と『表画面への転送』という 2 つのステージを設けて…