3D APIer - fra Desktop til Android

Figur 3d apier, OpenGL, Metal til Apple iOS, Vulkan til Android, Mantle, mm.

3D APIernes forhistorie

OpenGL er et eksempel på et af de første 3D APIer. OpenGL har spillet en gennemgående rolle siden sin begyndelse tilbage i 1992. Det er en åben standard, hvor åben betyder at den er fri og gratis at implementere og anvende. Et af hovedmålene med standarden er platformuafhængighed. Selve specifikationen og dens udvikling blev oprindeligt kontrolleret af en gruppe kaldet OpenGL Architecture Review Board, som bestod af bl.a. Apple, Intel og Microsoft. I dag er denne rolle overtaget af Khronos Group, og medlemmerne er i årenes løb kommet og gået, men essensen er den samme. Det er stadig en standard, der er styret af en komite.

Microsoft valgte tidligt at forlade det gode selskab for i stedet at fokusere på deres eget API Direct3D (D3D).

I 1996 lancerede 3dfx deres Voodoo grafikkort og deres eget proprietære API 3D Glide og var dermed startskuddet på en 3D revolution. De efterfølgende år bød på en lind strøm af 3D grafikkort og dertilhørende proprietære APIer. En historisk finurlighed er at et af disse APIer blev navngivet MeTaL.

Microsofts dominans igennem spil

Hen imod slutningen af 90erne stod der reelt set kun to spillere tilbage.

  • OpenGL, den åbne standard, der fokuserede på platformuafhængighed og
  • D3D, den Microsoft styrede standard, der kun understøttede Windows.

Det er oplagt at erklære D3D som den klare vinder, alene af den årsag af Windows var og er den dominerende desktop platform og at Windows udviklere typisk valgte D3D fremfor OpenGL. Konsensus er dog at de hver fandt deres markedet, hvor D3D primært blev anvendt til spil mens OpenGL fandt sit markedet i produktions-applikationer.  

Efter årtusindskiftet åbnede der sig nye muligheder for OpenGL i takt med indtoget af håndholdte enheder. Eftersom disse enheder havde færre kræfter betød det at OpenGL i dets daværende form ikke var velegnet. Hermed blev OpenGL for Embedded Systems (GLES) født. GLES er et subsæt af desktop OpenGL og har derfor meget til fælles, men de er to seperate APIer og GLES kan typisk ikke direkte anvendes på desktop.

Da iOS og senere Android smartphones begyndte at dukke op var det med GLES i en central rolle. Herefter gik der et par år hvor GLES gik sin sejrsgang. Hvilket leder os hen til den seneste udvikling.

Figur: Metal til Apple iOS, Vulkan til Android og OpenGL

Low-level APIer

I 2013 valgte AMD at fremlægge et nyt initiativ kaldet Mantle. Mantle var en konsekvens af flere års voksende behov for at gøre op med de eksisterende 3D APIer. De var på mange måder ikke længere tidssvarende. Flerkerne CPUer havde længe været normen men de eksisterende 3D APIer gjorde det vanskeligt at udnytte den øgede parallelisering. Andre klagepunkter var at udvikleren havde for lidt kontrol over f.eks. hukommelseshåndtering og validering. Mantle var det første i en række af såkaldte low-level 3D APIer. Med low-level skal forstås at APIet er en minimal abstraktion over hardwaren og overlader langt mere ansvar til udvikleren. Mantle blev aldrig officielt udgivet men blev i stedet doneret til Khronos Group og er udgangspunktet for det, der i begyndelsen af 2016 blev udgivet som Vulkan. Microsoft lancerede deres eget bud, Direct3D 12 midt i 2015, som er et low-level API til Windows 10, Xbox One og Windows Phone 10.

Mere overraskende var det at Apple ud af det blå præsenterede Metal i 2014. Til at begynde med var der kun understøttelse på iOS, men siden OS X El Capitan er der også understøttelse på desktop. Apple har mere eller mindre gjort det klart at fremtiden på deres platforme hedder Metal. Apple har altid gerne ville have fuld kontrol over både hardware og software og i den optik giver det god mening at man stille og rolig udfaser det komitestyrede OpenGL/GLES. Måske ikke officielt men så alene i praksis af at de versioner, der understøttes ikke længere er tidsvarende. Apple tilføjede OpenGL 4.1 understøttelse til OS X 10.9 i 2013, hvilket var mere end 3 år efter specifikationen var blevet publiseret. Til reference var version 4.4 seneste udgave på daværende tidspunkt og i 2014 kom seneste version 4.5. Efter sigende er det lykkedes for Apple at lave et både let tilgængeligt og effektivt API.

Vulkan

Man kan på mange måder sige at Vulkan er hvad Longs Peak (kodenavnet for OpenGL 3.0) aldrig blev. Med Vulkan har man fået en revolution og ikke endnu en evolution. Vulkan fjerner opdelingen man kender fra GL/GLES. Nu er der kun ét samlet API til desktop og mobil. Ligeledes er Vulkan reelt set ikke et 3D API, men en kerne hvor 3D er en udvidelse. Dette betyder at Vulkan også understøtter Compute funktionalitet (dette gælder også for D3D 12 og Metal), som tidligere krævede en ikke altid triviel integration med OpenCL.

