2016-05-21 4 views
1

websocketサーバを使用して互いに通信する2つのhtmlクライアントを作成しました。あるクライアントがThree.jsを使用してキャンバスに3Dモデルを描画し、WebGlであるキャンバスコンテキストをバイナリデータとしてwebsocketサーバと考えられる他のクライアントに送信します。gl.readPixelsを使用せずにwebglコンテキストをバイナリデータとして送信する別の方法

問題は、readPixels()メソッドが遅すぎることです。私はこの流れを可能な限り流動的にする必要があります。

function animate() { 

    requestAnimationFrame(animate); 

    render(); 

    var ctx = renderer.getContext();   

    var byteArray = new Uint8Array(1280 * 720 * 4); 

    ctx.readPixels(0,0,1280, 720, ctx.RGBA, ctx.UNSIGNED_BYTE, byteArray); 

    socket.send(byteArray.buffer); 

} 

レンダラはTHREE.WebGLRendererです。

提案がありますか?

編集:ここでは

は、その画像を得るための信頼できる方法私は3Dあなたは画像データをつかむためにcanvas.toDataURL("image/jpg");(またはpng)を使用して試みることができるlink

+0

readPixelsは何に比べて遅すぎますか?データ転送ははるかに遅くなければならないのですか? –

+0

context.getImageData()。dataを使用するのに比べて遅すぎますが、残念ながら2Dコンテキストでしか動作しません。 – Patricia

+0

いくつかの有用な情報https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#General_performance_tips – rafaelcastrocouto

答えて

0

を描画するための基礎として使用されるコードですさWebGLコンテキストからのデータ。パフォーマンスがreadPixelsとどのように比較されるかはわかりませんが、私はこれまでスクリーンショットに使用したことがありません。

+0

本当にこの方法は面白いですし、その種類は速いです。私は文字列ファイルとしてソケットを介してdataURLを送信し、他のクライアントキャンバスに描画しようとします。 – Patricia

+1

それは超高速で働いた!ありがとう!唯一のことは、dataURLを受け取っているキャンバスがちらついていることです。私は 'renderer.render(scene、camera);'の下に 'canvas.toDataURL(" image/jpg ");メソッドを置いていますが、このちらつきを止める方法はありますか? – Patricia

関連する問題