Ήθελα πολύ καιρό να γράψω κάτι για τον πόλεμο τών API. Το θέμα είναι ξανά σημαντικό μετά την κίνηση τών τελευταίων χρόνων για υποστήριξη παιχνιδιών σε Mac και Linux και ιδιαιτέρως επίκαιρο μετά την GDC τον Μάρτιο τού 2015 όπου παρουσιάστηκε ο Vulkan.
Στην πραγματικότητα την προηγούμενη ανάρτηση την έκανα σχεδόν αποκλειστικά ώστε να κάνω αυτήν την ανάρτηση εστιάζοντας στα API αντί για τα λειτουργικά.
http://www.gameworld.gr/community/blogs/entry/ena-akoma-xroniko
Επίσης και η προ-προηγούμενη ανάρτηση είναι σημαντική ως υπόβαθρο.
http://www.gameworld.gr/community/blogs/entry/mia-mikri-istoria
Ο Vulkan είναι απίστευτα σημαντικό νέο και αφενός ελάχιστα έχουν γραφτεί ή ειπωθεί και αφετέρου ακόμα και αυτά τα λίγα που ειπώθηκαν σε μεγάλο ποσοστό είναι εξώφθαλμα λανθασμένα.
χρονολόγιο γραφικών API
1992 OpenGL
1995 DirectX
1996 DirectX 2, Direct3D
1998 SDL
1999 DirectX 7
1999 GeForce 256
2000 DirectX 8
2002 DirectX 9
2003 OpenGL ES
2004 OpenGL 2
2006 DirectX 10
2008 OpenGL 3
2009 DirectX 11
2010 OpenGL 4
2011 WebGL
2013 SDL 2
2015 DirectX 12
2016 Vulkan
Ξεκινάω την ιστορία από το 1992 που βγήκε η OpenGL. Η OpenGL αρχικά δημιουργήθηκε ως μια βιβλιοθήκη για δημιουργεία γραφικών εφαρμογών που θα διευκόλυνε τούς προγραμματιστές ώστε να μην αναγκάζονται να υλοποιούν ξανά και ξανά τα ίδια πράγματα για κάθε εφαρμογή και για κάθε πλατφόρμα.
Το 1995 η microsoft μαζί με τα ομώνυμα windows βγάζει ένα νέο API, το DirectX. Το DX αρχικά δεν είχε καμμία σχέση με το OGL αφού ο σκοπός του ήταν τελείως διαφορετικός. Σκοπός τούς DX ήταν να γίνει ένα βιομηχανικό στάνταρ. Επίσης το DX δεν αφορούσε μόνο τα γραφικά αλλά και τον έλεγχο άλλων πραγμάτων όπως ο ήχος και το ποντίκι. Ειδικά στα γραφικά αυτό που είχε να προσφέρει δεν είχε καμμία σχέση με το OGL πράγμα όχι παράξενο αφού οι κάρτες γραφικών αν υπήρχαν ήταν πολύ φτωχές και το OGL λειτουργούσε κυρίως σε επίπεδο λογισμικού και όχι υλικού.
Το 1996 η microsoft με το DX2, βγάζει ένα νέο τμήμα τού DirectX, το Direct3D το οποίο αρχίζει να έχει κάπως πιο προηγμένες δυνατότητες στα γραφικά. Ακόμα όμως δεν έχει καμμία σχέση με το OGL. Από εδώ και πέρα οι εκδόσεις τού DX μάς αφορούν αποκλειστικά γιατί έρχονται μαζί με νέες εκδόσεις τού D3D.
To 1998 μια εταιρεία, η Loki Software, άρχισε να εκδίδει μεγάλους τίτλους παιχνιδιών τής εποχής σε ένα νέο ανερχόμενο λειτουργικό το Linux. Η εταιρεία δυστυχώς χρεωκόπησε το 2001, αλλά μάς άφησε μια πολύ σημαντική κληρονομιά, τo Simple DirectMedia Layer (SDL). Η SDL επιτρέπει να κάνει κάποιος αυτά που θα έκανε με το DX αλλά ο κώδικας είναι πολύ ωραιότερος και εύκολα συντηρήσιμος και εντελώς ανεξάρτητος από την πλατφόρμα. Δεν διαθέτει η ίδια προηγμένα γραφικά αλλά κάποιος μπορεί απλά να την συνδυάσει με το D3D ή το OGL. Για παράδειγμα αν κάποιος θέλει να μεταφέρει το παιχνίδι του στο Linux η πρώτη δουλειά είναι να μετατρέψει το DX σε SDL, το οποίο θα τού δώσει έναν πολύ πιο συντηρίσιμο κώδικα που δουλεύει σε όλες τις πλατφόρμες και αυτό χωρίς κανένα απολύτος κόστος σε επιδόσεις. Η δεύτερη δουλειά είναι να μεταφράσει το D3D σε OGL (ή όποιο άλλο API) και δεν χρειάζεται καν να διώξει το D3D αλλά μπορούν να μείνουν και τα δυο ως επιλογή ώστε να χρησιμοποιείται ανάλογα με την πλατφόρμα όποιο είναι διαθέσιμο ή όποιο αποδίδει καλύτερα. Σε αυτό το σημείο έχει κάνει σχεδόν όλη την δουλειά χωρίς καν να χρειαστεί να αφήσει την συνηθισμένη του πλατφόρμα. Η Loki μπορεί να χρεωκόπησε αλλά η SDL ως ελεύθερο λογισμικό συνέχισε να συντηρείται και να αναπτύσσεται από την κοινότητα τού ελεύθερου λογισμικού.
Τα χαρακτηριστικά τής OGL ήταν γενικά χαρακτηριστικά χρήσιμα για τούς προγραμματιστές οπότε και ήταν χαρακτηριστικά που προσπαθούσαν να υλοποιήσουν οι κάρτες γραφικών. Το ορόσημο σε αυτήν την σύγκλιση ήταν το 1999 με το DX7 και την GeForce 256. To D3D7 εξακολουθούσε ακόμα να θεωρείται κατώτερο από την OGL αλλά όπως φαίνεται πλέον OGL, D3D και κάρτες γραφικών έχουν τούς ίδιους σχεδόν σκοπούς και συγκλίνουν. Η microsoft συνέχισε να εξελίσσει το API της και γενικά το D3D8 θεωρήθηκε πλέον εξίσου καλό με την τότε OGL. Εξ' άλλου η microsoft έχοντας ουσιαστικά όλη την αγορά είχε καταφέρει να πείσει ότι το δικό της API είναι το στάνταρ. Επίσης τo 2000 τον έλεγχο τής OpenGL τον ανέλαβε η κοινοπραξία Khronos.
Η τελική «ανατροπή» συνέβη το 2002 με το DX9. To DX9 ήταν μια μεγάλη τεχνολογική αναβάθμιση και συνοδευόταν από την HLSL. Ουσιαστικά πλέον το D3D όχι απλώς ήταν το de facto στάνταρ και τεχνολογικά ισοδύναμο αλλά ήταν τεχνολογικά μπροστά από την OGL.
Η Khronos προχώρησε σε μια νέα σειρά εδόσεων API που σκόπευαν στην ενεργειακή απόδοση, το OpenGL ES, η οποία τρέχει σήμερα παντού συμπεριλαμβανομένων τών Android και iOS και ουσιαστικά κατά μία έννοια είναι το ευρύτερα διαδεδομένο API. Τελικά απάντησε στο D3D9 με την OGL2 το 2004 και το αντίστοιχο στην HLSL είναι η GLSL.
Καθώς περνούσαν τα χρόνια τα API είχαν αρχίσει να αποκτούν ένα πρόβλημα. Επειδή ήταν τόσο υψηλού επιπέδου (η μεν OGL επειδή αυτός ήταν και ο αρχικός της σκοπός, το δε D3D επειδή έπρεπε να υλοποιείται από διαφορετικές κάρτες γραφικών είχε συγκλίνει σε αυτό) οι οδηγοί είχαν αρχίσει να είναι υπερβολικά σύνθετοι. Πολύ χειρότερα, μέσα στούς οδηγούς είχαν αρχίσει να μπαίνουν ειδικές βελτιστοποιήσεις που αφορούσαν συγκεκριμένα παιχνίδια συχνά παραβιάζοντας το ίδιο το πρότυπο που υποτίθεται υλοποιούσαν. Η κοινή λογική λέει ότι τέτοιες ειδικές βελτιστοποιήσεις θα έπρεπε να βρίσκονται στην userland και όχι στον driver. Όλο αυτό προκάλεσε χάος στο D3D αλλά τα πράγματα ήταν κατά μία έννοια ακόμα χειρότερα στην OGL τουλάχιστον για τα παιχνίδια. Τέτοιου είδους βελτιστοιποιήσεις φτιάχνονταν για κάθε παιχνίδι για το D3D που ήταν το στάνταρ και χάρις σε αυτές τα παιχνίδια τρέχαν ταχύτερα το οποίο έφερνε ακόμα περισσότερα παιχνίδια στο D3D το οποίο με την σειρά κατέστρεφε ακόμα περισσότερο το D3D. Ουσιαστικά οι δημιουργοί παιχνιδιών για να βελτιστοποιήσουν την απόδοση τών παιχνιδιών αντί να κάνουν δουλειά που έχει σχέση με τον τρόπο που είναι αποδοτικές οι κάρτες γραφικών, έψαχναν να τριγκάρουν τέτοια χαρακτηριστικά εμποτισμένα μέσα στούς οδηγούς. Δηλαδή ο «λάθος» τρόπος προγραμματισμού ήταν αυτός που απέδιδε καλύτερα σε σχέση με τον «σωστό» και το γεγονός ότι ελάχιστα παιχνίδια υποστήριζαν OGL σήμαινε ότι τέτοιου είδους βελτιστοποιήσεις είναι πιο σπάνιες και άρα η OGL ήταν λιγότερο ελκυστική για παιχνίδια, οπότε αυτή η ανατροφοδότηση έκανε απόλυτο αδιαφιλονίκητο στάνταρ το D3D ενώ ταυτοχρόνως δημιούργησε σοβαρό πρόβλημα και στο D3D και στο OGL.
Και η microsoft και η khronos άρχισαν να σχεδιάζουν την επόμενη έκδοση API με βασικό στόχο να λύσουν το παραπάνω πρόβλημα. Και οι δυο θα αποτύχουν. Η Khronos θα αποτύχει ακόμα χειρότερα από την microsoft.
Το 2006 η microsoft μαζί με τα νέα Windows Vista θα βγάλει και την επόμενη έκδοση API, το DX10. Είναι σαφώς μια βελτίωση σε σχέση με το χάος τού DX9 αλλά σπάει την συμβατότητα μεταξύ παλιού και νέου API. Επιπλέον το νέο API υποστηρίζει αποκλειστικά τα Vista. Επιπλέον δεν πρόκειται για την μεγάλη τεχνολογική αναβάθμιση που υποστηρίζει η microsoft και οπωσδήποτε δεν έλυνε ουσιαστικά το μεγάλο πρόβλημα αλλά απλώς ήταν ένα κάπως καλύτερο API που όμως δεν μπορούσε να πετύχει εμπορικά χωρίς ανάλογη επιτυχία τών Vista αφού τα είχαν ως απέτηση και τα Vista απέτυχαν.
Για έναν συνήθη παρατηρητή η χειρότερη στιγμή για την OpenGL ήταν στα τέλη τής δεκαετίας τού 2000. Το D3D έκλεινε μια δεκαετία υπεροχής ως το στάνταρ API στα παιχνίδια, η microsoft έβγαζε την νέα έκδοση DX11 μαζί με τα Windows 7 ενώ το OGL είχε ασθμαίνοντας, επίσης χωρίς να λύσει το γνωστό πρόβλημα, ακολουθήσει το D3D10 με την OGL3. Αν και η αποτυχία τών Vista έδωσε τεράστια ανάσα η Khronos απέτυχε απολύτως να το ελμεταλευτεί. Στην Khronos αναγνωρίζεται ως επιτυχία το OpenGL ES το οποίο και με τα iOS/Android είχε αρχίσει να απογειώνεται αλλά το κλίμα για την OGL ήταν απίστευτα αρνητικό. Το ακόλουθο άρθρο είναι εντελώς ανόητο στην εκτίμησή του, αποτυπώνει όμως το κλίμα τής εποχής: http://www.tomshardware.com/reviews/opengl-directx,2019.html
Προσωπικά όπως ανέφερα στην προ-προηγούμενη ανάρτησή μου, ήδη είχα περάσει στο λίνουξ ως αποκλειστικό λειτουργικό. Και η γνώμη μου θα ήταν ήδη εντελώς διαφορετική. Έβλεπα για πρώτη φορά τα «ουσιαστικά» προβλήματα να είναι λυμμένα και την σκακιέρα έτοιμη στημένη για την μάχη. Επιπλέον εκτός από την καλή κατάσταση τού λίνουξ, οι mac είχαν ήδη αρχίσει να γίνονται δημοφιλείς (οι οποίοι επίσης βασίζονται στο OGL) και χάρις στην επιτυχία τής OGL ES η GLSL άρχιζε να γίνεται εξίσου σημαντική με την HLSL. Όχι μόνο δεν ήμασταν στο τέλος τής μάχης αλλά στην πραγματικότητα ακριβώς στην αρχή.
Για αρχή η OGL4 ήρθε ως τεχνολογική απάντηση στο DX11. Επίσης το διαδίκτυο συνέχισε να αναπτύσσεται χωρίς να δεσμεύεται από τα windows (ιδιαιτέρως με την ανάπτυξη τού HTML5 αλλά και χάρις στούς φυλλομετρητές firefox και chrome). Στην ανάπτυξη τού ανεξάρτητου από λειτουργικό διαδίκτυο η khronos βγάζει και το WebGL στο οποίο όμως φαίνεται δεν έχουμε «πόλεμο» (ψυχρό ή θερμό) αφού συμμετέχει και η microsoft. Τα εμπορικά παιχνίδια σε λίνουξ και mac αρχίζουν να πληθαίνουν και η Valve βγάζει την υπηρεσία της steam σε mac (2010) και σε λίνουξ (2013). Επίσης έχουμε και μια νέα μεγάλη έκδοση τής SDL, την SDL2 όπως φαίνεται με δάκτυλο τής Valve.
Αν και οι νέες εκδόσεις DX και OGL βελτιώνουν την κατάσταση δεν λύνουν ουσιαστικά το κυρίως πρόβλημα. Για μια ριζική λύση χρειάζεται ένα νέο API. Μια νέα προσέγγιση είναι αναγκαία και η αλήθεια είναι ότι όλο και περισσότερο φαίνεται ότι είναι ο κατάλληλος καιρός. Είναι ο κατάλληλος καιρός γιατί από τότε που βγήκε το D3D11 οι κάρτες γραφικών έχουν μείνει ουσιαστικά στάσιμες σε χαρακτηριστικά. Γίνονται καλύτερες σε αυτό που κάνουν αλλά δεν κάνουν κάτι διαφορετικό. Ο σχεδιαστής ενός νέου API βρίσκεται σε θέση ισχύως σε σχέση με την δεκαετία τού 1990 όπου κανείς δεν είχε καμμία απολύτως ιδέα πώς θα μοιάζουν οι κάρτες γραφικών στο μέλλον ή ακόμα και σε σχέση με την δεκαετία τού 2000 όπου ακόμα δεν είχαν μπει οι τελικές πινελιές. Από την τελευταία γενιά API τα πράγματα έχουν μείνει σταθερά και επιπλέον οι κάρτες γραφικών ακόμα και διαφορετικών εταιρειών έχουν συγκλίνει τόσο ώστε να είναι η κατάλληλη στιγμή για ένα νέο API «κοντύτερα στο μέταλλο».
Η αρχή πιστεύω ότι ήταν μια φήμη που κάπου διάβασα για την AMD. Δεν συγκράτησα πού γιατί εξάλλου δεν έδωσα μεγάλη σημασία τότε. Η AMD σκόπευε λέει να βγάλει ανοικτούς οδηγούς που θα χειρίζονται τελείως άμεσα στο υλικό της και οι οποίοι θα μπορούν να ενσωματωθούν απευθείας μέσα στον πυρήνα τού Linux. Η δε OpenGL και όλες οι ανοησίες που συσσορεύονταν μέσα στους οδηγούς της θα πέρναγαν στο userspace. Αν και δεν έδωσα μεγάλη σημασία από την άποψη ότι δεν το θεώρησα αξιόπιστο (πολύ καλό για να είναι αληθινό) μού έκανε εντύπωση από την άποψη ότι κάποιος έστω και σαν φήμι έλεγε αυτό που εμφανώς έπρεπε να γίνει.
Τελικά δεν έγινε αυτό ακριβώς έγινε όμως κάτι άλλο που από αρκετές απόψεις είναι πολύ παρόμοιο. Η AMD έβγαλε το Mantle. Ένα νέο API που αφορούσε τις δικές της κάρτες γραφικών με καινοτόμα προσέγγιση και «κοντύτερα στο μέταλλο». Δεν το άνοιξε όμως, και το έβγαλε μόνο για Windows. Αυτό περιόρισε πολύ την χρησιμότητά του. Ωστόσο αυτό έδωσε σήμα τόσο στην Khronos όσο και στην Microsoft να προχωρήσουν προς την ίδια κατεύθυνση. Η μεν Khronos άρχιζε να επεξεργάζεται την ιδέα ενός ολότερα καινούργιου API (όχι OpenGL 5) παρόμοιου με το mantle που τότε λεγόταν glnext και η δε microsoft άρχισε να δουλεύει προς ένα καινούργιο παρόμοιο με το mantle API που θα το έλεγε απλά DX12. Τελικά στην GDC τού 2015 ανακοινώθηκε ότι η AMD έχει δωρίσει την δουλειά για το Mantle στην Khronos ως βάση για εκκίνηση και το νέο API τής Khronos μετονομάστηκε σε Vulkan και έχει ήδη αρχίσει να προχωράει πολύ ταχύτερα. Μάλιστα η Valve παρουσίασε και ένα βίντεο dota2 να παίζει σε πειραματικούς Vulkan σε intel APU. To 2015 η microsoft έβγαλε τα windows 10 και το dx12 και η Apple αν και αρχικά φαίνεται συμμετείχε στον Vulkan, αποχώρησε και έβγαλε το δικό της νέας γενιάς API, το Metal.
Τελικά η πρώτη έκδοση Vulkan βγήκε στις 16 φεβρουαρίου 2016 (καθώς έγραφα αυτό το κείμενο ανακοινώθηκε!). Η κοινότητα των γραφικών ακόμα και στα πλαίσια τής Khronos ήταν πάντα απελπιστικά κλειστή. Δεν έχει γίνει ακόμα όσο ανοικτή θα θέλαμε αλλά είναι ένα τεράστιο βήμα προς τα μπρος καθώς είναι με τεράστια διαφορά η πιο ομαδική δουλειά που έχει γίνει στο θέμα αυτό στην ιστορία. Επίσης πάρα πολλά από τα βασικά εργαλεία είναι ανοικτού κώδικα και περιμένουμε τούς οδηγούς για την intel να είναι επίσης ανοικτού κώδικα ενώ και η AMD έχει υποσχεθεί ότι κάποια στιγμή στο μέλλον θα ανοίξει τον κώδικά της. Είναι ακόμα η πρώτη φορά εδώ και πάρα πολλά χρόνια που υπάρχει σοβαρό κτύπημα στα θεμέλεια αυτού τού μονοπωλείου.
http://mirror.as35701.net/video.fosdem.org/2016/k1105/vulkan-in-open-source.mp4
When you subscribe to the blog, we will send you an e-mail when there are new updates on the site so you wouldn't miss them.
Comments