在上面的短片中,您将看到Unity中的设置相当少。有一个计数器,每一帧(在更新中)递增,沿着这个调用' UnityEditor.SceneView.RepaintAll()'。您可以看到一个计数器,用于输出到控制台框。
一旦我进入游戏视图并单击左下角的按钮(按下突出显示的按钮),它就会调用一个脚本,该脚本在运行时将网格导入到场景中并渲染它。您会注意到计数器和重新绘制的呼叫在此期间冻结,虽然很短暂,但非常明显的一段时间。实际上,场景中的所有内容都会在此加载时间内冻结。
我一直在谷歌上搜索如何刷新Unity的场景,这样我就可以在运行时加载网格,同时保持对玩家的响应能力。到目前为止,没有。
这里定期刷新/更新场景的最佳做法是什么,这样玩家就不会受到加载时间游戏停止的影响?
编辑:RepaintAll()调用对我不起作用。应该先添加。这种方法不能像我希望的那样工作,事实上我不确定它的目的是什么,如果不刷新场景
网格导入代码:
const int MAX_FACETS_PER_MESH = 65535 / 3;
class Facet
{
public Vector3 normal;
public Vector3 a, b, c;
public override string ToString()
{
return string.Format("{0:F2}: {1:F2}, {2:F2}, {3:F2}", normal, a, b, c);
}
}
private static Mesh[] ImportBinary(string path)
{
Facet[] facets;
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
using (BinaryReader br = new BinaryReader(fs, new ASCIIEncoding()))
{
// read header
byte[] header = br.ReadBytes(80);
uint facetCount = br.ReadUInt32();
facets = new Facet[facetCount];
for(uint i = 0; i < facetCount; i++)
{
facets[i] = new Facet();
facets[i].normal.x = br.ReadSingle();
facets[i].normal.y = br.ReadSingle();
facets[i].normal.z = br.ReadSingle();
facets[i].a.x = br.ReadSingle();
facets[i].a.y = br.ReadSingle();
facets[i].a.z = br.ReadSingle();
facets[i].b.x = br.ReadSingle();
facets[i].b.y = br.ReadSingle();
facets[i].b.z = br.ReadSingle();
facets[i].c.x = br.ReadSingle();
facets[i].c.y = br.ReadSingle();
facets[i].c.z = br.ReadSingle();
// padding
br.ReadUInt16();
}
}
}
return CreateMeshWithFacets(facets);
}
private static Mesh[] CreateMeshWithFacets(IList<Facet> facets)
{
int fl = facets.Count, f = 0, mvc = MAX_FACETS_PER_MESH * 3;
Mesh[] meshes = new Mesh[fl / MAX_FACETS_PER_MESH + 1];
for(int i = 0; i < meshes.Length; i++)
{
int len = System.Math.Min(mvc, (fl - f) * 3);
Vector3[] v = new Vector3[len];
Vector3[] n = new Vector3[len];
int[] t = new int[len];
for(int it = 0; it < len; it += 3)
{
v[it ] = facets[f].a;
v[it+1] = facets[f].b;
v[it+2] = facets[f].c;
n[it ] = facets[f].normal;
n[it+1] = facets[f].normal;
n[it+2] = facets[f].normal;
t[it ] = it;
t[it+1] = it+1;
t[it+2] = it+2;
f++;
}
meshes[i] = new Mesh();
meshes[i].vertices = v;
meshes[i].normals = n;
meshes[i].triangles = t;
}
return meshes;
}
答案 0 :(得分:4)
您正在尝试同步执行文件IO,这会锁定正在运行的任何线程。在这种情况下,主线程。
您可以在剪辑的所有三个区域中看到此锁定的效果:
这是因为 Update()
根本没有运行。
为了解决此问题,您需要异步加载文件。