2016年7月29日金曜日

Trie

トライ木と呼ばれるデータ構造を作成します.
retrievalからtrieなので, treeと同じ発音だそうですが, 日本語ではトライだそうです.
各ノードがそれぞれラベルを持ち, 部分木は共通の接頭辞を持ちます.
"add", "and", "ans"からなるトライ木は以下のようになります.

前処理のための中間データとして作成したため, 効率は考慮していません.

population count

32bitのpopulation count
1のビットを数え上げる
コンパイラ組み込み関数を使わない場合,
inline u32 population_count(u32 v)
{
    v = (v & 0x55555555U) + ((v>>1) & 0x55555555U);
    v = (v & 0x33333333U) + ((v>>2) & 0x33333333U);
    v = (v & 0x0F0F0F0FU) + ((v>>4) & 0x0F0F0F0FU);
    v = (v & 0x00FF00FFU) + ((v>>8) & 0x00FF00FFU);
    return (v & 0x0000FFFFU) + ((v>>16) & 0x0000FFFFU);
}
gccの組み込み関数,
int __builtin_popcount(unsigned int x)
VCの組み込み関数,
unsigned int __popcnt(unsigned int value)

2016年7月8日金曜日

C#クロージャのUnity3Dにおけるコストについて

前回に引き続きクロージャです.

クロージャを実現するために, コンパイラは裏側でクラスを作成します.
もしスマートフォン向けのアプリケーションを開発しているのならば,
これだけでも高いコストを支払っています.

かなり強引な例ですが, 以下のようなコードの場合を考えます.
Destroyボタンを押してから, Unloadボタンを押してもテクスチャは解放されません.
Clearボタンを押してから, Unloadボタンを押すことで解放されます.
クラスはどこかから参照されているかぎり, ガーベージコレクタによって削除されません.
明らかにLoaderの実装に欠点がありますが,
texture変数は, コード上ではスコープから外れて参照が切れているように見えてしまっている、
ことも問題です.

C#クロージャのコストについて

プログラマ向けのテーマではないです. プログラムも行うデザイナ向けです.
もちろん, ちょっとしたツールを作るときはあなたの自由にプログラミングを楽しむべきです.

Visual Studio 2013 .Net Framework 4.5でコンパイルしました.
実験にはILSPYを使用しました.

URIは失念しましたが, このような実験を行った先人はいます.
疑問を持ったら, せっかく便利なツールがあるのですから, まず自分でやってみるべきです.

2016年6月18日土曜日

GameObjectをキャッシュして使い回すScrollRect

Unity3DのScrollRect.
DynamicScrollRectから見れば, GameObjectがキャッシュされているかは知らなくてよいこと.

2016年5月7日土曜日

_mm_load1_ps(_mm_load_ps1), _mm_set1_ps(_mm_set_ps1)

_mm_load1_ps(_mm_load_ps1)と, _mm_set1_ps(_mm_set_ps1)
どちらも, movssとshufpsになる.
最初から参照のものは_mm_load1_ps,
定数や参照でないものは_mm_set1_ps,
という使い分けでいいと思われる.

_mm_load1_psの存在意味がわからないな.
他のロード系命令との対応と, _mm_set1_ps(*x)と書かなくてもよいぐらい?

ポインタのエイリアスを意識したプログラムを書いてないので,
ここだけ頑張っても, という気もする

2016年4月10日日曜日

Unity3DのTime.time

float endTime = Time.time + duration;
while(Time.time<endTime);
というコードをよく見るので調べてみた.
もちろん私はこのようなコードは書かない.