Выполнение векторного назначения после функции - PullRequest
0 голосов
/ 10 мая 2011

Я использую этот код:

MainLoop() {
    for (int i = 0; i < length; i++) {
        XMVector3Rotate(rays[i], orientation);
    }
}

и у меня есть fps 1900000, но когда я использую этот:

MainLoop() {
    for (int i = 0; i < length; i++) {
        calculatedRays[i] = XMVector3Rotate(rays[i], orientation);
    }
}

У меня есть fps = 200. Почему?

Ответы [ 3 ]

7 голосов
/ 10 мая 2011

Когда вы делаете это:

XMVector3Rotate(rays[i], orientation);

Я догадываюсь , что компилятор включает функцию - и видит это, потому что его результат никогда нигде не назначается - он на самом деле ничего не делает и удаляет вызов функции полностью. Это очень быстро, потому что на самом деле ничего не делает.

Но потом, когда вы добавите в задание:

calculatedRays[i] = XMVector3Rotate(rays[i], orientation);

Внезапно вы выполняете кучу операций чтения и записи в память и выполняете различные математические операции - все из которых ранее пропускались.

(Вы пометили этот XNA - но это функция C ++. Большинство компиляторов C ++ могут и будут выполнять встроенные функции, подобные этой. Стандартный компилятор C # не может.)

2 голосов
/ 10 мая 2011

В первом примере результат функции сразу отбрасывается (не присваивается).Компилятор достаточно умен, чтобы это почувствовать, и пропускает вызов метода ...

0 голосов
/ 10 мая 2011

Если предположить, что XMVector3Rotate возвращает тип XNA Vector3, это будет операция структурного копирования, относительно дорогая по производительности.

При оптимизации своей собственной игры XNA для XBox360 я заменил многие такие операции на ref paramsтипа, с очень заметным усилением в тяжелых циклах.

РЕДАКТИРОВАТЬ: пример (из памяти)

Vector3 vec1 = something, vec2 = something, result;
Vector3.Add(ref vec1, ref vec2, out result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...