Can I write a game code in C or C++?

C++ til Mobilspil: Realistisk på iOS og Android?

14/03/2023

Rating: 4.99 (5391 votes)

Har du nogensinde undret dig over, om de mest grafisk krævende og ydeevne-tunge mobilspil er skrevet i "almindelige" sprog som Swift eller Kotlin? Svaret er ofte nej. Mange af de spil, der presser grænserne for, hvad en smartphone kan, udnytter kraften fra sprog som C og især C++. Men er det virkelig muligt at udvikle et helt mobilspil i C++ på både iOS- og Android-platformene? Og er det et realistisk mål for dig som udvikler at lære C++ til dette formål? Svaret er et rungende ja, men det kommer med visse nuancer og en forståelse for platformenes arkitektur. Lad os dykke ned i, hvordan C++ passer ind i den mobile spiludviklingsverden og hvad det kræver at mestre det.

Can I use C++ on Android & iOS?
You can use C++ just fine on Android and iOS but truthfully it is often more trouble than it is worth. For games like Temple Run or Angry Birds it is overkill. You could easily develop those games in Java for Android with excellent performance. Or, like you mentioned, you can look at Unity to make targeting iOS and Android easier. Up to you though.
Indholdsfortegnelse

C++ og Mobilspil: Hvorfor Overhovedet?

Når det kommer til spiludvikling, er ydeevne ofte den altafgørende faktor. Mobiltelefoner er kraftfulde, men deres ressourcer er stadig begrænsede sammenlignet med gaming-pc'er eller konsoller. C++ tilbyder en unik kombination af lavniveaukontrol og høj ydeevne, hvilket gør det til et ideelt valg for spil, der kræver maksimal udnyttelse af hardwaren. Her er nogle af de primære grunde til, at C++ er attraktivt for mobilspiludviklere:

  • Optimal Ydeevne: C++ giver udviklere mulighed for at skrive kode, der kører ekstremt hurtigt, da det tilbyder direkte hukommelseskontrol og minimal overhead. Dette er afgørende for spil med komplekse grafikmotorer, fysiksimuleringer og store verdener.
  • Krydsplatformskompatibilitet: En af de største fordele ved C++ er dets evne til at køre på tværs af mange forskellige platforme. Du kan skrive din spilkerne én gang i C++ og derefter genbruge den på iOS, Android, PC, konsoller og endda web (via WebAssembly). Dette sparer tid og ressourcer i udviklingsprocessen.
  • Adgang til Lavniveau Systemer: C++ giver dig tættere adgang til hardwaren og operativsystemets lavniveau API'er, hvilket er essentielt for optimering af grafik- og lydgengivelse.
  • Etableret Økosystem: C++ har et enormt og modent økosystem af biblioteker og værktøjer, herunder populære spilmotorer som Unreal Engine, der er bygget på C++. Selvom du måske ikke bruger Unreal direkte til et simpelt mobilspil, drager du stadig fordel af de principper og optimeringsteknikker, der er udviklet i C++-fællesskabet.

C++ på iOS: En Tynd Objective-C Skal

Når det kommer til iOS, er den primære sprogpakke Swift og Objective-C. Apple har designet sit økosystem omkring disse sprog, og alle de indbyggede API'er, fra brugergrænsefladen (UIKit) til Game Center og køb i appen (StoreKit), er eksponeret via Objective-C eller Swift. Dette betyder dog ikke, at C++ er udelukket.

Hvordan fungerer det i praksis?

Forestil dig, at din iOS-applikation består af to hovedlag: et "native" lag og et "spilkerne" lag.

  • Det Native Lag (Objective-C/Swift): Dette lag håndterer alt, der har med operativsystemet og brugergrænsefladen at gøre. Det er her, du initialiserer din app, håndterer touch-begivenheder, viser menuer, interagerer med Game Center, viser annoncer osv. Dette lag skrives typisk i Swift eller Objective-C.
  • Spilkerne Laget (C/C++): Dette er hjertet af dit spil. Det er her, din spil-logik, grafik-rendering (f.eks. ved hjælp af OpenGL ES eller Metal), fysik-simuleringer, AI og al den tunge regnekraft udføres. Dette lag kan skrives fuldstændigt i C eller C++.

For at disse to lag kan kommunikere, bruger iOS en mekanisme kaldet "bridging". For C++ specifikt, kan du bruge Objective-C++ filer (.mm-filer), der tillader dig at blande Objective-C og C++ kode i den samme fil. Dette gør det relativt nemt at kalde C++ funktioner fra Objective-C og omvendt. Du kan bygge en tynd Objective-C-indpakning (en "wrapper") omkring din C++-spilkerne, der eksponerer de nødvendige funktioner til det native iOS-lag.

Selvom Objective-C kan virke skræmmende, hvis du kun er vant til C++, er det faktisk et relativt let sprog at lære, især grundlæggende syntaks. Det er en udvidelse af C, og de fundamentale C-koncepter vil være velkendte. Det er ikke nær så komplekst eller dybt som C++.

