Unity3d работает на Mono, и у него есть интересные преимущества и особенности относительно .Net. Как пример это библиотека Mono.Simd.
Суть в том, что у процессора есть разные наборы команд, а точнее у сопроцессора, но об этом очень легко гуглить по словам SSE или SIMD. Эти наборы, в зависимости от версии, позволяют получать очень хорошие увеличения производительности при объемных мат. вычислениям векторов\простых чисел.
Из обычного .Net доступ к такому не получить, а вот Mono расщедрился и теперь можно пофинтить.
Всё, что нужно это добавить библиотеку в проект, берем ее здесь %ProgramFiles%\Unity\Data\Mono\lib\mono\2.0\Mono.Simd.dll
(вообще библиотека есть в окружении Mono, и если Вы пишите свою библиотеку с ссылками на Mono.Simd, она будет отлично работать, просто Unity генерит C# проект без ссылок на онную, и обойти это можно скопировав ее тупо в проект)
теперь можно поглазеть на это в живую, по-умолчанию в Mono.Simd есть готовые структуры векторов, пример с одним из них ниже, но с помощью специальных аттрибутов, можно ускорить много чего, но об этом потом. Пока можете попробовать это и погуглить в целях саморазвития. На моем железе прирост х10 раз
Синтаксис:
Используется csharp
using System.Diagnostics;
using Mono.Simd;
using UnityEngine;
public class SIMDTest : MonoBehaviour
{
public void Awake()
{
const int count = 10000000;
var simdVector = new Vector4f(1, 2, 3, 4);
var simdResult = simdVector;
var sw = Stopwatch.StartNew();
for (var i = 0; i < count; i++)
{
simdResult += simdVector;
}
sw.Stop();
UnityEngine.Debug.Log(string.Format("SIMD result: {0}", sw.Elapsed));
sw = Stopwatch.StartNew();
var usualVector = new Vector4(1, 2, 3, 4);
var usualResult = usualVector;
for (var i = 0; i < count; i++)
{
usualResult += usualVector;
}
sw.Stop();
UnityEngine.Debug.Log(string.Format("Usual result: {0}", sw.Elapsed));
}
}
using Mono.Simd;
using UnityEngine;
public class SIMDTest : MonoBehaviour
{
public void Awake()
{
const int count = 10000000;
var simdVector = new Vector4f(1, 2, 3, 4);
var simdResult = simdVector;
var sw = Stopwatch.StartNew();
for (var i = 0; i < count; i++)
{
simdResult += simdVector;
}
sw.Stop();
UnityEngine.Debug.Log(string.Format("SIMD result: {0}", sw.Elapsed));
sw = Stopwatch.StartNew();
var usualVector = new Vector4(1, 2, 3, 4);
var usualResult = usualVector;
for (var i = 0; i < count; i++)
{
usualResult += usualVector;
}
sw.Stop();
UnityEngine.Debug.Log(string.Format("Usual result: {0}", sw.Elapsed));
}
}