Der er stadig ligeheder med OpenGL, f.eks. er udviklingen af standarden stadig styret af Khronos Group medlemmerne og man har stadig høj fokus på platformuafhængighed. Her har man både vundet og tabt. Hvor OpenGL er understøttet af de tre store desktop platforme og GLES er på både iOS og Android, så er Vulkan et strømlinet API der understøtter både desktop og mobil. Desværre har man dog mistet understøttelse for Apple platformene.

Det er vigtigt at man ikke lader sig forblinde at Vulkans potentiale. APIet er radikalt anderledes end f.eks. OpenGL. OpenGL er igennem årene gradvist blevet mere komplekst i takt med at mulighederne blev flere for udvikleren, men Vulkan skruer det yderligere et niveau op. Prisen for højere performance kommer i form at øget ansvar. Man bliver med andre ord ikke holdt i hånden som tidligere og kilderne til fejl er mange.

3d apier vulkan Android. Live long and prosper.

Android

Android er den platform, der favner bredest. Givet man finder hverken understøttelse for D3D 12 eller for Metal, men det er den eneste mobile platform, der understøtter samtlige versioner af OpenGL ES. iOS understøtter op til version 3.0. Android har været den primære driver af OpenGL ES standarden siden, hvilket fint underbygges af, at den seneste version 3.2 startede livet under navnet Android Extension Pack.

Alt afhængig af hvilken type app man udvikler, så kan 3D enten fylde meget lidt eller være kilde til stor frustation. Hvis din app, har fokus på 3D, så er tallene fra 7. november 2016 kedelig læsning. De viser at 43.1% af Android enhederne understøtter GLES 2.0, mens antallet af enheder, der understøtter 3.0 ligger på 42.2%. Enheder, der understøtter 3.1, ligger på 14.7%. Disse er i teorien Vulkan kompatible, men i praksis afhænger det af, om enhedens grafik driver bliver opdateret. Der findes ingen officielle tal omkring procentdelen, der understøtter Vulkan, men de er med sikkerhed væsentligt lavere end de 14.7%. Tallene viser med alt sin tydelighed, at man mister rigtig mange brugere ved at gå højere end 2.0.

Til trods for de lidt dystre tal, så afhænger det i høj grad af hvad ens app forsøger at løse. Ofte har udvikleren ikke direkte behov for brugerdefineret 2D eller 3D grafik og kan derfor mere eller mindre ignorere problemstillingen. I andre tilfælde hvor ens behov kan klares med 2D, der tilbyder Android 2D-specialiserede views og klasser som f.eks. SurfaceView og Canvas. Hvis man har behov for brugerdefineret 3D grafik, så tilbyder Android GLSurfaceView og GLSurfaceView.Renderer, hvor som præfikset GL indikerer Javabindinger til OpenGL ES funktionalitet.

Androids Native Development Kit

Der er yderligere et alternativ til at anvende GLES i Android og det er via Android Native Development Kit (NDK), hvor man implementerer sin 3D logik i C/C++, i stedet for Java. Der kan være noget performance at hente ved at implementere i C/C++. I andre tilfælde kan det give mening, hvis man allerede har C/C++ GLES kode eller at man har et behov for genbrug af kode på andre platforme. Som hovedregel anbefales det dog, at man ikke uden omtanke kaster sig ud i en native løsning i den tro at det performer bedre. Det øger samtidig kompleksiteten af appen i og med at man blander en Java og en C/C++ kodebase.

Denne problemstilling undgår man dog ikke, hvis man vil Vulkan vejen, da det kun understøttes via NDK, og Google har indikeret, at man ikke skal forvente Javabindinger, da mange af fordelene ved Vulkan vil gå tabt herved (læs mere her). 

Konklusion

De senere år har vist en klar tendens mod en konvergering mod egne platforme. D3D 12 understøttes kun på Microsofts platforme. Apple satser på Metal til iOS og macOS. Det efterlader Android som den eneste, der stadig satser på de åbne plaforme, GLES og Vulkan. Det er med andre ord blevet en større opgave at supportere alle de populære platforme. For små virksomheder er opgaven næsten uoverkommelig, hvis man skal løfte opgaven selv. Derfor ser man også at mange vælger at overlade platformafhængig kode til 3. part som f.eks. Unity. 

Som Android udvikler er det klart mest interessant at følge Vulkan. Der har været meget hype men det er muligvis kommet bag på mange at det ikke er en silver bullet til at løse lav framerate, men at det kræver en ny måde at tænke på og måske endda også at man bevæger sig ud af sin komfortzone, da det ikke ligger i kortene at Google vil eksponere Vulkan funktionalitet via Javabindinger. Vulkan version 1.0 udkom for under et år siden, så det er stadig tidligt, og der er forholdsvis få enheder, der understøtter det. Derfor er der intet der tyder på, at GLES er på vej ud af Android økosystemet lige foreløbigt.

Der er en ny spændende spiller i form af Vulkan, men med den langsomme udbredelse af GLES 2.0+ i mente og Vulkans øgede kompleksitet, så vil GLES stadig have en relevans i de kommende år. Den største trussel mod GLES er umiddelbart, hvis Google skulle gå i Apples fodspor og lave deres eget API, som eventuelt baserede sig på Vulkan.

 

Af Steen Rasmussen
Senior Android udvikler hos Touchlogic