SlideShare a Scribd company logo
何が?
まじかよ
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

OpenXR + XR Interaction Toolkit使ったHoloLensコンテンツ開発検証 ~ (私が)完全に理解できたらちゃんと作れて、いろ...
OpenXR + XR Interaction Toolkit使ったHoloLensコンテンツ開発検証 ~ (私が)完全に理解できたらちゃんと作れて、いろ...OpenXR + XR Interaction Toolkit使ったHoloLensコンテンツ開発検証 ~ (私が)完全に理解できたらちゃんと作れて、いろ...
OpenXR + XR Interaction Toolkit使ったHoloLensコンテンツ開発検証 ~ (私が)完全に理解できたらちゃんと作れて、いろ...
Takahiro Miyaura
 
失敗から学ぶAndroid設計話
失敗から学ぶAndroid設計話失敗から学ぶAndroid設計話
失敗から学ぶAndroid設計話
chigichan24
 
OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみた
Takahiro Miyaura
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
 
オープンソース SLAM の分類
オープンソース SLAM の分類オープンソース SLAM の分類
オープンソース SLAM の分類
Yoshitaka HARA
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
torisoup
 
SLAM勉強会(PTAM)
SLAM勉強会(PTAM)SLAM勉強会(PTAM)
SLAM勉強会(PTAM)
Masaya Kaneko
 
Cesiumを動かしてみよう
Cesiumを動かしてみようCesiumを動かしてみよう
Cesiumを動かしてみよう
Kazutaka ishizaki
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門Toru Matsuoka
 
Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
Unity Technologies Japan K.K.
 
フォトンマッピング入門
フォトンマッピング入門フォトンマッピング入門
フォトンマッピング入門
Shuichi Hayashi
 
ロボティクスにおける SLAM 手法と実用化例
ロボティクスにおける SLAM 手法と実用化例ロボティクスにおける SLAM 手法と実用化例
ロボティクスにおける SLAM 手法と実用化例
Yoshitaka HARA
 
ゲーム向けな美味しい乱数を生成する(再アップ版)
ゲーム向けな美味しい乱数を生成する(再アップ版)ゲーム向けな美味しい乱数を生成する(再アップ版)
ゲーム向けな美味しい乱数を生成する(再アップ版)
ai BlogOnly
 
tf,tf2完全理解
tf,tf2完全理解tf,tf2完全理解
tf,tf2完全理解
Koji Terada
 
CRC-32
CRC-32CRC-32
CRC-32
7shi
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
Satoshi Kodaira
 
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Hironobu Isoda
 
RenderTextureの正しいα値は?
RenderTextureの正しいα値は?RenderTextureの正しいα値は?
RenderTextureの正しいα値は?
KLab Inc. / Tech
 
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
MobileRoboticsResear
 
SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII2018TS: 3D物体検出とロボットビジョンへの応用SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII
 

What's hot (20)

OpenXR + XR Interaction Toolkit使ったHoloLensコンテンツ開発検証 ~ (私が)完全に理解できたらちゃんと作れて、いろ...
OpenXR + XR Interaction Toolkit使ったHoloLensコンテンツ開発検証 ~ (私が)完全に理解できたらちゃんと作れて、いろ...OpenXR + XR Interaction Toolkit使ったHoloLensコンテンツ開発検証 ~ (私が)完全に理解できたらちゃんと作れて、いろ...
OpenXR + XR Interaction Toolkit使ったHoloLensコンテンツ開発検証 ~ (私が)完全に理解できたらちゃんと作れて、いろ...
 
失敗から学ぶAndroid設計話
失敗から学ぶAndroid設計話失敗から学ぶAndroid設計話
失敗から学ぶAndroid設計話
 
OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみた
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 
オープンソース SLAM の分類
オープンソース SLAM の分類オープンソース SLAM の分類
オープンソース SLAM の分類
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
SLAM勉強会(PTAM)
SLAM勉強会(PTAM)SLAM勉強会(PTAM)
SLAM勉強会(PTAM)
 
