
前回試さなかった goroutine を使ってポリゴンラスタライザとか書いてみました。 並列化といえばシェーダだよね? ということでシェーダ対応です(というのはちょっと詐欺。理由は後で)
こんな感じで、ポリゴンに法線マッピングを施して出力します。
複数の出力をつなげて動画にしたもの→ http://www.youtube.com/watch?v=XwB16g3vNBk&fmt=22
まずは、goroutine を使わない場合(計測のため、同じ処理を50回ループしています)
$ ./main start 10169 ms done
次に、ポリゴンの描画処理を goroutine として呼び出してみます。ポリゴン単位で分散させてるのが「ちょっと詐欺」の理由です(描画順を指定できないので実用にならない)
$ ./main start 9838 ms done
あれ、あんまり……
大丈夫。こうすると Go さんが本気を出してくれるらしいです。
$ GOMAXPROCS=2 ./main start 6917 ms done
けっこう速くなった!(こんなもんか、という感じも)
CPU利用率も100%超に。
複数個の返り値が気持ちいい。
vec3.X, vec3.Y, vec3.Z, _ = func_returns_vec4();
とかして、関数から返ってきた4次元ベクトルを(4要素目は捨てて)3次元ベクトルにそのままつっこんだり
func (v *Vec3) Components() (float, float, float) {
return v.X, v.Y, v.Z;
}
としておいて
calcLength(0.0, 1.0, 2.0); calcLength(vec3.Components()); // ← そのままパラメータに
とか。でも、
calcLength(vec2.Components(), 0); // ← これはダメ
これはできないみたい
同期の方法。go した数だけ chan 空読みしかないの?
source code: http://github.com/gyuque/shadergo