Programowanie na wielu platformach C ++ / OpenGL ES (iOS / Android) [zamknięte]

10

Mam już rozsądne doświadczenie z C ++ i OpenGL, a ostatnio postanowiłem wypróbować tworzenie gier mobilnych. Po pomyślnym utworzeniu prostej aplikacji OpenGL ES na Androida przy użyciu Javy, szukałem sposobów, aby celować zarówno w Androida, jak i iOS przy jak najmniejszym przepisywaniu kodu. Próbowałem użyć dumnie prezentowanych wieloplatformowych narzędzi do tworzenia aplikacji Visual Studio 2015, ale okazało się, że są one zbyt nowe, a zatem bardzo niedokumentowane. Mógłbym zbudować projekty szablonów, które dał mi program, ale nie mogłem dowiedzieć się, w jaki sposób, biorąc pod uwagę te szablony, mogę dodać zasoby do gry lub obsłużyć dane z ekranu dotykowego.

Niestety, mam szczególne pragnienie, zbyt konkretne, by znaleźć je w Google. Chcę stworzyć grę OpenGL ES przy użyciu C ++ z cienkimi opakowaniami dla platform Android i iOS. Ludzie zadawali mi podobne pytania (choć nie dokładnie takie same), a więcej niż jedna osoba odpowiadająca stwierdziła, że ​​to, co chcę zrobić, jest nie tylko możliwe, ale względnie łatwe, ponieważ nie muszę się martwić o interfejs użytkownika.

Wypróbowałem ten samouczek , ale ma on prawie trzy lata i dlatego prawdopodobnie jest przeznaczony dla starszych technologii, w wyniku czego wpadłem na różne niezliczone błędy. Jednak w tej chwili ten samouczek jest najbliższy temu, co chcę, że znalazłem. Cała reszta dotyczy wyłącznie systemu Android lub zaleca płacenie setek dolarów rocznie za korzystanie z zestawu Marmalade SDK. Czasami mam ochotę po prostu napisać kod dwa razy, raz w Javie, a raz w Objective-C, ale motywuje mnie wiedza, że ​​takie rozwiązanie jest możliwe, ale z jakiegoś powodu nie zostało ono omówione w żadnym nowoczesnym szczególe.

Podsumowując, chcę stworzyć grę OpenGL ES na iOS i Androida, z jedną bazą kodu C ++ owiniętą niewielką ilością kodu specyficznego dla platformy. Jednak pomimo faktu, że kilka osób poleciło to podejście, nikt nie może mi powiedzieć, jak to zrobić. Czy ktoś może mi powiedzieć, czy to rzeczywiście możliwe, a jeśli tak, co mogę zrobić lub gdzie mogę się dowiedzieć, jak to zrobić?

Craig Horwood
źródło
spróbuj cocos2d-x lub unity3d
Ali1S232
1
unity3d jest daleka od tego, o co prosi OP, ponieważ nie masz dostępu do źródła. Użyłem cocos2d-x, a problemy z kompilacją nadal istnieją do pewnego stopnia. Wpływ na cel C jest również odczuwalny, niektórym może się to podobać, ale dla mnie jest to wyłączenie. Jest to jednak rozwiązanie typu open source, więc może warto poświęcić czas na zbadanie PO.
Matthew Sanders

Odpowiedzi:

6

Możesz znaleźć odpowiedź na podobne pytanie tutaj , aby być pomocnym.

Pomocne może być również sprawdzenie kodu źródłowego innych rozwiązań. Na przykład Godot Engine to wieloplatformowy silnik gry typu open source, więc nigdy nie musisz nic płacić.

Jak wspomniałem w mojej drugiej odpowiedzi , nie musisz (i prawdopodobnie nie możesz) polegać na jednym IDE, aby wykonać pracę za Ciebie. CMake , Scons i wiele innych narzędzi do budowania może pomóc w procesie kompilacji / kompilacji między platformami i IDE.

Na przykład Godot Engine używa Scons, a projekt LLVM (znany również jako framework kompilatora używany przez clang kompilatora C / C ++ / Objective-C) używa CMake .

