Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

軽量化 #7

Open
1 task
the6th opened this issue May 7, 2019 · 5 comments
Open
1 task

軽量化 #7

the6th opened this issue May 7, 2019 · 5 comments
Labels
enhancement New feature or request

Comments

@the6th
Copy link
Collaborator

the6th commented May 7, 2019

  • Lineの描画
the6th added a commit that referenced this issue May 7, 2019
tatsuro-ueda added a commit that referenced this issue May 7, 2019
#7 Line描画のリファクタリング/Manipulate時に手のモデルを表示
the6th added a commit that referenced this issue May 17, 2019
@tatsuro-ueda
Copy link
Contributor

CalculatorからMonobehaviourを外し、限界まで軽量化したが、1回計算するのに2 micro秒かかってしまう。数学関数のせい?これ以上はGPUに処理を移さないと無理。

@tatsuro-ueda tatsuro-ueda added the enhancement New feature or request label Jun 23, 2019
@nekomimimi
Copy link

手元で試せず検証してないので、自分の考えがあっているのか、速くなるのかわからないのですが、

// ベクトルnの長さの2乗(これで単位ベクトルを割る)
var lengthSquareFromOnePoleToCurrentPoint =
displacementFromOnePoleToCurrentPoint.sqrMagnitude;
// ベクトルnの単位ベクトル
var normalizedDisplacementFromOnePoleToCurrentPoint =
displacementFromOnePoleToCurrentPoint.normalized;
// ベクトルn
var forceFromOnePoleToCurrentPoint =
normalizedDisplacementFromOnePoleToCurrentPoint / (float)lengthSquareFromOnePoleToCurrentPoint;

ここがちょっと計算が重複していて速くなる可能性がある感じがします。
sqrMagnitudeとnormalizedの計算の中で両方、x^2 + y^2 + z^2を計算しているので。

sqrMagnitude = x^2 + y^2 + z^2ですが、
ここで、
v = (x, y ,z)
d2 = x^2 + y^2 + z^2
d = sqrt(d2)とすれば、

sqrMagnitude = d2
normalized = (x / d, y / d, z /d)
なので、

normalized / sqrMagnitude = (x / (d * d2) , y / (d * d2), z / (d * d2));

となるので、normaizedを使わずに自力で平方根を使って計算するとsqrMagnitudeの値が使いまわせると思います。
(プログラムの可読性は少々落ちますが)

後、この際に平方根をMathfのほうのsqrtを使うと、doubleからfloatへのキャストをなくせると思います。
https://docs.unity3d.com/ja/2017.4/ScriptReference/Mathf.Sqrt.html

@tatsuro-ueda
Copy link
Contributor

ご丁寧に見ていただいて、ありがとうございます。当方現在出張中ですが、帰り次第早急に実機にて検証したいと思います。

@tatsuro-ueda
Copy link
Contributor

1回の計算に2マイクロ秒かかっていたのが1マイクロ秒になりました。すごいです。ありがとうございます!

// N極からの現在の頂点への変位ベクトル(ベクトルn)
var vec_d = positionCurrentPoint - positionBarMagnetNorthPole;
// ベクトルnの長さの2乗(これで単位ベクトルを割る)
var len_d =
Mathf.Sqrt(vec_d.x * vec_d.x + vec_d.y * vec_d.y + vec_d.z * vec_d.z);
// vec_f = (vec_d / |vec_d|) / (|vec_d|^2)
// = vec_d / |vec_d|^3
// = vec_d / len_d^3
var forceFromOnePoleToCurrentPoint =
vec_d / (len_d * len_d * len_d);

しかし…FPSはあいかわらず40。どうも違うところにボトルネックがあるようです。すいません!

@nekomimimi
Copy link

nekomimimi commented Jul 11, 2019

すでにだいぶ軽量化されているので絞れるところを見つけるのが結構、難しいですねぇ。
その上でどこがボトルネックなのか。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants