0
我正在使用字典来存储网格点,并且我不希望为每个网格点显示Handle,因为3个点共享相同的Vector3
位置,所以我正在存储指向字典,然后检查字典以查看该值是否存在,如果不添加句柄并将该点添加到字典中,则只需将该点添加到字典中,而不是创建额外的句柄。Dictionary ContainsValue()导致程序停止响应
当我运行此,编辑器停止响应,我必须做强制退出,并导致该问题的是我if
声明。如果我评论它是否正常工作。如果我只是添加所有句柄并且使用“否”,它也可以工作,但由于所有句柄,它运行缓慢。
网格有大约23k个顶点。我可以做些什么来优化这个?
public void OnSceneGUI(){
Creator t = (Creator)target;
Mesh mesh = t.GetComponent<MeshFilter>().sharedMesh;
if (mesh != null) {
Vector3[] vertices = mesh.vertices;
Vector3 lp = t.transform.position;
Handles.color = Color.red;
Dictionary<int, Vector3> dict = new Dictionary<int, Vector3>();
int i = 0;
foreach (Vector3 v in vertices) {
Vector3 p = lp - v;
Vector3 pos = new Vector3 (p.x, -p.z, p.y);
if(dict.ContainsValue(pos)){
Handles.FreeMoveHandle(pos, Quaternion.identity, 0.001f, Vector3.zero, Handles.DotCap);
}
dict.Add (i, pos);
i++;
}
}
}
它现在不再挂起,但它不放置所有的顶点 –
我想这是由于浮点精度问题(你不应该比较浮点值严格相等)。你可以检查吗?如果这是由于这个原因,你可以尝试''添加'略微圆形的坐标向量''处理'集合,这可能* *给预期的结果,但也可能导致一些点丢失。在这种情况下,真正的解决方案是使用类似八叉树而不是简单的'HashSet'。 –