如何在 Unity 中优化物理?通过ProfilerUnity,我查看了哪些物理负载最多,而我只有水作为物理对象。我有一个带有随perlinNoise每一帧变化的动态网格的板和一个随这块变化的动态网格对撞机:
Mesh myMesh = this.GetComponent<MeshFilter>().mesh;
DestroyImmediate(this.GetComponent<MeshCollider>());
gameObject.AddComponent<MeshCollider>();
GetComponent<MeshCollider>().sharedMesh = myMesh;
编辑:这是生成水的实际代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaterNoise : MonoBehaviour
{
public float power = 3;
public float scale = 1;
public float timeScale = 1;
float offsetX;
float offsetY;
MeshFilter mf;
private void Start()
{
mf = GetComponent<MeshFilter>();
GenNoise();
}
private void FixedUpdate()
{
GenNoise();
offsetX += Time.deltaTime * timeScale;
offsetY += Time.deltaTime * timeScale;
}
void GenNoise()
{
Vector3 myPos = transform.localPosition;
Vector3[] vertices = mf.mesh.vertices;
for(int i = 0; i < vertices.Length; i++)
{
vertices[i].y = CalculateHeight(vertices[i].x + myPos.x, vertices[i].z + myPos.z) * power;
}
Mesh myMesh = this.GetComponent<MeshFilter>().mesh;
DestroyImmediate(this.GetComponent<MeshCollider>());
gameObject.AddComponent<MeshCollider>();
GetComponent<MeshCollider>().sharedMesh = myMesh;
mf.mesh.vertices = vertices;
}
float CalculateHeight(float x, float y)
{
float xCoord = x * scale + offsetX;
float yCoord = y * scale + offsetY;
return Mathf.PerlinNoise(xCoord, yCoord);
}
}
该应用程序是单线程的。
重要的!
从来没有,不,不是那样的。切勿在运行时更改对撞机网格。物理引擎不像从外面看起来那样工作。为了使网格真正正确,最重要的是,为了快速计算碰撞,引擎会在组件初始化阶段执行一些相当昂贵的操作
MeshCollider。解决方案?不要做你想做的事。
每个框架如何销毁组件并在那里重新创建它们?
Mesh.vertices返回顶点数组的副本由于网格仅更改此脚本,您可以只缓存此数组 1 次而不调用每个物理帧
Mesh.vertices,GC 会感谢您: