- 549 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:09:02 ID:m+X+Qg7j]
- >>546
> たとえばこのコード、複数の Star インスタンスの m_vx, m_vy を同時に読み書きしている。 その言い方は不正確だし、並列化の本質をわかっていない。 そのコード、そもそも元コードがすこしおかしいのだが、タスクシステムを使おうと使うまいと Starオブジェクトの集合から任意の2体を取り出して、その振る舞いを書きたいとする。 foreach(var star1 , star2 in stars) { star1.m_vx = star1.m_vx*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vx*Star2.m_m/(star1.m_m+Star2.m_m); star1.m_vy = star1.m_vy*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vy*Star2.m_m/(star1.m_m+Star2.m_m); } } これは、次のようにかきかえる。 foreach(var star1 , star2 in stars) { star1.m_vx_new = star1.m_vx*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vx*Star2.m_m/(star1.m_m+Star2.m_m); star1.m_vy_new = star1.m_vy*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vy*Star2.m_m/(star1.m_m+Star2.m_m); } foreach(var star in stars) { star1.m_vx = star1.m_vx_new; star1.m_vy = star1.m_vx_new; } これは、コリジョン判定とそれに対するアクションを切り離すときもそう。 これをきちんと切り離しておかないと並列化できない。 前スレでコリジョン判定は並列化できないとか言ってた馬鹿がいたけど、アクションを切り離さないから出来ない。
|

|