SlideShare a Scribd company logo
1 of 37
何が?
まじかよ
three.jsを「遅い」と思わせ
ないデータの扱い方
2017/2/15 jey-en
何作ったのさ
Three.jsというモノを使い、
Xbox360で配信していた
3D同人ゲームの
移植を行った
(1面のみの、おためし版)
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
もくじのようなもの
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
three.jsって?
オープンソースの、100%JavaScriptで作られた、
3D(WebGL)を扱いやすくするためのJSライブラリ。
https://threejs.org/
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
ココがイイぞ!three.jsでゲーム制作
ゲーム作成に必要なモノは揃ってる。
アタリ判定、モデルとRayとの交点(高さ検出)、3D&2Dベクトル型、Matrix型、
ボーン、クォータニオン、3D座標からスクリーン座標&その逆などなど、
DirectXを触ったことがある人なら,ごくごくすんなりと開発できるはず。
ゼロからの人は、まぁ、頑張れ。いつか日の光は見える。
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
ココがイイぞ!three.jsでゲーム制作
豊富なインポータ。
json(blender)、FBX、obj、なんとMMDも対応している。
MMDはモデル&アニメーションだけでなく、
頂点モーフまで対応。
あんなモデルが即ブラウザで表示できて動く!
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
ココがイイぞ!three.jsでゲーム制作
遅くない。っていうか早い。
そして出来ることが多い
幾つかある3Dラッパーの中では最速。らしい。
シェーダーもぶっ叩ける。触れば触るほど
やれることが増えていく。楽しい!
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
ここからが本題です。
配信直前で泣かない
ためのお話をしましょう
すこし先の話をしよう。
ゲームが完成した!
スペース借りて、公開だ!
「すごーい!君は
ブラウザで動く3Dゲームが作れる
フレンズなんだね!」
ちくしょう!台無しにしやがった!!
誰もお前を愛さない
シングルスレッドの限界に挑むデータロード
おさらい:
JavaScriptは、シングルスレッドである。
WebWorker?とりあえず忘れろ。
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
シングルスレッドの限界に挑むデータロード
three.jsの、モデルデータの読み込みについてのフロー
ダウンロード完了後に、
「ローダープラグインが、モデルデータをthree.js用に変換する」
その後、メインプログラム側のコールバックにした「Load」に入る。
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
データ
ダウンロード
ローダーでの解析・変換 ロード後コールバック
ローダーライブラ
リ
ユーザーコード
three.jsの、モデルデータの読み込みについてのフロー
ヤバイのは実は、「ダウンロードの時間」ではなく、
「ローダーでの解析時間」 と 「コールバック時処理」 のあわせ技!!
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
データ
ダウンロード
ローダーでの解析 ロード後コールバック
マルチ可能 マルチ不可能!!!
シングルスレッドの限界に挑むデータロード
three.jsの、複数モデルデータの読み込みについてのフロー
ヤバイのは実は、「ダウンロードの時間」ではなく、その後の時間!
DL ローダーでの解析 ロード後コード
DL
DL
DL
ローダーでの解析 ロード後コード
画面更新可能 画面更新不可能画面更新不可能
誰もお前を愛さない
じゃあどうしよう。
魔法の呪文を唱えましょう。
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
シングルスレッドの限界に挑むデータロード
大正義
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
シングルスレッドの限界に挑むデータロード
three.jsの、モデルデータの読み込みについてのフロー
第一の改善点
一番楽に済む改修点がコレ。
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
データ
ダウンロード
ローダーでの解析
ロード後コー
ド
ここにSetTimeOut
シングルスレッドの限界に挑むデータロード
three.jsの、モデルデータの読み込みコード第一の改善
コレを・・
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
loader.load( modelFile, function ( object ) {
mesh = object;
mesh.position.y = -10;
scene.add( mesh );
//中略
}, onProgress, onError );
シングルスレッドの限界に挑むデータロード
three.jsの、モデルデータの読み込みコード第一の改善
こうじゃ。
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
loader.load( modelFile, function ( object ) {
var loadEnd = function (_object) {
mesh = (_object;
mesh.position.y = -10;
scene.add( mesh );
//中略
};
setTimeout(loadEnd(object), 10);
}, onProgress, onError );
シングルスレッドの限界に挑むデータロード
three.jsの、複数モデルデータの読み込みについてのフロー
現在のフローがこんな感じ
DL ローダーでの解析 ロード後コード
DL
DL
DL
ローダーでの解析 ロード後コード
画面更新が可能になった!
three.jsの、複数モデルデータの読み込みについてのフロー
次の問題はこの「1つのまとまりの大きさ」が、まだ大きい・・・・。
DL ローダーでの解析 ロード後コード
DL
DL
DL
ローダーでの解析 ロード後コード
2.5~3秒 0.3秒
大正義
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
シングルスレッドの限界に挑むデータロード
three.jsの、モデルデータの読み込みコード第一の改善
オープンソースの醍醐味を活かそう。
ローダーを独自改修し、SetTimeOutを仕込む!
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
シングルスレッドの限界に挑むデータロード
MMDLoader.jsの、モデルデータの読み込みコードの魔改造
コレを・・
//83行目(ビルド後ファイル・ver r84時点)
THREE.MMDLoader.prototype.load = function ( modelUrl, vmdUrls, callback, onProgress, onError ) {
var scope = this;
this.loadModel( modelUrl, function ( mesh ) {
scope.loadVmds( vmdUrls, function ( vmd ) {
scope.pourVmdIntoModel( mesh, vmd );
callback( mesh );
}, onProgress, onError );
}, onProgress, onError );
};
シングルスレッドの限界に挑むデータロード
MMDLoader.jsの、モデルデータの読み込みコードの魔改造
こうじゃ
//83行目(ver r84時点)
THREE.MMDLoader.prototype.load = function ( modelUrl, vmdUrls, callback, onProgress, onError ) {
var scope = this;
this.loadModel( modelUrl, function ( mesh ) {
var modeLoadEnd= function (_mesh) {
scope.loadVmds( vmdUrls, function ( vmd ) {
scope.pourVmdIntoModel( _mesh, vmd );
callback(_mesh );
}, onProgress, onError );
};
setTimeout(modeLoadEnd( mesh ), 10);
}, onProgress, onError );
};
シングルスレッドの限界に挑むデータロード
three.jsの、複数モデルデータの読み込みについてのフロー
トータルの読み込み時間は変わらないが、間に画面更新が可能になった!
DL ローダーでの解析 ロード後コード
DL
DL
DL
ロード後コード
2.5~3秒 0.3秒
ローダーでの解析
大正義
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
シングルスレッドの限界に挑むデータロード
JunkFieldsでのデータの読み込みについてのフロー
メッシュ地形DL
本地形データDL
主人公メカデータDL
ボイスデータDL
敵メカデータDL
敵メカデータDL
本編ボイスデータDL
タダの暗闇
(長くて0.5秒) 戦闘説明デモ画面(全部見ると1分近い)
戦
闘
本
編
本
編
初
期
化
シナリオスクリプトDL
ココはイケてない。three.jsでゲーム制作
Unityの強力なアセットストアが使えない。
リソースは全て自前で用意する必要がある。
ストア以外でもUnity限定配信とかのフリーモデルとかある。
過剰なUnity信仰文化氏ね。
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
ココはイケてない。three.jsでゲーム制作
ガチで3Dゲームを作りたいなら、
おとなしくUnityにしとけ!
ソース丸見えチートし放題問題&アセットストアの有用性で、
Unityのメリットが上回ると思う(個人の感想です)。
企業ユースのゲームとしては、three.jsはやっぱりキツイと思う。
three.jsでゲーム作成」というノウハウは少なく、デビュー作にはVeryHard
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
今回の話と関係のない結論
●ガチじゃない、さくっと3Dゲームを作って公開したい!
ということに関しては、three.js は選択肢の一つとして十分オススメ出来る!
●本業がゲーム畑にいない人&元同人ゲーム作者にこそ、
覚えていただきたい選択肢!
●ゲーム以外で3Dの表現を使いたいなら、three.js最高!!
はじめに three.js って何さ
ココがイイぞ!
three.jsでゲーム制作
ココがイケてない。
three.jsでゲーム制作
その他
悪あがき
シングルスレッドの限界に挑むデータロード
おわり
ありがとうございました。お疲れ様でした。
three.jsが気になったひとは、ぜひ
three.js ぱんつ 検索

More Related Content

What's hot

ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
Takahito Tejima
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 

What's hot (20)

30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方
 
基礎線形代数講座
基礎線形代数講座基礎線形代数講座
基礎線形代数講座
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 
Riderはいいぞ!
Riderはいいぞ!Riderはいいぞ!
Riderはいいぞ!
 
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころ
 
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
 
アドテクを支える基盤 〜10Tバイト/日のビッグデータを処理する〜
アドテクを支える基盤 〜10Tバイト/日のビッグデータを処理する〜アドテクを支える基盤 〜10Tバイト/日のビッグデータを処理する〜
アドテクを支える基盤 〜10Tバイト/日のビッグデータを処理する〜
 
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
 
UniRxでMV(R)Pパターン をやってみた
UniRxでMV(R)PパターンをやってみたUniRxでMV(R)Pパターンをやってみた
UniRxでMV(R)Pパターン をやってみた
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
楽しいShaderToy
楽しいShaderToy楽しいShaderToy
楽しいShaderToy
 

Viewers also liked

Web Workers
Web WorkersWeb Workers
Web Workers
kaboccha
 
第2回html5jゲーム部勉強会 Oh! JavaScript 夢の続きを語ろうよ〜emscriptenの逆襲 - html5編
第2回html5jゲーム部勉強会   Oh! JavaScript 夢の続きを語ろうよ〜emscriptenの逆襲 - html5編第2回html5jゲーム部勉強会   Oh! JavaScript 夢の続きを語ろうよ〜emscriptenの逆襲 - html5編
第2回html5jゲーム部勉強会 Oh! JavaScript 夢の続きを語ろうよ〜emscriptenの逆襲 - html5編
Takashi Toyoshima
 
ライオンでも分かるVuejs
ライオンでも分かるVuejsライオンでも分かるVuejs
ライオンでも分かるVuejs
lion-man
 
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれからYahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo!デベロッパーネットワーク
 

Viewers also liked (16)

海外で注目されてるJs framework “mithril”の特徴
海外で注目されてるJs framework “mithril”の特徴海外で注目されてるJs framework “mithril”の特徴
海外で注目されてるJs framework “mithril”の特徴
 
Web Workers
Web WorkersWeb Workers
Web Workers
 
OSC京都 2015 LT 「テスト自動化の闇と向き合う」
OSC京都 2015 LT 「テスト自動化の闇と向き合う」OSC京都 2015 LT 「テスト自動化の闇と向き合う」
OSC京都 2015 LT 「テスト自動化の闇と向き合う」
 
Onsen UI 2.0とUIライブラリの未来
Onsen UI 2.0とUIライブラリの未来Onsen UI 2.0とUIライブラリの未来
Onsen UI 2.0とUIライブラリの未来
 
20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
 
第2回html5jゲーム部勉強会 Oh! JavaScript 夢の続きを語ろうよ〜emscriptenの逆襲 - html5編
第2回html5jゲーム部勉強会   Oh! JavaScript 夢の続きを語ろうよ〜emscriptenの逆襲 - html5編第2回html5jゲーム部勉強会   Oh! JavaScript 夢の続きを語ろうよ〜emscriptenの逆襲 - html5編
第2回html5jゲーム部勉強会 Oh! JavaScript 夢の続きを語ろうよ〜emscriptenの逆襲 - html5編
 
意識低くMeteor紹介
意識低くMeteor紹介意識低くMeteor紹介
意識低くMeteor紹介
 
軽量フレームワークNancy
軽量フレームワークNancy軽量フレームワークNancy
軽量フレームワークNancy
 
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
 
Riot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディングRiot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディング
 
Web Workerで○○する話
Web Workerで○○する話Web Workerで○○する話
Web Workerで○○する話
 
ライオンでも分かるVuejs
ライオンでも分かるVuejsライオンでも分かるVuejs
ライオンでも分かるVuejs
 
Vue.js入門
Vue.js入門Vue.js入門
Vue.js入門
 
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれからYahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り
 
サイボウズのフロントエンド開発 現在とこれからの挑戦
サイボウズのフロントエンド開発 現在とこれからの挑戦サイボウズのフロントエンド開発 現在とこれからの挑戦
サイボウズのフロントエンド開発 現在とこれからの挑戦
 

Recently uploaded

The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
koheioishi1
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
YukiTerazawa
 

Recently uploaded (8)

ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 

three.jsを「遅い」と思わせないデータの扱い方

Editor's Notes

  1. えーみなさま、はじめましてでございます。
  2. 大したことは言いません。どうぞご歓談メインで、聞き流していただければと思います。 そのかわりウルサクさせていただきます。 ということでライトニングトークのお題です。
  3. スリーJSを「遅い」と思わせないデータの扱い方 ということで、お話させていただきたいと思います。よろしくお願いします。 -- 30s
  4. 今さらお前は誰だ、ということでですね、申し遅れました。私、タムラと申します。スリーJSで、個人制作でゲームなんて作ってみました。個人制作です。ゲーム作りをプロでやってるわけじゃありません、大したお話はできません。 チョット時間が5分からはみ出ちゃうと思うんですけど、ちらっとどんなゲームか、30秒ほど動画でおみせします。 このゲーム、お世辞ではなく、Edgeが一番早いです。 はい、お粗末様でした。
  5. 本日の流れ。どうでもいいですね。多分この通りに喋りません。時間使っちゃったし。 1m
  6. えーそもそもスリーJsってなんぞや、ということなんですが、JavaScriptの3Dプログラム向けのライブラリです。さきほど豊島さんがスリーJsって言ってたのでちょっと安心しました。知名度ちゃんとありますね。 WebGLをラッピングして、使いやすくしてくれたものです。もちろんオープンソースです。すげえ!
  7. この辺は流しますね。 えー大体あります。ゲーム向けメソッド多いです。素敵!はい次。
  8. インポータも結構そろってます。MMD、動かせます。楽しいです。
  9. だいたいこんなかんじです。すりーJSなんて初めて聞いたし、細かく知りたーい、と思ってくださったら、ググってみてください。 はい。 1m15s
  10. 今日はですね、完成直前とか、配信を意識するとか、そういう最後の段階で詰まったときの、解決につながる、かもしれないお話をさせていただきます。 先ほどカシマさんからも、ブラウザゲーム復興だーなんてありましたが、そんなリリース前のお話です。
  11. すりーJSで根性だして、3Dゲームを完成させました! すごい!やりきった! サーバースペースを用意して、アップロードして公開するとしましょう。
  12. もーね、きっと明日の朝には、すごーい、たーのしー!のコメントでいっぱいだ!!ワクワクしますね。  って思うと、
  13. 大体の場合、こうなるんですね。 あーあ。コレダメなやつだ。かーらーの
  14. こうなるんですね。 何がいけなかったのでしょう? 1m45
  15. いまさらな話をさせていただきます。JavaScriptは、シングルスレッドです。何を今更です。みんな知ってるだろうと。 2m
  16. こちらに、3Dモデルデータを、ダウンロードして使えるようにするまでフローを書いてみました。  ご覧の通り、ダウンロードの後に、まずは 「 ローダー側での処理 」がありまして、 すりーJS用に頂点データとか何やらを変換します。  みんな書くのは最後のコールバックのところだけ。 でも、その前にも動いてる処理がある、そのことをちょっと思い出しましょう。 2m30s
  17. そうなんです。2D画像やオーディオと違って、ダウンロード即実行可能、じゃなくて、間に一発いるんですね。 この解析部分、当然、タダのJavaScriptなんで、ふつーにシングルスレッドで走ります。   さぁ、もう嫌な予感がしてきましたね。
  18. これが複数ファイルだと、こうなります。ダウンロードは確かに時間のかかる処理かもしれないですが、ダウンロードは別スレッドですので、その間、画面を止めないのは、実はそれほど難しくない。 スピナーでもくるくる回しとけばいいんです。 ヤバイのはその後。 ここで、この1組の処理が終わるまで、画面の更新が一切行われなくなります。でもって、その次のファイルも同じように、長く止まっちゃうと。 もーヤバイです。スピナー君もこの最中は、回ってくれません。 
  19. んで、こうなります。 秒間1フレームという地獄のできあがりです。 2m30
  20. じゃあどうしましょうってことで、魔法の呪文を唱えましょう。 みんな知ってるあの呪文です。  せーの!
  21. SetTimeOut!みんな大好き。最強です。今回もなんとかしてもらいましょう。
  22. ということで、解析が終わったところの、ロード後のコードのところで、SetTimeOutをはさみます。
  23. 元がコレですね。っていうかスライドのソースの字なんて見えませんね。ざっくりいきます。予想できると思いますけど、 コレを、
  24. こんな感じ。setTimeout の呼び出しを付けるだけ。これだけで、結構なんとかなります。
  25. この回収で、タイムライン的にはこんな感じになります。SetTimeOutのおかげで、画面更新のタイミングができます。 ぶっちゃけローポリで、アニメーションが長くないキャラだったら、これでなんとかなることも多いです。だがまだ足りないこともあると。
  26. これがデカイデータだとどうなるか。 自分のゲームのデータで3000頂点、5000フレームかな、ですと、解析時間だけで3秒。 画面ごと固まってるってのは、やっぱりキッツイですよね。まだなんとかしたい。なんとかできないだろうか。
  27. お前の力は、こんなもんじゃないだろと。まだいけます。なんとかしてもらいましょう。
  28. こっから先は、ソースをいじくるのが、ちょっと疲れます。必要ならば、やってみる感じです。 オープンソースって事を活かしましょう。フォークしても、ビルドしたやつをいじっても、どっちでもいいんじゃないですか。
  29. 例のMMDローダーを試しにいじってみることにしましょう。 元がコレですね。見えませんね。  まぁ続けますけど、見た感じ、二つの処理が繋がってるぞと。コレを、
  30. こうするわけですね。やったことは、さっきと同じです。 処理の区切りを意識して、見つけて、そこにSetTimeOutを仕込んでいく、それだけです。
  31. こうすることで、当然、トータルの読み込み時間は減りませんが、間に画面が更新できるタイミングが生まれます。 これを必要な負荷に応じて分割を増やすことで、止まったような画面を見なくて済む、かもしれません。頑張れば!
  32. ありがとうSetTimeout。今回も世界は救われた。君のことは忘れない!
  33. というわけで時間ないんですけど、自分のゲームのロード部分の図解です。 小刻みにいろいろなファイルが読まれていって、間あいだで画面の更新ができてます。ありがとうSetTimeOut! はい! --------- 最後に、自分が作ったゲームでの、データのロードの図解っぽいやつです。 (1分以上余ってた場合のみ全部言う) 最初に、ワイヤーフレームで表示する用の軽いモデルデータのダウンロードが走りまして、そのモデルのダウンロードと読み込みが終わると、いわゆる戦闘説明画面っぽいデモが入ります。そのデモ画面の最中、裏ではガリガリとダウンロードとダウンロード後の解析をやるわけですが、こんな感じでSetTimeOutを使って、それぞれが小刻みに読まれていく感じなんですね。んで、全部終わった所で本編突入です。これで、いわゆる「止まらないけど後ろではロードしてるんだぞ」という画面が可能になりました。何かの参考になれば幸いです。
  34. ちょっとお時間が余ってますので、 順番が前後しましたが、すりーじぇいえすの欠点といいますかなんといいますか、無理矢理な話しですけども。余談を話します。  unityのアセットストアが使えないので、データの用意に苦労することになるんですね。 3Dのデータって作れる人は2Dに比べたら一気に少なくなりますから、そこをカバーできるアセットストアは、ホント凄いと思います。リソースの自前は、おもったよりもキツイです。 まぁこれはあくまでUnityと比べたら、ということで。unity以外の環境からしたら、別に劣ってるということじゃないです。Unityがスゴすぎるだけ。 でも、 今日見せてだいたプレイカンバスは楽しそうだったので、 もし次、こういう機会があれば、プレイカンバスとの比較も用意してみたいなと思います。
  35. ということで、まとまらないまとめなんですけれども、 Unityでよくね、以上ですって、話が終わっちゃうので。ブラウザで公開したい!という特殊な事情がない限りは、別にthree.jsにこだわることって無いと思います。とにかく、3Dモデルデータが用意できるかどうか、まず最初の分かれ目はそこですね。
  36. --- 残り15s ------------ ということで、なんか今日話したことと全然関係ないまとめのようなんですけど、先ほどですね、オガワさんからWebGLでゲームはお金にはならんという泣ける結論がありましたけども、もしゲームを個人で作ってる人とかいらっしゃたら、three.jsは、ぜひやってみろと!面白いぞ!と、おすすめしたいと思います。
  37. ということで、おつきあいいただきまして、ありがとうございました。 すりーJSが気になった方はですね、ぜひとも画面に出てる、どーしょもないキーワードとかでググっていただいて、少しでも興味をもって頂けたら幸いです。 ということで、以上になります。 ありがとうございました。