javascript - 添加实例化网格反应纤维threejs
问题描述
我正在制作一个需要生成非常大地图的项目。我需要用树木或岩石生成很多地面块,有点类似于我的世界(每个块都必须是可点击的)。但是我在优化方面遇到了问题。我尝试减少渲染距离,添加雾,并使用三个实例(我正在使用threejs Fiber库进行反应)。谁能帮我解释实例如何工作并告诉我如何将它们应用到我的项目中?这是以正常方式生成它的代码,无需实例化。
import React, { Suspense } from "react";
import { useEffect, useState } from "react";
import Box from "./Box";
export default function Ground({
layout,
selectBox,
selectedBox,
position,
}) {
const [boxArray, setBoxArray] = useState([]);
const size = 20;
let id = 0;
useEffect(() => {
const boxArrayCopy = [];
for (let i = -(size / 2); i < size / 2; i++) {
let hasTree = Math.random() > 0.99;
for (let j = -(size / 2); j < size / 2; j++) {
const layoutObject = layout.filter(
(layoutObject) => layoutObject.x === i && layoutObject.y === j
);
const box = (
<Box
key={id}
coords={{ x: j * 5, y: 0, z: i * 5 }}
color={layoutObject.length > 0 ? layoutObject[0].color : 0x61892f}
selectBox={selectBox}
selectedBox={selectedBox}
hasTree={hasTree}
hasStone={Math.random() < 0.2}
// just a random condition to add tree to box
/>
);
boxArrayCopy.push(box);
id++;
if (hasTree) hasTree = Math.random() > 0.5;
}
setBoxArray([...boxArrayCopy]);
}
console.log("GROUND DONE");
}, []);
return (
<group position={position ?? [0, 0, 0]}>
<Suspense fallback={null}>{boxArray}</Suspense>
</group>
);
}
解决方案
推荐阅读
- reactjs - 如何从请求中获取所有数据
- flutter - 如何在 github 操作中在 Flutter 中配置 dart sdk 版本
- powershell - 用于批量更改管理器字段的 AzureAD Powershell 脚本
- android - 无法使用 MediaStore 检索最新下载的视频
- firebase-storage - 是否可以还原 Firebase Cloud Storage 中的操作?
- prometheus - 限制抓取目标时标签的允许值数量
- php - 当回显到 PHP 时,MYSQL 在数据库中增加 2 小时的时间
- angular - Angular 11 库使用路径别名
- macos - XML::LibXML - 在新的 macOS BigSur 上安装模块时出现问题
- mysql - 如何在 Rails 中仅计算 GROUP BY 中的某些行