どこかのだれかへ

職業ゲームプログラマ。気になったニュースのピックアップや開発日記などを書いています。

2の累乗かどうかの判定

2の累乗ということは、ビット演算的には1が一つだけの状態です。

2の累乗の場合、
-1すると繰り下がって下位ビットが全部1になるため、AND演算すると0になります。

2の累乗以外なら、
-1しても桁下がり発生しないため、AND演算にすれば1以上になります。

ただ0はアンダーフローによりうまくいかないので、最初に弾いています。

バグ修正でQAコストを考える

開発がマスターアップに近づくと、重要でないバグをスルーする場合があるのですが、 これはバグ修正によって新たなバグを生み出す=エンバグのリスクを回避するためです。

スルーするかしないか、またどういう風に修正対応をするか、判断材料は色々あって、その再現率やゲームプレイへの影響度(危険度)などがあるのですが その一つにQA*1コストも考える必要があるというのが今回の話です。

バグを修正した場合、当然そのバグが修正されたかどうか、エンバグしていないか確認する必要があります。

プログラマ的には例えば数行の修正でも、その修正が様々な箇所に影響する場合、QAはそのすべての箇所を再度見回る必要が出てきてとてもコストが高い(時間がかかる)です。

時間がもうなくて見れない場合は、優先度が低ければスルーしたり、修正方法を工夫して影響範囲を絞ってQAコスト下げて対応したりします。またどうしようもなくてQAに頑張ってもらうこともあります。

先日この状況に出会い、設計の重要さを感じた一件でした。

*1:品質保証チーム。今回はデバッグチームの事を指す

中途半端に引き継いでしまったので

仕事の話。

とある人のタスクがあふれちゃったので、終わりかけのタスク(でもバグがある)を1つを引き継いだんだけど、プログラムって書くより読む方が時間かかるし、理解するのに苦労する。

複雑だが大きなコードでもない、時間も無い、そもそもバグがあると明言されていたコードなので、怪しそうなところをがっつり書き直した。

書き直したことで相手の仕事の一部を無かったことにしている感じで、ちょっと申し訳ない気持ちになった。

でもそっちの方が早いし確実だからしょうがない。

プルダウンリストの項目を検索選択するためのBookmarklet

でかいプロジェクトでRedmine使っていると人が多くてプルダウンで担当者を設定するのが探すのが大変。 IEだと日本語でも検索出来るけど、Chromeじゃそうはいかない。

そんな時に見つけたbookmarket。

htmlのセレクト要素をインクリメンタルサーチする bookmarklet - #侍ズム

javascript:(function (){var q=String.fromCharCode(39);var s=document.getElementsByTagName('SELECT');for(var i=0;i<s.length;i++){ var a = document.createElement('div');s[i].parentNode.insertBefore(a,s[i].nextSibling);a.innerHTML='<input onkeyup="var s=document.getElementsByTagName('+q+'SELECT'+q+')['+i+'];if(!s.a){var original=s.options;s.a=new Array(original.length);for(var i=0;i<s.a.length;i++){s.a[i]=s.options.item(i);}}s.length=0;for(var i=0;i<s.a.length;i++){if(-1!=(s.a[i].text).toLowerCase().indexOf(this.value)){s[s.length]=s.a[i];}}if(this.value.length==0){s.a=null};">';}})()

これをブックマークとして保存しておいて、必要な時に実行すればプルダウンメニューの下に検索窓が出来る。 超便利、素晴らしい。

vimのvimfilesディレクトリをgithubで管理

会社でもVimを使いたいけど環境持っていくのが面倒でやっていなかった。
やっと重い腰を上げgithubでvimfiles(.vim)を管理するようにして会社でも同じVim環境で使えるようにしてみた。

GitHub - Tepp91/vimfiles

ついでにNeoBundleからdein.vimにしたり。というか最初からvimrcを書き直してみた(まだまだ未完)

面倒に感じていた理由はNeoBundleのプラグイン管理がgitで行われているので、git submoduleにする必要があった。
ただgit submoduleは使ったことがなかったのでちょっと億劫だった。

vim scriptはほとんど理解していないが、もうちょいいろいろ書く予定。
vimrcの読書会とかも参考に読んどくといいかも。
vimrc読書会

積みゲー

ゲームをやる時間がなくて、まったく進まないのにどんどんやりたいゲームが出てくる。

FF15は最終章まで一気にやったけどここでレベル上げの作業が必要になってから勢いがなくなってしまった。
キングダムハーツシリーズとか終わる気がしない。
ゲーム開発のほうもしたいし、少しずつでも進めていかないと・・・・・・

alignによるアライメントの変化で思ってたsizeofと違う結果になった

事の発端

頂点データを設定したが、うまく描画されず調べてみるとVertex構造体のサイズが思ってたのと違う!

struct Vertex{
    Vector4 pos;
    Vector2 uv;
};

std::cout << sizeof(Vector4) << std::endl; // 16
std::cout << sizeof(Vector2) << std::endl; // 8
std::cout << sizeof(Vertex) << std::endl;  // 32

Vector4とVector2の合わせて24byteのつもりでデータを設定していたので頂点を1個進めるごとに8byteずれていってしまう。4byteアライメントと考えても24byteならなんの問題もないはず。一体なぜ。

原因

実は、Vector4はメンバ変数として__m128を使用しており、__m128は16byteアライン*1で定義されている。 どうやらこれによってVector4を持つクラス・構造体も16アライメントになるようで、結果24byteではなく、16の倍数である32byteになったようだ。

ちなみに、さらにこのVertex構造体をHogeクラスで持つと、やはりHogeクラスも16byteアライメントになった。

*1:メモリを16byte境界で確保する