Popularnym podejściem do gier jest budowanie silnika w C / C ++ i, jak wspomniałeś, abstrahowanie od specyfiki platformy. Jeśli chodzi o iOS i Androida, jest to logika zarządzania cyklem życia, która łączy się z systemem operacyjnym. Jeśli chcesz zrobić coś więcej i wykorzystać Emscripten do kompilacji do asm.js i zrealizować niemal natywną prędkość w przeglądarce, robisz coś podobnego z wyodrębnieniem głównej pętli za tym, co odpowiada wywołaniom requestAnimationFrame .

Emscripten zaleca użycie SDL w celu ułatwienia procesu przenoszenia, ponieważ może pomóc w obsłudze abstrakcyjnej specyfiki platformy, ale nic nie powstrzymuje cię przed zrobieniem tego samodzielnie (poza mnóstwem badań, debugowania itp.).

Jeśli jesteś naprawdę, naprawdę szalony, możesz robić to, co robię i pisać własny język, korzystając z mocy LLVM do kompilacji do natywnego C ABI lub nawet JIT na obsługiwanych platformach.

Chodzi o to, że tak, jest to rzeczywiście możliwe, ale niektóre drogi są bardziej skomplikowane / czasochłonne niż inne.

Uwaga: prawdopodobnie będziesz musiał używać Mac OSX przez Mac, VM lub Hackintosh z XCode, aby skompilować do iOS. To jeden z wielu powodów, dla których uważam Macbooka Pro za świetnego kandydata na system programistyczny.

Uwaga 2: Warto wspomnieć, że wiele silników wieloplatformowych używa obecnie języków skryptowych do logiki specyficznej dla gry. Unity nawet nie pozwala ci na przykład zbliżyć się do kodu źródłowego (chociaż możesz pisać natywne wtyczki). Może to pomóc przyspieszyć cykle programowania, a także ograniczyć przenoszenie do minimum, ponieważ języki skryptowe są dość niezależne od platformy (szczególnie interpretowane języki działające na maszynie wirtualnej). Celem mojego języka jest umożliwienie zarówno JIT (głównie dla oszczędności czasu programowania), jak i kompilacji statycznej.

Uwaga 3: Jeśli jeszcze tego nie wiesz. Jeśli nie korzystasz z SDL lub innego rozwiązania, które wyodrębnia specyfikę platformy, musisz użyć specyficznych funkcji interfejsu C / C ++ dla każdej platformy. W iOS jest to dość proste w XCode, ponieważ kompilator (klang jak wspomniano powyżej) już obsługuje C / C ++. W Androidzie musisz korzystać zpołączeń NDK i marshall między Javą a C / C ++.

Matthew Sanders
źródło
1
Zajrzałem do kodu źródłowego Godot Engine. Wydaje się to trochę przesadne; Wolę tworzyć własne bez funkcji, których nie potrzebuję. Nie jestem jednak pewien, jak to zrobić. Nie udało mi się uruchomić żadnego kodu C ++ na Androidzie.
Craig Horwood
hehe ... NDK to nie piknik. Szczerze mówiąc, znajduję coś w Google, który potrzebuje pomocy w kategorii przyjazności dla programistów. Czy korzystanie z SDL jest wyłączone? Mam znacznie więcej informacji, w razie potrzeby mogę zaktualizować odpowiedź.
Matthew Sanders
SDL nie jest niedostępny, ale wolałbym tam nie iść. Po raz kolejny zawsze jest ta drobna wiedza, że ​​można to zrobić bez ram.
Craig Horwood
Ten błąd ciągle mnie gryzie, więc wiem, jak się czujesz. W przeszłości korzystałem z NDK i nie sądzę, żeby wiele się zmieniło w konfiguracji i kompilacji. Mam nadzieję, że debugowanie uległo poprawie, ponieważ w przeszłości trzeba było używać GDB bezpośrednio przez terminal, a IDE nie obsługiwał go, ale wygląda na to, że zaczęli dodawać obsługę NDK do studia Android . Próbowałeś już przykładu hellojni ?
Matthew Sanders
NDK jest jedną z najbardziej obrzydliwych rzeczy na świecie, możesz znaleźć bgfx przydatny jako odniesienie github.com/bkaradzic/bgfx , nie jest tak cienki, jak byś
chciał