Det skal dog bemærkes, at hvis du ønsker at integrere dybt med mange af Apples specifikke tjenester, vil du sandsynligvis støde på Objective-C- eller Swift-API'er. At have en grundlæggende forståelse af disse sprog vil derfor være en stor fordel.

C++ på Android: Kraften fra NDK

På Android-platformen er situationen lignende, men med en anden tilgang. Android-apps er traditionelt skrevet i Java eller Kotlin. Men Google har anerkendt behovet for native kode til ydeevne-kritiske applikationer, især spil, og har derfor udviklet Android NDK (Native Development Kit).

Hvad er Android NDK?

Android NDK er et sæt værktøjer, der giver Android-udviklere mulighed for at implementere dele af deres applikation ved hjælp af native kode, såsom C og C++. Det er især nyttigt for spiludvikling, lydbehandling eller enhver anden opgave, der kræver høj ydeevne eller genbrug af eksisterende C/C++-kodebaser.

Ligesom på iOS, vil din Android-app typisk have et Java/Kotlin-lag, der håndterer Android-specifikke komponenter som Activities, Fragments, UI-elementer og adgang til Android API'er. Dette lag vil derefter kalde dine native C/C++-funktioner via Java Native Interface (JNI).

Java Native Interface (JNI)

JNI er den bro, der forbinder Java/Kotlin-koden med din native C/C++-kode. Det giver dig mulighed for at kalde C/C++-funktioner fra Java/Kotlin og omvendt. Selvom JNI kan være lidt komplekst at arbejde med i starten på grund af dets detaljerede krav til datatypemapping og hukommelsesstyring mellem de to miljøer, er det et kraftfuldt værktøj, der muliggør problemfri integration.

Med NDK kan du pakke din C/C++-spilkerne som et delt bibliotek (.so-fil), der derefter indlæses og udføres af din Java/Kotlin Android-app. Dette giver dig mulighed for at udnytte C++'s ydeevne til spillets centrale logik, mens du stadig bruger de standard Android-API'er for at håndtere interaktioner med operativsystemet, input, lyd og grafik via f.eks. OpenGL ES.

Can I write a game code in C or C++?
Some objective C has to be written for iPhone apps. That being said, you can write a pretty thin layer of obj-c and then do all you game code in C or C++. On android look up the NDK. I don't have any experience with it, but it promises to be a native sdk so you should be able to write most things in C or C++.

Fordele og Ulemper ved C++ til Mobilspil

At vælge C++ til mobilspiludvikling er en strategisk beslutning, der kommer med både betydelige fordele og nogle udfordringer. Det er vigtigt at veje disse op mod hinanden, før du kaster dig ud i det.

Fordele:

  • Uovertruffen Ydeevne: Som nævnt er dette den primære drivkraft. C++ giver dig kontrol på et niveau, som højere-niveau sprog sjældent kan matche, hvilket er afgørende for grafisk intensive spil eller spil med kompleks AI og fysik.
  • Maksimal Krydsplatform Genbrug: Den samme C++-kodebase kan bruges på tværs af iOS, Android, Windows, macOS, Linux og konsoller. Dette reducerer udviklingstid og vedligeholdelsesomkostninger markant, da du ikke behøver at skrive spillets kerne flere gange.
  • Adgang til Robuste Biblioteker: C++ har et væld af modne og optimerede biblioteker til alt fra matematik og grafik (f.eks. Vulkan, OpenGL) til netværk og lyd. Disse biblioteker er ofte bygget med ydeevne for øje.
  • Finjusteret Kontrol: C++ giver dig fuld kontrol over hukommelsesstyring og ressourceallokering. Selvom dette kan være en udfordring, giver det også mulighed for ekstrem optimering, hvilket er guld værd i spiludvikling.
  • Industristandard: C++ er et de facto-standardsprog i spilindustrien, især for AAA-titler. At mestre C++ åbner mange døre i gaming-branchen.

Ulemper:

  • Stejlere Indlæringskurve: C++ er et komplekst sprog med mange nuancer. Hukommelsesstyring, pegere, templates og objektorienterede paradigmer kan være vanskelige at mestre, især for begyndere.
  • Længere Udviklingstid: Selvom kode kan genbruges, er den indledende udvikling i C++ ofte langsommere end i højere-niveau sprog. Manuel hukommelsesstyring og behovet for at skrive mere boilerplate-kode kan forlænge processen.
  • Kompleks Fejlsøgning: Fejl i C++-kode, især hukommelsesrelaterede fejl, kan være notorisk svære at finde og rette.
  • Platformsspecifikke Integrationsudfordringer: Selvom spilkerne er i C++, skal du stadig have en forståelse for Objective-C/Swift på iOS og Java/Kotlin på Android for at integrere med OS-funktionalitet, UI og platformspecifikke API'er. Broen mellem native og C++-kode (Objective-C++ og JNI) kan være en kilde til kompleksitet.
  • Større Binærfiler: C++-applikationer kan i nogle tilfælde resultere i større app-størrelser sammenlignet med dem, der er skrevet udelukkende i platformens native sprog.

Er det realistisk at lære C++ til mobilspiludvikling?