Cesiumを動かしてみよう
Cesiumを動かしてみようCesiumを動かしてみよう
Cesiumを動かしてみよう
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門
 
Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
 
フォトンマッピング入門
フォトンマッピング入門フォトンマッピング入門
フォトンマッピング入門
 
ロボティクスにおける SLAM 手法と実用化例
ロボティクスにおける SLAM 手法と実用化例ロボティクスにおける SLAM 手法と実用化例
ロボティクスにおける SLAM 手法と実用化例
 
ゲーム向けな美味しい乱数を生成する(再アップ版)
ゲーム向けな美味しい乱数を生成する(再アップ版)ゲーム向けな美味しい乱数を生成する(再アップ版)
ゲーム向けな美味しい乱数を生成する(再アップ版)
 
tf,tf2完全理解
tf,tf2完全理解tf,tf2完全理解
tf,tf2完全理解
 
CRC-32
CRC-32CRC-32
CRC-32
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
 
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
 
RenderTextureの正しいα値は?
RenderTextureの正しいα値は?RenderTextureの正しいα値は?
RenderTextureの正しいα値は?
 
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
大域マッチングコスト最小化とLiDAR-IMUタイトカップリングに基づく三次元地図生成
 
SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII2018TS: 3D物体検出とロボットビジョンへの応用SSII2018TS: 3D物体検出とロボットビジョンへの応用
SSII2018TS: 3D物体検出とロボットビジョンへの応用
 

Viewers also liked

海外で注目されてるJs framework “mithril”の特徴
海外で注目されてるJs framework “mithril”の特徴海外で注目されてるJs framework “mithril”の特徴
海外で注目されてるJs framework “mithril”の特徴
Shoyo Kyou
 
Web Workers
Web WorkersWeb Workers
Web Workerskaboccha
 
OSC京都 2015 LT 「テスト自動化の闇と向き合う」
OSC京都 2015 LT 「テスト自動化の闇と向き合う」OSC京都 2015 LT 「テスト自動化の闇と向き合う」
OSC京都 2015 LT 「テスト自動化の闇と向き合う」
Osamu Shimoda
 
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を使ってスクリーンショットを撮るまでに出会った闇の全て
Osamu Shimoda
 
第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
 
意識低くMeteor紹介
意識低くMeteor紹介意識低くMeteor紹介
意識低くMeteor紹介
hashedrock
 
軽量フレームワークNancy
軽量フレームワークNancy軽量フレームワークNancy
軽量フレームワークNancy
Narami Kiyokura
 
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
Osamu Shimoda
 
Riot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディングRiot + generator で始める新しいデータバインディング
Riot + generator で始める新しいデータバインディング
Tsutomu Kawamura
 
Web Workerで○○する話
Web Workerで○○する話Web Workerで○○する話
Web Workerで○○する話
ushiboy
 
ライオンでも分かるVuejs
ライオンでも分かるVuejsライオンでも分かるVuejs
ライオンでも分かるVuejs
lion-man
 
Vue.js入門
Vue.js入門Vue.js入門
Vue.js入門
Takuya Sato
 
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれからYahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Yahoo!デベロッパーネットワーク
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り
Sotaro Kimura
 
サイボウズのフロントエンド開発 現在とこれからの挑戦
サイボウズのフロントエンド開発 現在とこれからの挑戦サイボウズのフロントエンド開発 現在とこれからの挑戦
サイボウズのフロントエンド開発 現在とこれからの挑戦
Teppei Sato
 

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構築の今とこれから
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り
 
サイボウズのフロントエンド開発 現在とこれからの挑戦
サイボウズのフロントエンド開発 現在とこれからの挑戦サイボウズのフロントエンド開発 現在とこれからの挑戦
サイボウズのフロントエンド開発 現在とこれからの挑戦
 

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が気になった方はですね、ぜひとも画面に出てる、どーしょもないキーワードとかでググっていただいて、少しでも興味をもって頂けたら幸いです。 ということで、以上になります。 ありがとうございました。