javascript - 我可以改进threejs以使一大组盒子在没有凸耳的情况下渲染得更快吗?
问题描述
我来这里是因为我在使用threejs 时遇到了麻烦。我试图用这段代码生成一个无限平坦的地形,发布在http://cubecraft.surge.sh/:
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/93/three.js"></script>
<script>
setTimeout(()=>{
k=[]
xa=0
ya=0
onkeydown=onkeyup=(e)=>{k[e.keyCode]=e.type=="keydown"}
document.body.requestPointerLock=document.body.requestPointerLock||document.body.mozRequestPointerLock
document.title="Islandcraft."
document.body.style.margin=0
scene=new THREE.Scene()
camera=new THREE.PerspectiveCamera(75,innerWidth/innerHeight,0.1,10000)
renderer=new THREE.WebGLRenderer()
document.body.appendChild(renderer.domElement)
g=(x,y,z)=>{
cube=new THREE.Mesh(new THREE.BoxGeometry(1,1,1),new THREE.MeshLambertMaterial({color:"rgb(100,50,0)"}))
scene.add(cube)
cube.position.set(x,y,z)
}
size=prompt("Enter the extension.")
height=prompt("Enter the height.")
for(x=-size;x<size;x++){
for(y=-height;y<height;y++){
for(z=-size;z<size;z++){
if(Math.random()<1/2){
g(x,y,z)
}
}
}
}
scene.background=new THREE.Color("rgb(200,200,200)")
scene.fog=new THREE.Fog("rgb(200,200,200)",0.01,10)
light=new THREE.PointLight("rgb(255,255,255)",1,10)
scene.add(light)
onmousedown=()=>{
if(document.pointerLockElement===document.body||
document.mozPointerLockElement===document.body){
}else{
document.body.requestPointerLock()
}
}
onmousemove=(event)=>{
if(document.pointerLockElement===document.body||
document.mozPointerLockElement===document.body){
xa-=0.01*event.movementX
if(-1.5<ya&&0<event.movementY){
ya-=0.01*event.movementY
}
if(ya<1.5&&event.movementY<0){
ya-=0.01*event.movementY
}
}
}
render=()=>{
renderer.setSize(innerWidth,innerHeight)
camera.aspect=innerWidth/innerHeight
camera.updateProjectionMatrix()
requestAnimationFrame(render)
renderer.render(scene,camera)
}
render()
setInterval(()=>{
light.position.x=camera.position.x
light.position.y=camera.position.y
light.position.z=camera.position.z
camera.lookAt(
camera.position.x+Math.sin(xa)*Math.cos(ya),
camera.position.y+Math.sin(ya),
camera.position.z+Math.cos(xa)*Math.cos(ya)
)
if(k[65]){
camera.position.x+=0.01*Math.cos(xa)
camera.position.z-=0.01*Math.sin(xa)
}
if(k[87]){
camera.position.x+=0.01*Math.sin(xa)
camera.position.z+=0.01*Math.cos(xa)
}
if(k[68]){
camera.position.x-=0.01*Math.cos(xa)
camera.position.z+=0.01*Math.sin(xa)
}
if(k[83]){
camera.position.x-=0.01*Math.sin(xa)
camera.position.z-=0.01*Math.cos(xa)
}
if(k[32]){
camera.position.y+=0.01
}
if(k[88]){
camera.position.y-=0.01
}
},1)
},1)
</script>
该代码确实生成了一个平坦的随机裂缝地形,具有可选的扩展和可选的地形高度。最糟糕的问题是,当扩展或可选高度超过8时,代码非常滞后和缓慢。我该如何解决呢?
解决方案
推荐阅读
- bash - 如何使用 bash 脚本使用密码自动 ssh 进入服务器和 su?
- php - 如何使用php重定向页面
- html - 如何在 Angular 中控制单个 HTML 项?
- git - git:获取另一个分支失败
- json - 将 json 响应转换为字符串并将其放入结构中
- html - 如何使文本适合所有 div 的宽度?
- ios - 尝试在 UIImageView 中的图像之间淡入淡出时出现白屏
- node.js - Swagger - 无法读取未定义的属性“获取”
- ios - 架构 x86_64 的未定义符号 - 我可以在设备上构建和运行,但不适用于模拟器
- java - 如何在 Node.js 中为 Vision Api 传递 Google 凭据?