回答編集履歴

2

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

2021/06/18 03:16

投稿

miyabi-sun
miyabi-sun

スコア21194

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

1

校正

2021/06/18 03:16

投稿

miyabi-sun
miyabi-sun

スコア21194

test CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
  DOMツリーを弄る行為ってコスパが死ぬほど悪いんですよね。
98
98
 
99
- なのでDOMツリー上にDIVタグを100万個並べてstyleを付与して模様をうねうね変えるみたいな事は非情にコスパいで
99
+ なのでDOMツリー上にDIVタグを100万個並べてstyleを付与して模様をうねうね変えるみたいな事はブラウザフリーズしかねな辞めましょう
100
100
 
101
101
 
102
102