Przykłady dotyczące rozszerzenia Android Game Development Extension pokazują, jak korzystać z kluczowych funkcji rozszerzenia. W tym temacie opisano przykłady i ustawienia potrzebne do ich uruchomienia.
Na stronie z plikami do pobrania dostępne są te przykłady:
- HelloJNI: projekt wprowadzający.
- Endless-Tunnel: projekt tylko na Androida.
- Teapot: projekt wieloplatformowy na systemy Windows i Android.
- AssemblyCode-Link-Objects: projekt szablonu z kodem źródłowym zestawu.
Zanim rozpoczniesz
Zainstaluj rozszerzenie Android Game Development Extension i próbki. Szczegółowe informacje znajdziesz w krótkim wprowadzeniu. Z tego tematu dowiesz się też, jak skompilować i uruchomić próbkę. Jako przykład posłuży nam wersja Teapot na Androida.
W przewodniku Konfiguracja projektu opisano, jak skonfigurować ustawienia projektu, który korzysta z rozszerzenia, np. dodać platformę Android i plik APK.
HelloJNI
Przykład HelloJNI to prosty projekt, który wyświetla komunikat „Hello From JNI” w oknie aplikacji. Projekt używa różnych zestawów kodu źródłowego na potrzeby systemu Windows i Androida.
- Katalog kodu źródłowego Androida i skryptów kompilacji Gradle: HelloJNI\AndroidPackaging
- Kod źródłowy systemu Windows i katalog projektu Visual Studio: HelloJNI
Podczas kompilowania projektu Visual Studio przekazuje do pliku build.gradle na poziomie aplikacji te ustawienia: Możesz zmienić te ustawienia, modyfikując skrypty kompilacji Gradle.
MSBUILD_NDK_VERSIONMSBUILD_MIN_SDK_VERSIONMSBUILD_JNI_LIBS_SRC_DIRMSBUILD_ANDROID_OUTPUT_APK_NAMEMSBUILD_ANDROID_GRADLE_BUILD_OUTPUT_DIR
Aby skonfigurować i uruchomić przykład:
- W Visual Studio otwórz i skompiluj przykład HelloJNI.
- Dodaj platformę Android arm64-v8a. Więcej informacji znajdziesz w artykule Dodawanie platformy Android.
- Dodaj element pakietu APK na Androida do nowej platformy.
- Kompiluj projekt.
- Dodaj te platformy Androida, a potem do każdej z nich dodaj element APK Androida: Android-armeabi-v7a, Android-x86 i Android-x86_64.
- Zbuduj i uruchom przykład.
Endless-Tunnel
Plik Endless-Tunnel to gra na Androida, w której gracz zbiera białe sześciany, próbując dotrzeć do końca tunelu. Został on przeniesiony z przykładowego kodu OpenGL w repozytorium Android NDK na GitHubie. Plik próbny nie zawiera wersji gry na system Windows.
W pliku z próbką są już skonfigurowane ustawienia i platformy Android, więc możesz skompilować i uruchomić projekt w Visual Studio bez wprowadzania żadnych modyfikacji. Gdy otworzysz rozwiązanie, eksplorer rozwiązań wyświetli te moduły:
- endless-tunnel: moduł aplikacji, który wyświetla logikę gry.
- glm: zrzut repozytorium OpenGL Math, który jest tworzony jako biblioteka statyczna.
- native_app_glue: opakowanie NDK, które komunikuje się z obiektem NativeActivity.
Czajniczek
Przykładowa aplikacja Czajnik wyświetla klasyczny czajnik renderowany za pomocą OpenGL ES i przeniesiony do rozszerzenia Android Game Development Extension, aby zademonstrować te funkcje:
- Tworzenie projektu na wiele platform: możesz skompilować aplikację Teapot na Windowsa i Androida.
- Używanie niestandardowego pakowania Androida: skrypty kompilacji Gradle zostały przeniesione do katalogu sampli, w którym znajduje się plik
Teapot.sln. - niestandardowe konfiguracje Androida, które pokazują, jak używać Address Sanitizer (ASan) i Hardware Address Sanitizer (HWASan);
W przykładzie Teapot implementacja jest podzielona na kilka części, co jest typowe dla dużych aplikacji i gier wieloplatformowych:
GameApplicationmoduł: definiuje działania użytkownika i stany aplikacji, np. obracanie czajnika przez użytkownika lub aktualizowanie statystyk aplikacji.- Moduł
GameEngine: implementuje podstawowy moduł renderowania.
Aby skonfigurować przykład i uruchomić go na urządzeniu z Androidem, zapoznaj się z krótkim przewodnikiem. Aby skonfigurować przykład i uruchomić go w systemie Windows:
- Zainstaluj GLEW:
- Pobierz i rozpakuj GLEW.
- Skopiuj pliki binarne z folderu
$your-glew-directory\bin\Release\x64do folderu%SystemRoot%\system32.
- Zainstaluj freeglut:
- Pobierz i rozpakuj freeglut.
- Skopiuj
$your-freeglut-directory\bin\x86\freeglut.dlldo%SystemRoot%\system32.
- Dodaj zależności projektu freeglut:
- Otwórz
Teapot.slnw Visual Studio. - W menu kliknij Debugowanie > x64 > Lokalny debuger Windows.
- W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy GameApplication i wybierz Właściwości > C/C++ > Ogólne > Dodatkowe katalogi include.
- Dodaj
$your-freeglut-dir\includedo ścieżki.
- Kliknij OK.
- Kliknij Linker > Ogólne > Dodatkowe katalogi bibliotek.
- Dodaj
$your-freeglut-dir\lib\x64do ścieżki.
- Kliknij OK.
- Kliknij Linker > Ogólne > Dodatkowe katalogi bibliotek.
- Dodaj
freeglut.libdo ścieżki. - Kliknij OK.
- Otwórz
- Dodaj zależności projektu GLEW:
- W panelu Eksplorator rozwiązania kliknij prawym przyciskiem myszy GameApplication i wybierz Właściwości > C/C++ > Ogólne > Dodatkowe katalogi include.
- Dodaj
$your-glew-dir\includedo ścieżki. - Kliknij OK.
- Kliknij Linker > Ogólne > Dodatkowe katalogi bibliotek.
- Dodaj
$your-glew-dir\lib\Release\x86do ścieżki. - Kliknij OK.
- Kliknij Linker > Ogólne > Dodatkowe katalogi bibliotek.
- Dodaj
glew32.libdo ścieżki. - Kliknij OK.
- Uruchom próbkę w Windowsie:
- Na pasku narzędzi Visual Studio kliknij przycisk uruchamiania Lokalny debuger Windowsa.
- Plik przykładowy powinien wyglądać tak:
AssemblyCode-Link-Objects
To projekt szablonowy, który pokazuje, jak wygenerować natywną bibliotekę Androida na podstawie kodu źródłowego w językach assembly i C/C++. Oto główne komponenty:
AssemblyCode-Link-Objects: główna natywna biblioteka Androida utworzona z kodu źródłowego C++ i asemblera.StaticLib: pomocnicza statyczna biblioteka, która eksportuje funkcjęfrom_static_lib_assembly_code_as.
Projekt obsługuje wiele architektur. Każda obsługiwana architektura ma własne pliki źródłowe, które implementują funkcje wyeksportowane z StaticLib.
Pamiętaj, aby uwzględnić tylko pliki źródłowe zestawu dla platform, które budujesz. Ten projekt zawiera pliki assembly w kompilacji za pomocą niestandardowych narzędzi do kompilacji.
Aby skonfigurować i skompilować przykład:
- W Visual Studio sprawdź, czy niestandardowe narzędzia kompilacji są skonfigurowane pod kątem plików assembly:
- W eksploratorze rozwiązania kliknij prawym przyciskiem myszy plik zestawu i wybierz Właściwości. Spowoduje to otwarcie okna Właściwości dla pliku.
- Wybierz konfigurację i platformę, np. Wszystkie konfiguracje w przypadku Android-arm64-v8a.
- Upewnij się, że ustawienie Ogólne > Wyklucz z kompilacji ma wartość Nie.
- Sprawdź, czy w sekcji Ogólne > Typ elementu wybrana jest opcja Narzędzie do tworzenia niestandardowych.
- Jeśli chcesz zastosować zmiany, kliknij Zastosuj.
- Upewnij się, że w sekcji Właściwości konfiguracji > Niestandardowe narzędzia do kompilacji > Wiersz poleceń wybrana jest opcja
$(AsToolExe) -o "$(IntDir)%(FileName).o" %(FullPath). NDK zawiera osobny asembler dla każdej architektury procesora i mapuje$(AsToolExe)na odpowiedni asembler. Ten przykład używa zestawu narzędzi NDK do kompilowania projektów na Androida na platformy x86 i x86_64. Jeśli chcesz używać yasm na platformie Android x86_64, użyj zamiast tego$(YasmToolExe). - Upewnij się, że w sekcji Właściwości konfiguracji > Niestandardowe narzędzia kompilacji > Dane wyjściowe:
$(IntDir)%(FileName).oTen ciąg musi być uwzględniony w ustawieniu Wiersz polecenia. - Upewnij się, że w sekcji Właściwości konfiguracji > Niestandardowe narzędzia kompilacji > Łącz obiekty:
Yes.
Na przykład ustawienia Android-arm64-v8a powinny wyglądać tak jak na tym zrzucie ekranu:
- Kompiluj projekt. Spowoduje to utworzenie pliku
libAssmeblyCodeLinkObjects.so:- Otwórz plik
AssemblyCode-Link-Objects.sln. - W menu kliknij Generuj > Utwórz rozwiązanie.
- Otwórz plik
- Aby sprawdzić, czy funkcje zostały prawidłowo wyeksportowane do biblioteki Androida, użyj narzędzia NDK nm.exe:
- W wierszu poleceń przejdź do katalogu z przykładami.
- Otwórz lokalizację biblioteki Androida wygenerowaną przez kompilację. Domyślna lokalizacja jest podobna do
$sample_dir\$solution_configuration\$solution_platform\$platformi$sample_dir\Debug\Android-arm64-v8a\arm64-v8ana platformie arm64-v8a. - Sprawdź, czy sekcja eksportowanych symboli zawiera funkcje. W tym celu uruchom to polecenie:
…\ndk\toolschains\llvm\prebuilt\windows-x86_64\aarch64-linux-android\bin\nm.exe --defined-only …\Debug\Android-arm64-v8a\arm64-v8a\libAssmeblyCodeLinkObjects.soW wyjściu powinna pojawić się lista symboli, która zawiera:
T from_shared_object_assembly_code_asT from_static_lib_assembly_code_as
PoolAllocator
Plik PoolAllocator to aplikacja na Androida, która zawiera mechanizm alokacji pamięci oparty na puli i zapewniający bardzo wydajne przydzielanie bloków o stałym rozmiarze.
Przydziałca wstępnie przydziela całą pamięć podczas inicjalizacji za pomocą funkcji mmap. Wolne bloki są śledzone za pomocą połączonej listy. Przydzielanie pamięci to szybka operacja O(1), która zwraca początek połączonej listy, a odzyskiwanie pamięci to również operacja O(1), ponieważ dodaje blok do końca połączonej listy.
Przykład zawiera 2 konfiguracje rozwiązania do korzystania z HWASan.
HWASan: ta konfiguracja pokazuje najprostsze podejście do korzystania z HWASan z niestandardowymi przydziałami pamięci. Wewnętrzna implementacja przydziału pamięci jest zastąpiona wywołaniamimalloc/free, które są automatycznie śledzone przez HWASan. Moduły przydzielania pamięci nie działają już jako moduły przydzielania na podstawie puli, ale HWASan może nadal pomagać w identyfikowaniu ważnych błędów związanych z pamięcią, takich jak use-after-free.HWASan-Advanced: Ta konfiguracja pokazuje, jak w pełni zintegrować HWAS z niestandardowym alokatorem pamięci bez zmiany oryginalnego mechanizmu alokacji używanego przez alokator. Używa metod tagowania HWASan do oznaczania bloków pamięci w puli przydzielonej z góry, zaokrągla rozmiar bloku do minimalnego rozmiaru bloku wymaganego przez HWASan i resetuje tagi, gdy bloki są zwracane do puli.
Użyj konfiguracji HWASan, ponieważ jest ona prostsza i może pomóc w identyfikacji typowych błędów pamięci. Jeśli chcesz dowiedzieć się, jak działa HWASan, lub zachować wewnętrzną semantykę przydziału pamięci podczas korzystania z HWASan, zapoznaj się z implementacją konfiguracji HWASan-Advanced.