Eine Bibliothek, mit der ein Einheitskripte in nativem Code geschrieben werden kann: C, C ++, Assembly.
Dieses Projekt zielt darauf ab, Ihnen eine praktikable Alternative zu C#zu geben. Scripting in C ++ ist für alle Teile jedes Projekts nicht richtig, aber jetzt ist es eine Option.
Wenn Sie eine Zeile von C# Code ändern, müssen Sie einen neuen Aufbau des Spiels erstellen. Typische Android -Build -Zeiten betragen in der Regel mindestens 10 Minuten, da IL2CPP laufen muss und dann eine riesige Menge C ++ zusammengestellt werden muss.
Mit C ++ können wir das Spiel als C ++ - Plugin in etwa 1 Sekunde kompilieren, das Plugin in die APK tauschen und dann das Spiel sofort installieren und ausführen. Das ist ein großer Produktivitätsschub!
C ++ kompiliert viel schneller als C#. Inkrementelle Builds, wenn sich nur eine Datei ändert- die häufigsten Builds- können 15x schneller sein als bei C#. Eine schnellere Zusammenstellung summiert sich im Laufe der Zeit zu Produktivitätsgewinnen. Schnellere Iterationszeiten erleichtern es einfacher, im "Fluss" der Programmierung zu bleiben.
Der Müllsammler von Unity ist obligatorisch und hat viele Probleme. Es ist langsam, läuft auf dem Hauptfaden, sammelt alle Müll auf einmal, fragmente den Haufen und schrumpft niemals den Haufen. Ihr Spiel wird also "Frame -Hitchen" erleben und schließlich geht es Ihnen aus dem Gedächtnis und zum Absturz.
Es ist erheblich erforderlich, um den GC umzuarbeiten, und der resultierende Code ist schwer zu warten und zu langsam. Dies schließt Techniken wie Objektpools ein, die im Wesentlichen Speichermanagementhandbuch erstellen. Sie müssen auch Box -Wert -Typen wie int zu verwaltete Typen wie object vermeiden, in einigen Situationen und in verschiedenen anderen GOTCHAS nicht für Schleifen foreach Schleifen verwenden.
C ++ verfügt über keinen erforderlichen Müllsammler und verfügt über eine optionale automatische Speicherverwaltung über "Smart -Zeiger" -Typen wie Shared_ptr. Es bietet hervorragende Alternativen zum primitiven Müllsammler von Unity.
Während die Verwendung einiger .NET -APIs weiterhin die Müllerstellung beinhaltet, ist das Problem nur für diese APIs enthalten, anstatt ein allgegenwärtiges Problem für Ihren gesamten Code zu sein.
Wenn Sie C ++ direkt verwenden, erhalten Sie die vollständige Kontrolle über den Code, den die CPU ausführt. Es ist viel einfacher, einen optimalen Code mit einem C ++ - Compiler zu generieren als mit einem C# Compiler, IL2CPP und schließlich einem C ++ - Compiler. Schneiden Sie den Middle-Man aus und Sie können den Compiler-Intrinsic oder Assembly nutzen, um den Maschinencode mit leistungsstarken CPU-Funktionen wie SIMD und Hardware AES-Verschlüsselung für massive Leistungsgewinne direkt zu schreiben.
C ++ ist eine viel größere Sprache als C# und einige Entwickler bevorzugen mehr Tools zur Verfügung. Hier sind einige Unterschiede:
Während IL2CPP C# bereits in C ++ verwandelt, erzeugt es viel Overhead. Es gibt viele Überraschungen, wenn Sie das generierte C ++ durchlesen. Beispielsweise gibt es für jede Funktion eine statische Variable und zwei zusätzliche Zeiger werden zu Beginn jeder Klasse gespeichert. The same goes for all sorts of features such as sizeof() , mandatory null checks, and so forth. Stattdessen können Sie C ++ direkt schreiben und müssen nicht mit IL2CPP arbeiten.
C ++ ist die Standardsprache für Videospiele sowie viele andere Felder. Durch Programmieren in C ++ können Sie Ihre Fähigkeiten und Ihren Code einfacher an und von Nicht-Unity-Projekten übertragen. Sie können beispielsweise das Sperren vermeiden, indem Sie dieselbe Sprache (C ++) verwenden, die Sie in den unwirklichen oder Holzhartenmotoren verwenden würden.
GameObject go;
Transform transform = go.GetTransform();
Vector3 position(1.0f, 2.0f, 3.0f);
transform.SetPosition(position);
MonoBehaviour -Nachrichten in C ++ um void MyScript::Start()
{
String message("MyScript has started");
Debug::Log(message);
}
#if TARGET_OS_ANDROID )Der Kern dieses Projekts ist ein Codegenerator. Es generiert C #- und C ++ - Code mit dem Namen "Bindungen", die C# -APIs für C ++ - Spielcode zur Verfügung stellen. Es unterstützt eine Vielzahl von Sprachmerkmalen:
classstructenumAction )decimalget and set wie obj.x )get and set wie obj[x] )add und remove )int zu object und Visa umgekehrt)out und ref -ParameterBeachten Sie, dass der Codegenerator noch nicht unterstützt:
Array , string und object (z. B. GetHashCode )params Parameter (auch bekannt als "var args") So konfigurieren Sie den Codegenerator, öffnen Sie Unity/Assets/NativeScriptTypes.json und beachten Sie die vorhandenen Beispiele. Fügen Sie dieser Datei hinzu, um mehr C# -APIs von Einheit, .NET oder benutzerdefinierten DLLs zu Ihrem C ++ - Code auszusetzen.
Um den Codegenerator auszuführen, wählen Sie NativeScript > Generate Bindings .
Fast alle Projekte werden einen Netto -Performance -Gewinn erzielen, indem die Müllsammlung reduziert, IL2CPP -Overhead und Zugang zu Compiler -Intrinsik und Montage beseitigt. Anrufe von C ++ in C# entstehen nur eine geringfügige Leistungsstrafe. In dem seltenen Fall, dass fast der gesamte Code auf .NET -APIs aufgerufen wird, können Sie einen Netto -Leistungsverlust erleben.
Testen und Benchmarks -Artikel
Optimierungen Artikel
Beim Scripting in C ++ wird C# nur als "Bindungs" -Schicht verwendet, sodass die Unity C ++ -Funktionen aufrufen kann und C ++ - Funktionen die Unity -API aufrufen können. Ein Codegenerator wird verwendet, um die meisten dieser Bindungen entsprechend den Anforderungen Ihres Projekts zu generieren.
Alle Ihren Code sowie einige Bindungen bestehen in einem einzelnen "nativen" C ++ - Plugin. Wenn Sie Ihren C ++ - Code ändern, erstellen Sie dieses Plugin und spielen dann das Spiel im Editor oder in einem bereitgestellten Build (z. B. an ein Android -Gerät). Es gibt keinen C# -Code, in dem Unity kompiliert wird, es sei denn, Sie führen den Codegenerator aus, was selten ist.
Der Standard -C -Workflow sieht so aus:
Mit C ++ sieht der Workflow so aus:
Unity/Assets in das Verzeichnis des Verzeichniss Ihres AssetsNativeScriptTypes.json und geben Sie an, welche Teile der Einheit-, .NET- und benutzerdefinierten DLL -APIs Sie von C ++ zugreifen möchten.Unity/Assets/CppSource/Game/Game.cpp und Unity/Assets/CppSource/Game/Game.h um Ihr Spiel zu erstellen. Es wird ein Beispielcode bereitgestellt, aber es kann gerne gelöscht werden. Sie können hier mit zunehmendem Spiel mehr C ++ - Source ( .cpp ) und Header ( .h ) -Dateien (.H) hinzufügen./Applications/Utilitiescd /path/to/your/build/directory auscmake -G MyGenerator -DCMAKE_TOOLCHAIN_FILE=/path/to/your/project/CppSource/iOS.cmake /path/to/your/project/CppSource . Ersetzen Sie MyGenerator durch den Generator Ihrer Wahl. Um die Optionen anzuzeigen, führen Sie cmake --help aus und sehen Sie sich die Liste unten an. Zu den gemeinsamen Entscheidungen gehören "Unix Makefiles", um aus Befehlszeile oder "Xcode" zu erstellen, um die IDE von Apple zu verwenden.make beispielsweise, wenn Sie Unix Makefiles als Generator oder öffnen NativeScript.xcodeproj gewählt haben, und klicken Sie auf Product > Build wenn Sie XCode gewählt haben. /Applications/Utilitiescd /path/to/your/build/directory auscmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource . Ersetzen Sie MyGenerator durch den Generator Ihrer Wahl. Um die Optionen anzuzeigen, führen Sie cmake --help aus und sehen Sie sich die Liste unten an. Zu den gemeinsamen Entscheidungen gehören "Unix Makefiles", um aus Befehlszeile oder "Xcode" zu erstellen, um die IDE von Apple zu verwenden. Entfernen -DEDITOR=TRUE für eigenständige Builds.make beispielsweise, wenn Sie Unix Makefiles als Generator oder öffnen NativeScript.xcodeproj gewählt haben, und klicken Sie auf Product > Build wenn Sie XCode gewählt haben. cd /path/to/your/build/directory auscmake -G "Visual Studio VERSION YEAR Win64" -DEDITOR=TRUE /path/to/your/project/CppSource . Ersetzen Sie VERSION und YEAR durch die Version von Visual Studio, die Sie verwenden möchten. Um die Optionen anzuzeigen, führen Sie cmake --help aus und sehen Sie sich die Liste unten an. Verwenden Sie beispielsweise "Visual Studio 15 2017 Win64" für Visual Studio 2017. Jede Version, einschließlich Community, funktioniert einwandfrei. Entfernen -DEDITOR=TRUE für eigenständige Builds. Wenn Sie Visual Studio 2019 verwenden, führen Sie stattdessen cmake -G "Visual Studio 16" -A "x64" -DEDITOR=TRUE /path/to/your/project/CppSource .NativeScript.sln und klicken Sie auf Build > Build Solution . cd /path/to/your/build/directory auscmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource . Ersetzen Sie MyGenerator durch den Generator Ihrer Wahl. Um die Optionen anzuzeigen, führen Sie cmake --help aus und sehen Sie sich die Liste unten an. Die häufigste Wahl ist "Unix Makefiles", um aus Befehlszeile aus zu erstellen, aber es gibt auch IDE -Optionen. Entfernen -DEDITOR=TRUE für eigenständige Builds.make , wenn Sie Unix Makefiles als Generator entschieden haben. cd /path/to/your/build/directory auscmake -G MyGenerator -DANDROID_NDK=/path/to/android/ndk /path/to/your/project/CppSource aus. Ersetzen Sie MyGenerator durch den Generator Ihrer Wahl. Um die Optionen anzuzeigen, führen Sie cmake --help aus und sehen Sie sich die Liste unten an. Um ein Build für eine andere Plattform als Android zu erstellen, lassen Sie den Teil -DANDROID_NDK=/path/to/android/ndk -Teil weg.make , wenn Sie Unix Makefiles als Generator entschieden haben. Um eine neue Version dieses Projekts zu aktualisieren, schreiben Sie das Verzeichnis Assets/NativeScript -Verzeichnis Ihres Einheitsprojekts mit Unity/Assets/NativeScript -Verzeichnis dieses Projekts und führen Sie den Codegenerator erneut aus.
Artikel des Autors, die die Entwicklung dieses Projekts beschreiben.
Jackson Dunstan
Bitte zögern Sie nicht, Pull -Anfragen zu geben oder einfach ein Problem für Funktionen oder Fehlerbehebungen einzureichen.
Der gesamte Code ist lizenziertem MIT, was bedeutet, dass er normalerweise in kommerziellen und nichtkommerziellen Anwendungen leicht verwendet werden kann.
Das gesamte Schreiben ist von 4.0 lizenziert, was bedeutet, dass es verwendet werden kann, solange die Zuordnung angegeben ist.