質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

2回答

1483閲覧

サーバーサイドで物理演算の実行【Node.js】

Lizard_Nest

総合スコア9

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2021/06/17 15:33

只今、JavaScriptのみで物理演算ライブラリを用いたアプリを作成しているのですが、演算対象が多くなると動きがカクついてきてしまっています。それを解消するためにNode.jsでサーバサイドで物理演算を行い、その結果をWebSocketでリアルタイムにクライアント側へ送ることでカクツキを解消出来ないかと考えているのですが、この考えは間違っている、または技術的に出来ないということはあるでしょうか。また、他にクライアント側での物理演算を軽くする方法などがあれば教えて頂きたいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

フロントエンドのJavaScriptが重いので、
サーバサイドのNode.jsに逃したいとのことですが、
不特定多数へ公開する事が目的ならばオススメ出来ません。

逆に自分一人で行うならば良い案になるかもしれません。
特にブラウザを開いている端末がスマホやノートPCといった貧弱なマシンで、
母艦の高性能なサーバマシンに処理を移譲したいケースであれば最善となりうるでしょう。
(イメージとしてはクラウド実行したゲーム)

ただし、それに飛びつく前に本当のボトルネックが何なのかをしっかり調査する必要があります。
現状が分からないので何とも言えませんので、見るべき所を羅列という形で上げていきます。

カクツキを解消出来ないか

そもそも何故カクツキが発生しているのでしょうか?
JavaScriptとして一番考えられる原因がDOMツリー操作です。

ブラウザの画面描画はDOMツリーというオブジェクトをメモリ上に展開し、
JavaScriptはブラウザが用意したDOMツリーを書き換えるAPIにお願いして画面の更新を促します。

これのコスパが非情に悪いです。
もしうねうね動く物理演算を、裏で大量のdivタグ作ってstyle要素を編集して操っているのであれば、
もはや物理演算云々の話ではありません。
DOMツリーがクソなので画面がカクついています終わり。

そこがボトルネックなのであれば、
せっせとWebSocketを使ってサーバサイドに逃がしても無駄です。
結局画面更新の負荷でブラウザは固まり、カク付くことでしょう。

まず下記を試しましょう。

  • svg画像に逃がす

DOMツリーより出来る事は少ないので多少コスト減になるか?

  • DOMにデータを持たせているならJSの変数にデータを持たせる

DOM APIでのやり取りを極力減らす事が目的
JS自体は数万レベルの配列操作ならば結構高速にやってくれる

差分だけ賢く更新してくれるので、下手なDOM操作のコードを自分で書くよりもマシになる可能性
あくまで可能性程度


以下はそのボトルネックが本当に物理演算だったという前提で考えていきます。

そもそも物理演算の計算をサーバーサイドに逃すと言うことは、
GPU(グラフィックカード)を利用した方が得意なジャンルの計算ではないでしょうか?

もしそうならサーバーサイドに逃がす選択肢自体は悪くないように思えます。
Node.jsはGPU扱えますしね。
参考記事: JavaScriptでGPUを簡単に扱えるライブラリ「GPU.js」レビュー、並列処理で多次元の演算が爆速に

ですがまぁWebアプリの利用者全ての物理演算を
Webサーバのマシンに代わりにやれという状況になります。

一人や二人しか使わないのであれば最善でしょうけど、
もしWeb上に公開して不特定多数のユーザー達に利用してもらうつもりなら
1ヶ月何十万・何百万円するようなWebサーバを
AWS等から借りて運用する事になるかもしれません。
人気が出たら会社を立ち上げる等マネタイズが急がれるでしょう。

Node.jsのWebSocketが同時に捌ける接続数という制約もあります。
調査した感じだと数千人で頭打ちになり、その辺でも利用者に応じてサーバーマシンを増やす対策をしなければなりません。
Node.jsを捨てる選択肢も必要かもしれません。
参考記事: WebSocket大合戦:Clojure、C++、Elixir、Go、NodeJS、Ruby

投稿2021/06/17 16:40

編集2021/06/18 03:16
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こういう場合にはwasmを使用すると思います。

投稿2021/10/06 06:02

tekka

総合スコア514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問