コードは芸術になり得ます。巧妙な構文、エレガントなデータ構造、洗練されたインタラクションのいずれであっても、プログラマーだけが認識できる美しさがあります。それはそれで問題ありません。
しかし、コードは視覚的に素晴らしいもの、誰もが認めるものを作成することもできます。ここで、Three.js のようなツールが威力を発揮します。ただし、Three.js は、特にさまざまな計算能力を持つデバイスからアクセスされる動的な Web ページで使用する場合、重くなる可能性があります。
あなたが私と同じように、サイトに複数の Three.js シーンを追加する場合 (didof.dev で行うように)、最適化が必要になります。ここでは、パフォーマンスを維持するための 3 つの実践的なテクニックを紹介します。
元々は私のブログに投稿されました。
必要な場合にのみシーンをロードする
シーンが表示されていない場合は、シーンをロードしないでください。これは、重いグラフィック コンポーネントに当てはまります。これに最適なツールは IntersectionObserver で、要素がビューポートに入ったことを検出します。 SvelteKit でそれを処理する方法は次のとおりです:
<script lang="ts"> import { browser } from '$app/environment'; import { onMount } from 'svelte'; let ref: HTMLDivElement; let download = $state(false); if (browser) onMount(() => { const observer = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { download = true; // we need this once only observer.disconnect(); } }); // ref has been bound by Svelte since we are in onMount observer.observe(ref); return () => observer.disconnect(); }); </script> <div bind:this="{ref}"> {#if download} <!-- let SvelteKit handle the code splitting --> {#await import('./three-scene.svelte')} Loading {:then module} <module.default></module.default> {:catch error} <div>{error}</div> {/await} {/if} </div>
視界外のシーンを一時停止する
シーンが表示されない場合は、レンダリングを停止します。ほとんどのチュートリアルは 1 つの全画面シーンに焦点を当てていますが、複数のシーンがあるサイトの場合は、非表示のシーンを一時停止するとリソースが節約されます。
これは、IntersectionObserver を使用してシーンのアニメーション ループを制御するスニペットです:
function tick() { const elapsedTime = clock.getElapsedTime(); // Update your scene (e.g. set uniforms, move/rotate geometries...) renderer.render(scene, camera); } // Start the rendering renderer.setAnimationLoop(tick);
またしても、私たちの友人である IntersectionObserver が私たちを助けてくれます。
let clock: THREE.Clock; let renderer: THREE.WebGLRenderer; if (browser) onMount(() => { const observer = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { clock.start(); renderer.setAnimationLoop(tick); // resume } else { clock.stop(); renderer.setAnimationLoop(null); // pause } }); observer.observe(canvas); // Scene setup... return () => { observer.disconnect(); // Other cleanup... }; });
ビューポート サイズに合わせてシェーダー ワークロードを調整する
画面が小さいデバイスは、多くの場合、性能が低くなります。シェーダーの計算ワークロードをそれに応じて調整します。たとえば、ビューポートの幅に基づいて、フラクタル シェーダで使用されるオクターブ数を減らします。
ブラウザから...
<script lang="ts"> import ThreeScene from "./three-scene.svelte"; import { browser } from '$app/environment'; const octaves = browser ? (window.innerWidth <= 680 ? 2 : 4) : 1 </script> <threescene></threescene>
...three.js を通じて...
const material = new THREE.ShaderMaterial({ vertexShader, fragmentShader, uniforms: { uOctaves: new Three.Uniform(octaves) // coming as $prop } });
...最後にシェーダー内です。
uniform float uOctaves; for(float i = 0.0; iこのアプローチは、パフォーマンスとビジュアル品質のバランスを動的にとります。
ブラウザにクリーンアップを任せる
ここが難しいところです。 Three.js はメモリを自動的にクリーンアップしません。ジオメトリ、テクスチャ、マテリアルなどのオブジェクトを手動で追跡して破棄する必要があります。これをスキップすると、移動したり戻ったりするたびにメモリ使用量が増加し、最終的にはブラウザがクラッシュします。
私のホームページで観察したことを共有させてください:
初期メモリ使用量: 22.4MB
別のページへのソフト ナビゲーション後: 28.6MB (そのページは静的 HTML であっても)。
前後のナビゲーションを繰り返した後: ブラウザがクラッシュするまでメモリ使用量が増加し続けました。
なぜですか? Three.js オブジェクトが適切に破棄されていなかったためです。そして、広範な調査にもかかわらず、最新のフレームワークでメモリを完全にクリーンアップする信頼できる方法を見つけることができませんでした。
これが私が見つけた最も簡単な解決策です: Three.js シーンのあるページを離れるときにハードリロードを強制します。ハードリロードにより、ブラウザは次のことが可能になります。
- 新しいページコンテキストを作成します。
- 古いページでガベージ コレクションを実行します (クリーンアップはブラウザーに任せます)。
SvelteKit では、data-sveltekit-reload を使用するとこれが簡単です。シーンのあるページに対して有効にするだけです:
ホームページのserver.page.ts
<script lang="ts"> import { browser } from '$app/environment'; import { onMount } from 'svelte'; let ref: HTMLDivElement; let download = $state(false); if (browser) onMount(() => { const observer = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { download = true; // we need this once only observer.disconnect(); } }); // ref has been bound by Svelte since we are in onMount observer.observe(ref); return () => observer.disconnect(); }); </script> <div bind:this="{ref}"> {#if download} <!-- let SvelteKit handle the code splitting --> {#await import('./three-scene.svelte')} Loading {:then module} <module.default></module.default> {:catch error} <div>{error}</div> {/await} {/if} </div>ナビゲーション リンクの場合、この値を動的に渡します:
function tick() { const elapsedTime = clock.getElapsedTime(); // Update your scene (e.g. set uniforms, move/rotate geometries...) renderer.render(scene, camera); } // Start the rendering renderer.setAnimationLoop(tick);一般的な を使用する場合は、コンポーネントの場合、これを実装する必要があるのは 1 回だけです。
このアプローチは完璧ではありません。特定のページに対するスムーズなクライアント側ルーティングが無効になります。しかし、メモリを抑制し、クラッシュを防ぎます。私にとって、そのトレードオフにはそれだけの価値があります。
最終的な考え
これらの最適化は私にとってはうまくいきましたが、疑問は残ります。最新のフレームワークで Three.js オブジェクトを適切にクリーンアップするにはどうすればよいでしょうか?信頼できる解決策を見つけた場合は、ぜひご連絡ください!
以上がThree.js の最適化: テクニックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

SublimeText3 中国語版
中国語版、とても使いやすい

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール
