Unity падает при использовании алгоритма Дейкстры с разными начальными точками - PullRequest
1 голос
/ 30 октября 2019

Я впервые задаю вопрос здесь, поэтому, пожалуйста, прости меня, если я сделаю какие-либо ошибки.

В настоящее время я использую Unity 2019.1.14f1 на Windows 10 Enterprise с Intel Xeon E5-1650 v4с 32,0 ГБ ОЗУ, GeForce GTX 1080 с последними драйверами.

Чтобы дать небольшой контекст этой проблеме, я настроил сцену единства, в которой есть набор объектов с NavLinkProxy класс и NavNodeProxy класс, который хранит некоторые данные. Они используются для генерации маршрутов, в частности, с использованием алгоритма Дейкстры. Ниже приведен код, который я использовал:

private static void DijkstraSearch(VenueManager venueManager, NavNodeProxy start, NavNodeProxy end)
{
    // Priority queue
    var pQueue = new BinaryHeap<NavNodeProxy>();

    // Set cost of start node to 0
    start._NavNodeInfo.MinCostToStart = 0;

    // Add start node to priority queue
    pQueue.Add(start);

    do
    {
        // Remove node on top of heap and set it as node value
        var node = pQueue.Remove();

        List<NavLinkProxy> nodeLinks = venueManager._ActiveNavLinks.FindAll(result => (result._NavLinkInfo.n1 == node) || (result._NavLinkInfo.n2 == node));

        for (int i = 0; i < nodeLinks.Count; i++)
        {
            NavNodeProxy connectingNode;

            if (nodeLinks[i]._NavLinkInfo.n1._NavNodeInfo.id == node._NavNodeInfo.id)
                connectingNode = nodeLinks[i]._NavLinkInfo.n2;
            else
                connectingNode = nodeLinks[i]._NavLinkInfo.n1;

            if (connectingNode._NavNodeInfo.Visited)
                continue;

            if (connectingNode._NavNodeInfo.MinCostToStart == Mathf.Infinity || node._NavNodeInfo.MinCostToStart + nodeLinks[i]._NavLinkInfo.horizontalLength < connectingNode._NavNodeInfo.MinCostToStart)
            {
                connectingNode._NavNodeInfo.MinCostToStart = node._NavNodeInfo.MinCostToStart + nodeLinks[i]._NavLinkInfo.horizontalLength;
                connectingNode._NavNodeInfo.NearestToStart = node;
                if (!pQueue.heapList.Contains(connectingNode))
                    pQueue.Add(connectingNode);
            }
        }
        node._NavNodeInfo.Visited = true;

        if (node == end)
            return;
    } while (pQueue.heapList.Any());
}

Сначала маршрут генерируется нормально, и он отлично работает, если я также изменю положение end .

Однако, когда я меняю положение start и пытаюсь сгенерировать маршрут, Unity зависает, обычно оставаясь полностью не отвечающим и вынуждая меня принудительно закрыть его.

Я пыталсяпоменяйте местами объекты начального и конечного узлов в сцене и повторите описанные выше шаги, чтобы получить точно такие же результаты. Помимо этого, я не очень уверен, что может произойти, чтобы дать мне этот результат.

Редактировать: Отредактировал сообщение с правильным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...