teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

回答としての精度を上げる為に大幅に書き直し

2021/06/18 03:16

投稿

miyabi-sun
miyabi-sun

スコア21465

answer CHANGED
@@ -1,62 +1,65 @@
1
1
  フロントエンドのJavaScriptが重いので、
2
2
  サーバサイドのNode.jsに逃したいとのことですが、
3
- 基本にはオススメ出来ません。
3
+ 不特定多数へ公開する事が目ならばオススメ出来ません。
4
4
 
5
+ 逆に自分一人で行うならば良い案になるかもしれません。
6
+ 特にブラウザを開いている端末がスマホやノートPCといった貧弱なマシンで、
7
+ 母艦の高性能なサーバマシンに処理を移譲したいケースであれば最善となりうるでしょう。
5
- > アプリを作成しているのですが
8
+ (イメージとしてはクラウド実行したゲーム)
6
9
 
7
- そのWebアプリは誰使うんです
10
+ ただし、れに飛びつく前に本当ボトルネック何なのをしっかり調査する必要があります。
8
- 同時に何人どうう状況下使う事想定していますか?
11
+ 現状分からな何とも言えませんので、見るべき所羅列という形で上げています
9
12
 
10
- んで回答でこんな質問するねん。
13
+ > カクツキを解消出来いか
11
- そしてサーバサイドに処理を逃がす行為が反対な理由は何だよって思いますよね。
12
14
 
13
- れは限られた有限の人間だけ使えサービスなのか
15
+ もそも何故カクツキ発生しているのでしょう
14
- 不特定多数が自由に使えるビスなのか取るべき手段が変わるからです。
16
+ JavaScriptとして一番考られ原因がDOMツリ操作です。
15
17
 
18
+ ブラウザの画面描画はDOMツリーというオブジェクトをメモリ上に展開し、
16
- バーサイドた場合、利用者全ての物理演算Webサーバに代わりにやれという非情な命令となります。
19
+ JavaScriptはブラウザが用意したDOMツリを書き換えるAPIお願いして画面更新促します。
17
- 1台分の物理演算を賄うだけでクソ重くて処理落ちしてんのに、
18
- 2人アクセスするだけで並のマシンで賄えるはずないやんって話ですよ。
19
20
 
21
+ これのコスパが非情に悪いです。
20
- もしWeb上に公開して全世界のユーザー達に使ってと広めつもりなら
22
+ もしうねうね動く物理演算を、裏で大量のdivタグ作ってstyle要素を編集してってのであれば、
21
- 1ヶ月百万円するようなWebサーバを
22
- AWS等から借りて運用する事になるしょう
23
+ もはや物理演算云々の話はありません
23
- これがサバーサイドに重い処理を逃すという意味です。
24
+ DOMツリーがクソなの画面がカクついていま終わり
24
25
 
26
+ そこがボトルネックなのであれば、
25
- また、Node.jsのWebSocketが同時に捌ける接続数ご存知ですか?
27
+ せっせとWebSocketを使ってサーバサイドに逃がしても無駄です
26
- 利用者曰く、数千人で頭打ちになるとのことで
28
+ 結局画面更新負荷でブラウザは固まり、カク付くことでしょう
27
- 利用者が万を越えたらサーバー台数を増やして対応しなければならないということですね。
28
29
 
29
- > 他にクライアント側での物理演算軽くする方法などがあれば教えて頂きたいです
30
+ まず下記試しましょう。
30
31
 
