加载屏幕

Starter pack

在3D体验中,常常会有复杂模型大纹理的情况。这可能导致较长的加载时间。为了避免出现空白屏幕和不好的第一印象,我们可以添加一个加载屏幕

我个人认为,如果可能的话,应该避免显示加载屏幕(除非这是一个设计选择)。首先应该考虑优化模型和纹理。

但有时你别无选择,即使是优化后的模型也可能保持较大或你有许多此类模型。在这种情况下,加载屏幕可以是一个好解决方案。

Suspense

Suspense 是一个 React 包装组件,允许你在等待数据加载渲染一个后备组件

在传统应用中,这些数据通常指的是数据获取代码分割。但在 React Three Fiber 中,我们可以使用它来等待模型纹理加载。

useLoader 钩子使用 promises 来加载模型纹理。因此,我们可以使用 Suspense 来等待它们解析

入门包中,我在 public/models/ 添加了4个模型,每个**+3MB**。(对于一个 web 应用来说,这已经很多,因为它们都包含相同的动画,可以/应该被优化)这将让我们了解 Suspense 的工作方式。

当我重新加载时,在模型加载之前,我们有一个长时间的空白屏幕。这不是一个好的用户体验,用户可能认为应用已损坏离开

如果你在本地工作或浏览器中缓存了模型,你可能看不到空白屏幕。

要强制重新加载资源,你可以在浏览器开发工具的网络选项卡中禁用缓存

你也可以使用节流选项减慢网络速度。

禁用缓存并节流网络

现在我们都应该看到空白屏幕了,让我们添加一个带有 fallback 属性的 Suspense 组件:

import { Canvas } from "@react-three/fiber";
import { Experience } from "./components/Experience";
import { Suspense } from "react";

const CubeLoader = () => {
  return (
    <mesh>
      <boxGeometry />
      <meshNormalMaterial />
    </mesh>
  );
};

function App() {
  return (
    <>
      <Canvas camera={{ position: [-4, 4, 12], fov: 30 }}>
        <Suspense fallback={<CubeLoader />}>
          <group position-y={-1}>
            <Experience />
          </group>
        </Suspense>
      </Canvas>
    </>
  );
}

export default App;

我们的 fallback 组件是一个简单的立方体,它不是最佳的加载屏幕,但足以理解 Suspense 的工作原理。

当我们重新加载时,我们可以看到,在模型加载期间显示了立方体。加载完成后,立方体被 Experience 组件替代。

预加载

你可能遇到的一个常见问题是你的资源不是立即需要的。例如,你有一个模型只有在用户点击按钮时才会被加载。因此它不会被 Suspense 考虑在内。

这可能导致在需要资源时重新显示 fallback 组件。为避免这种情况,我们可以使用不同 Drei loaders 中的 preload 函数。

Three.js logoReact logo

React Three Fiber: The Ultimate Guide to 3D Web Development

✨ You have reached the end of the preview ✨

Go to the next level with Three.js and React Three Fiber!

Get full access to this lesson and the complete course when you enroll:

  • 🔓 Full lesson videos with no limits
  • 💻 Access to the final source code
  • 🎓 Course progress tracking & completion
  • 💬 Invite to our private Discord community
Unlock the Full Course – Just $85

One-time payment. Lifetime updates included.