【发布时间】:2020-09-23 20:08:41
【问题描述】:
我想在一个线程上生成网格图块数据并将其存储在某种数组或列表中,这些数组或列表以可预测的方式排序。需要稍后访问它们以进行放置。 在下面的脚本中,我想在线程池上执行“void CreatingTile”,然后将其分配给列表或数组中的某个索引。
但是如果我能看到一个简单的例子,它将线程池上的值添加到线程安全数组或列表中,那么我可能会自己解决它。我是 C# 新手,我想学习如何使用线程。已经阅读了threadpool docs,但斐波那契数是我不熟悉的东西,所以我有点难以理解。
编辑:所以我的问题是如何实现线程并将生成的网格数据存储在数组或列表中?
当前脚本(工作代码)
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using UnityEngine;
using System.Threading;
public class TerrainGenerator : MonoBehaviour
{
public int xVertices = 20;
public int zVertices = 20;
void Start()
{
TileData tileData = new TileData(xVertices, zVertices);
Vector3 positionV3 = new Vector3(0, 0, 0);
GameObject terrain;
terrain = new GameObject("Empty");
MeshRenderer meshRenderer = terrain.AddComponent<MeshRenderer>();
meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));
MeshFilter meshFilter = terrain.AddComponent<MeshFilter>();
CreatingTile(tileData);
terrain.transform.position = positionV3;
meshFilter.mesh = tileData.CreateMesh();
}
void CreatingTile(TileData tileData)
{
for (int i = 0, z = 0; z <= zVertices; z++)
{
for (int x = 0; x <= xVertices; x++)
{
float y = Mathf.PerlinNoise(x * .3f, z * .3f) * 2f;
tileData.vertices[i] = new Vector3(x, y, z);
i++;
}
}
int vert = 0;
int tris = 0;
for (int z = 0; z < zVertices; z++)
{
for (int x = 0; x < xVertices; x++)
{
tileData.triangles[tris + 0] = vert + 0;
tileData.triangles[tris + 1] = vert + xVertices + 1;
tileData.triangles[tris + 2] = vert + 1;
tileData.triangles[tris + 3] = vert + 1;
tileData.triangles[tris + 4] = vert + xVertices + 1;
tileData.triangles[tris + 5] = vert + xVertices + 2;
vert++;
tris = tris + 6;
}
vert++;
}
for (int i = 0, z = 0; z <= zVertices; z++)
{
for (int x = 0; x <= xVertices; x++)
{
tileData.uvs[i] = new Vector2((float)x / xVertices, (float)z / zVertices);
i++;
}
}
}
public class TileData
{
public Vector3[] vertices;
public int[] triangles;
public Vector2[] uvs;
public TileData(int xVertices, int zVertices)
{
vertices = new Vector3[(xVertices + 1) * (zVertices + 1)];
uvs = new Vector2[vertices.Length];
triangles = new int[xVertices * zVertices * 6];
}
public Mesh CreateMesh()
{
Mesh mesh = new Mesh();
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.uv = uvs;
mesh.RecalculateNormals();
return mesh;
}
}
}
感谢您在此问题上的任何帮助。
【问题讨论】:
-
有什么帮助?你还没有问我们一个问题。你能澄清一下你在问我们什么吗?
-
另外,斐波那契数列就是
f(n) = f(n-1) + f(n - 2) where f(1) = 1 and f(0) = 0。听起来线程代码更成问题? -
@Enigmativity 可能没有正确表述我的问题。但我想通过线程池运行方法“void CreatingTile”,然后将结果存储在数组或列表中。我想我发现了一个类似的问题,但它在 Java 中,它有点难以理解link 而且它更多的是一个线程问题,我不太熟悉与线程语法相关的方法。但我理解线程的概念。
-
你试过
Parallel.For吗? -
我现在已经解决了这个问题,但是我想让它更具可扩展性,这样当我创建更多图块时它不会冻结,在创建物理时会出现 3601 毫秒的峰值。我回家后会发布我的解决方案,以便人们看到基本版本
标签: c# multithreading unity3d threadpool