32
+ - svg画像に逃がす
33
+ DOMツリーより出来る事は少ないので多少コスト減になるか?
34
+ - DOMにデータを持たせているならJSの変数にデータを持たせる
35
+ DOM APIでのやり取りを極力減らす事が目的
36
+ JS自体は数万レベルの配列操作ならば結構高速にやってくれる
37
+ - 画面更新は[requestAnimationFrame](https://developer.mozilla.org/ja/docs/Web/API/Window/requestAnimationFrame)を利用する
38
+ - ReactやVue等のJSフレームワークの導入
31
- 物理演算はCPUシングルスレッドで無理やり動作させるJavaScriptやNode.jsよりもGPU(グラボ)が得意とすジャンルの話のはずです。
39
+ 差分だけ賢く更新してくれるの、下手なDOM操作のコーを自分書くよりもマシにな可能性
40
+ あくまで可能性程度
32
41
 
33
- そもそもWebアプリとして使う意味があるのか
34
- みたいな技術選定からやり直してみたり
42
+ ---
35
43
 
36
- ElectronからNode.jsを経由して、
37
- GPUを利用出来るよなライブラリを利用しみるとか
44
+ 以下はそのボトルネックが本当に物理演算だったとい前提で考えいきます。
38
- そしたらHTML・CSS・JSを使いつつもGPUにアクセスするマルチプラットフォームアプリとして配布出来そうです
39
45
 
40
- 小手先の技術でよければRustで物理演算組んでWebAssembly越しにJSから利用出来るようにするというのも手です。
41
- Rustは全く詳しくないで全くアドバイス出来ないで
46
+ そもそも物理演算計算をサーーサドに逃と言うことは、
42
- 多少はパマンス良くるかもれませんね。
47
+ GPU(グラィックカド)を利用した方得意ジャンルの計算ではないでょうか?
43
48
 
49
+ もしそうならサーバーサイドに逃がす選択肢自体は悪くないように思えます。
44
- > カクツキを解消出来ないか
50
+ Node.jsはGPU扱えますしね。
51
+ 参考記事: [JavaScriptでGPUを簡単に扱えるライブラリ「GPU.js」レビュー、並列処理で多次元の演算が爆速に](https://gigazine.net/news/20200805-gpu-js/)
45
52
 
46
- これは質問文を見ての思いつきなのですが
53
+ ですがまぁWebアプリの利用者全ての物理演算を
47
- 毎秒・毎フレ描画をHTML上のDOMで操作しくってませんか?
54
+ Webサマシンに代わりにやれという状況になりす。
48
55
 
56
+ 一人や二人しか使わないのであれば最善でしょうけど、
57
+ もしWeb上に公開して不特定多数のユーザー達に利用してもらうつもりなら
58
+ 1ヶ月何十万・何百万円するようなWebサーバを
59
+ AWS等から借りて運用する事になるかもしれません。
49
- DOMツリー行為ってコスパ死ぬほど悪いんすよね
60
+ 人気が出たら会社立ち上げ等マネタイズ急がれるしょう
50
- なのでDOMツリー上にDIVタグを100万個並べてstyleを付与して模様をうねうね変えるみたいな事はブラウザがフリーズしかねないので辞めましょう。
51
61
 
52
- DOMのdata属性にもたせてそこから読み出すみたいな事も
53
- 死ぬほどパフォーマンスに悪影響が出るので、
54
- 状態を持たせるならJavaScript上の変数スコープに全てロードしてそこで管理しましょう。
55
-
56
- もしレンダリングをアニメーションしたければ、
57
- [requestAnimationFrame](https://developer.mozilla.org/ja/docs/Web/API/Window/requestAnimationFrame)を使う事も検討してみてください。
58
-
59
- DOMへの書き出しは常に必要最小限
60
- jQueryとか使っているならばReactやVueを使いましょう。
61
- そしたら簡単なWebアプリくらいなら描画が最適化されるでマシ可能性はあります。
62
+ Node.jsWebSocketが同時捌け接続数という制約もあります。
63
+ 調査した感じだと数千人で頭打ちになり、その辺でも利用者に応じてサーバーマシンを増やす対策をしなければなりません。
62
- そんな所です
64
+ Node.jsを捨てる選択肢も必要もしれません
65
+ 参考記事: [WebSocket大合戦:Clojure、C++、Elixir、Go、NodeJS、Ruby](https://postd.cc/websocket-shootout/)

1

校正

2021/06/18 03:16

投稿

miyabi-sun
miyabi-sun

スコア21465

answer CHANGED
@@ -47,7 +47,7 @@
47
47
  毎秒・毎フレームの描画をHTML上のDOMで操作しまくってませんか?
48
48
 
49
49
  DOMツリーを弄る行為ってコスパが死ぬほど悪いんですよね。
50
- なのでDOMツリー上にDIVタグを100万個並べてstyleを付与して模様をうねうね変えるみたいな事は非情にコスパいで
50
+ なのでDOMツリー上にDIVタグを100万個並べてstyleを付与して模様をうねうね変えるみたいな事はブラウザフリーズしかねな辞めましょう
51
51
 
52
52
  DOMのdata属性にもたせてそこから読み出すみたいな事も
53
53
  死ぬほどパフォーマンスに悪影響が出るので、