Absolut! Det er ikke kun realistisk, men også en yderst værdifuld færdighed, der kan åbne op for avancerede muligheder inden for mobilspiludvikling. Hvis du er seriøs med at skabe spil med høj ydeevne, komplekse systemer eller ønsker at genbruge kode på tværs af mange platforme, er C++ et fremragende valg.

Det er dog vigtigt at have en realistisk forventning. Du vil ikke kun lære C++, men også grundlæggende principper for mobiludvikling, herunder:

  • iOS-udviklingsmiljøet: Brugen af Xcode, forståelse af projektstruktur, og hvordan man kompilerer og kører apps på iOS-enheder.
  • Android-udviklingsmiljøet: Brugen af Android Studio, opsætning af NDK, og hvordan man bygger og deployer apps på Android-enheder.
  • Grundlæggende bro-teknikker: Hvordan man bruger Objective-C++ til iOS og JNI til Android for at forbinde din C++-kode med de platformsspecifikke API'er.
  • Grafik-API'er: Læring af f.eks. OpenGL ES eller Vulkan til at tegne grafik på skærmen.

Mange succesfulde mobilspil er udviklet ved hjælp af C++ i deres kerne. Det er en investering i din udviklerkarriere, der kan betale sig i form af mere kraftfulde og fleksible spil. Overvej at starte med et mindre projekt for at få greb om de grundlæggende koncepter og gradvist arbejde dig op til mere komplekse spil.

Ofte Stillede Spørgsmål (FAQ)

Q: Kan jeg lave hele spillet i C++ uden at røre Objective-C/Swift eller Java/Kotlin?

A: Teknisk set kan du skrive langt størstedelen af spillets logik, grafik-rendering og fysik-simuleringer i C++. Dog vil du altid skulle bruge en "tynd" lag af Objective-C/Swift på iOS og Java/Kotlin på Android til at initialisere appen, håndtere OS-begivenheder (som touch, rotation), vise brugergrænsefladen, og interagerer med platformsspecifikke tjenester som Game Center, in-app purchases, notifikationer osv. Du kan minimere mængden af kode i disse sprog, men du kan ikke helt undgå dem.

Q: Er C++ bedre end Swift/Kotlin til spiludvikling?

A: "Bedre" er et subjektivt ord og afhænger af konteksten. For rå ydeevne og lavt niveau kontrol, især for grafisk intensive 3D-spil eller komplekse simuleringer, er C++ ofte det overlegne valg. Swift og Kotlin er fremragende til hurtig app-udvikling, bygning af brugervenlige grænseflader og integration med platformens økosystem på et højere abstraktionsniveau. Til mindre, 2D-spil eller spil, der ikke kræver ekstrem ydeevne, kan Swift eller Kotlin være et hurtigere og nemmere valg. For mange store spil ser man en hybrid tilgang, hvor C++ bruges til kernemotoren, og Swift/Kotlin til UI og platformintegration.

Q: Hvilke værktøjer skal jeg bruge for at komme i gang?

A: For iOS har du brug for Xcode (gratis fra Apple), som inkluderer Objective-C, Swift og C++ compilere. For Android skal du bruge Android Studio (gratis fra Google) og installere Android NDK via SDK Manageren i Android Studio. Udover disse IDE'er vil du også have brug for en god C++ compiler (f.eks. Clang, GCC) og eventuelt et build-system som CMake. Mange udviklere bruger også versionskontrolsystemer som Git.

Q: Skal jeg lære Objective-C/Swift og Java/Kotlin også, hvis jeg vil bruge C++?

A: Ja, en grundlæggende forståelse af disse sprog er stærkt anbefalet, hvis ikke nødvendig. Du vil skulle skrive den "tynde skal" af kode i disse sprog for at interagere med operativsystemet og håndtere brugergrænsefladen. Selvom du kan finde eksempler eller skabeloner, vil evnen til at læse og forstå disse sprog give dig meget større fleksibilitet og kontrol over din applikation.

Q: Hvad med spilmotorer som Unity eller Unreal Engine? Bruger de C++?

A: Ja, både Unity og Unreal Engine har C++ i deres kerne. Unreal Engine er primært bygget i C++ og giver udviklere fuld adgang til at skrive spilkode i C++. Unity bruger C# som sit primære scriptsprog, men selve Unity-motoren er skrevet i C++, og du kan skrive C++ plugins (via Native Plugins) til ydeevnekritiske opgaver. At lære C++ giver dig en dybere forståelse af, hvordan disse motorer fungerer under overfladen, og giver dig mulighed for at optimere og udvide dem på avancerede måder.

I sidste ende er C++ et kraftfuldt og relevant sprog for mobilspiludvikling, især for projekter der kræver maksimal ydeevne og krydsplatformskompatibilitet. Selvom det kommer med en stejl indlæringskurve og behovet for at forstå platformsspecifikke integrationer, er belønningen enestående kontrol og evnen til at skabe spil, der virkelig skiller sig ud.

Hvis du vil læse andre artikler, der ligner C++ til Mobilspil: Realistisk på iOS og Android?, kan du besøge kategorien Teknologi.

Go up