我不知道這個問題是統一專用的,所以也許其他C#開發人員可以幫我太:)多線程如果我開始超過1其他線程
所以我實際上是試圖實現不起作用我自己的A *算法和版本,以提高性能我想實際路徑尋找每一個求職者是多線程:
就像你可以看到它在15次迭代後停止(根據我調用多少個文本輸出 - >我猜測線程在一段時間後被殺死),並且第一次啓動的線程會被以下。
我使用C#ThreadPool
類爲我的線程管理,但我也嘗試使用Thread
類。這是相同的結果。
實現我的穿線:
public static void RequestPath(PathRequest _request)
{
Debug.Log("Queueing PathRequest...");
ThreadPool.QueueUserWorkItem(instance.StartThreadedPathfinding, _request);
}
調用的方法:
private void StartThreadedPathfinding(object _stateInfo)
{
PathRequest request = (PathRequest)_stateInfo;
m_pathfinder.FindPath(request, OnPathFound);
}
而且FindPath
:
public void FindPath(PathRequest _request, Action<PathResult> _callback)
{
Debug.Log("Starting A* Algorithm");
BinaryHeap<Node> openList = new BinaryHeap<Node>(GridSize);
HashSet<Node> closedList = new HashSet<Node>();
Node startNode = _request.Start;
Node targetNode = _request.Target;
bool success = false;
openList.Add(startNode);
while (openList.Count > 0)
{
Debug.Log(Thread.CurrentThread.ManagedThreadId + ": " + Thread.CurrentThread.ThreadState.ToString());
Node currentNode = openList.RemoveFirst();
if (currentNode == targetNode)
{
// TODO: Path found -> _callback
success = true;
Debug.Log("Path found");
_callback(new PathResult(null, success, _request.Callback));
return;
}
closedList.Add(currentNode);
foreach (Node neighbour in currentNode.m_neighbours)
{
if (closedList.Contains(neighbour))
{
continue;
}
int tentativeG = currentNode.m_gCost + GetDistance(currentNode, neighbour);
if (openList.Contains(neighbour) && tentativeG > neighbour.m_gCost)
{
continue;
}
neighbour.m_parent = currentNode;
neighbour.m_gCost = tentativeG;
neighbour.m_hCost = GetDistance(neighbour, targetNode);
if (openList.Contains(neighbour))
{
openList.UpdateItem(neighbour);
}
else
{
openList.Add(neighbour);
}
}
}
// TODO: No path to the target exists -> calculate some path
success = false;
Debug.Log("No existing path");
_callback(new PathResult(null, success, _request.Callback));
return;
}
RequestPath
和StartThreadedPathfinding
是在一個名爲PathRequestManager
類FindPath
是一個其他班級稱爲Pathfinder
。
另一點是,線程不僅僅因爲這樣的錯誤而停止,但仍然以某種方式運行我認爲,因爲在Unity中啓動場景後,我必須殺死taskmanager中的Unity進程,因爲某事被卡住了(當我必須這樣做時,CPU負載總是80%左右) 想到了死鎖但找不到任何東西。
我會很高興,如果有人可以幫助我在這裏,如果你需要對源代碼的更多信息,請隨時問:)
一般來說,你不想爲這種類型的東西大掃蕩線程。更好地使用主線程中的一系列幀的漸進延遲計算 – MickyD
以及如何做到這一點? – Rafiwui
嘗試查找'StartCoroutine'。而且由於Unity的默認協同程序吸引了社區,所以開發了一個非常棒的資源:更有效的協程(免費)等等。 – BrokenBacon