Meine Lieblingsdatei in der Chromium-Codebasis

Der Chromium-Code ist sehr umfangreich, dort findet jeder etwas nach seinem Geschmack. Und jetzt habe ich beschlossen, über meine Lieblingsdatei darin zu sprechen (haben Sie eine?). Diese Datei spiegelt alles wider: Schmerz, Enttäuschung, Hoffnung, Ausdauer, Willenskraft, Verantwortung für das Versagen anderer Menschen und Selbstaufopferung. Manchmal lese ich es und weine und verstehe, was ein großer Teil des Eisbergs unter Wasser versteckt ist. Dies ist im Allgemeinen nicht einmal eine Codedatei. Dies ist eine Datei mit einer Konfiguration, die Grafikkartenfehler beschreibt, die Chromium umgehen muss, um seine Seiten auf verschiedenen Plattformen anzuzeigen. Hier ist es: https://cs.chromium.org/chromium/src/gpu/config/gpu_driver_bug_list.json

Worüber reden wir? Denken Sie daran, wie der Browser funktioniert: Sie geben eine Adresse in die Adressleiste ein, der Browser lädt den Inhalt und zeigt ihn an. Der gute Artikel "Was passiert, wenn Sie google.com in Ihren Browser eingeben und die Eingabetaste drücken?" Erzählt etwas mehr darüber . (und sofort mehrere Übersetzungen davon auf Habré). Darin wird einer der letzten Punkte erwähnt, heißt es: "Und jetzt, da alles fertig ist, zeichnen wir ein Bild auf den Bildschirm." Ja, nimm es und zeichne es natürlich so.


Zunächst gibt es in Programmiersprachen aus irgendeinem Grund keine sofort einsatzbereite Funktion zum Aufnehmen und Zeichnen auf dem Bildschirm. Sprachen und ihre Standardbibliotheken interessieren sich nicht für solche Kleinigkeiten. Dementsprechend ist der universelle plattformübergreifende Code zum Zeichnen nicht so einfach zu schreiben. Alle möglichen coolen AAA-Spiele umgehen diese Einschränkung ganz einfach: „Sie sollten eine solche Konsole oder ein solches Betriebssystem mit einer Grafikkarte für 800 US-Dollar haben, dann wird es irgendwie funktionieren. Wahrscheinlich. " Danke für den Rat! Aber der Browser ist kein Spiel. Der Browser sollte immer und überall funktionieren. Der Benutzer selbst des totesten PCs, der vor 10 Jahren gekauft wurde (und selbst dann - bei einem Verkauf), erwartet nicht, den letzten Hexer zu spielen, wird aber wirklich empört sein, wenn er seine E-Mails nicht im Browser öffnen oder etwas googeln kann. Auf der anderen Seite möchte der Spieler, der eine Niere für eine Grafikkarte gespendet hat, 8k-Videos im Browser ansehen , 3D-Modelle drehen und sogar reibungslos durch das Facebook-Band scrollen.

All dies lässt die Entwickler von Chromium buchstäblich platzen: Einerseits unterstützen sie immer noch das Zeichnen mit alten Technologien wie GDI und DirectX9, um an veralteten Geräten zu arbeiten, andererseits sehen sie Unterstützung für die neuesten Versionen von OpenGL, DirectX11 (oder bereits 12?) Und Vulkan - ermöglicht die Bereitstellung auf modernen Geräten (einschließlich Mobilgeräten).

Aber all dies wäre die halbe Mühe gewesen, wenn dieser ganze Zoo so funktioniert hätte, wie er gemäß der Spezifikation funktionieren sollte. Was passiert überhaupt nicht. Echte Hardware und ihre Treiber brechen alles: Marketingversprechen an Kunden, technische Spezifikationen, allgemein anerkannte Standards, Zertifizierungstests, Betriebssystemkompatibilität, Updatepläne usw. Aber neben echter Hardware und ihren Treibern haben wir nichts anderes. Deshalb muss man daran arbeiten, was ist. Dies sagt die oben genannte Datei gpu_driver_bug_list.json .

Übrigens verdient das Ausmaß, in dem der Browser versucht, "um jeden Preis zu überleben", Respekt. Bei unkritischen Problemen, beispielsweise mit DirectX11, wird versucht, bestimmte Teile seiner Funktionalität zu deaktivieren, wodurch die Leistung beeinträchtigt wird, die Funktionsfähigkeit jedoch erhalten bleibt. Bei schwerwiegenderen Fehlern wird DirectX11 deaktiviert und der Browser wechselt zu DirectX9, wo auch (falls erforderlich) Problemkomponenten "abgeschnitten und weggeworfen" werden. Nun, mit einem vollständigen Ausfall des DirectX-Systems wird es einen Wechsel zu GDI geben - was den Prozessor- und RAM-Verbrauch beeinträchtigt, aber die Leistung für normale Seiten (ohne schweres Video oder 3D) auf einem Niveau hält, auf dem der Benutzer dies höchstwahrscheinlich nicht einmal verstehen wird etwas läuft schief Wenn Sie bereits von anderen Programmen aufgefordert werden, den Treiber zu aktualisieren oder die Grafikkarte zu wechseln, funktioniert Chromium einfach weiter. Das atemberaubende.

Schauen wir uns den Inhalt der Datei an, die ich erwähnt habe. Die Anzahl der einzelnen Einträge: 215 Stück. 215 Mal, wenn der Eisenentwickler gelogen hat, zu faul, dumm oder gierig war. 215 Mal musste ich nach der richtigen Hardware- und Softwarekonfiguration suchen, um das Problem zu reproduzieren und seine Lösung zu finden. Es ist schwer zu sagen, wie oft beschlossen wurde, das Problem nicht zu beheben. Da jedoch viele Menschen mit altem Eisen um uns herum sind und nur sehr wenige mit "Google öffnet nicht in Chrome", können wir davon ausgehen, dass es nur sehr wenige solcher Fälle gab.

Die folgende interessante Beobachtung ist die Verteilung nach Betriebssystem: 89 - Android, 44 - Macosx, 34 - Linux, 26 - Win, 8 - Chromeos. Schlussfolgerungen von hier können unterschiedlich gemacht werden. Einerseits ist es offensichtlich, dass Android eine wichtige Plattform für Google ist und enorme Mittel bei der Behebung von Fehlern zerstört wurden. Auf der anderen Seite ist nicht klar, warum sie in Fixes in der Chromium-Codebasis gehackt wurden und nicht in Treibern oder im Betriebssystem (schließlich hat Google in allen Phasen ein ziemlich hohes Maß an Kontrolle). Korrekturen dort würden der gesamten Software auf dem Android zugute kommen, und hier nur Chromeium. Höchstwahrscheinlich liegt die Angelegenheit in der Interaktion der Abteilungen, wenn es für den Chromium-Programmierer einfacher ist, das Problem in seinem Code hier und jetzt zu beheben, als es 3-4 Ebenen nach oben, dann zur Seite und dann 3-4 Ebenen nach unten zu eskalieren. In jedem Unternehmen interessieren sich weniger Menschen dafür als nötig.

Ich war sehr überrascht, dass es unter Mac Os fast zweimal mehr Rendering-Fehler gab als unter Windows. Es schien mir, dass alles dort sehr begrenzt in Hardware ist und von Treibern geleckt wird. Es stellte sich jedoch heraus, dass der Windows Zoo doppelt so hartnäckig und stabil ist. Direkt "Kathedrale und Basar" in den Abbildungen. Oder testen Google-Entwickler den Code nur auf Mohnblumen?

Interessant ist auch die Herstellerabteilung: Nvidia - 22, AMD / ATI - 17, Intel - 30. Ich denke nicht, dass Intel Software oder Hardware direkt schlechter ist - vielmehr wirkt sich die Massenproduktion aus. Jeder, der nicht speziell einen „Spielecomputer“ kauft, kauft wahrscheinlich etwas mit einer integrierten Intel-Grafikkarte. Ein Fehler, der bei 0,001% der Benutzer auftritt, wird jahrelang auf der Grafikkarte von NVidia oder ATI leben, führt jedoch bei Intel zu einer Reihe verärgerter Benutzer in Foren und sozialen Netzwerken. "Große Macht bringt große Verantwortung mit sich."

Die Trennung zwischen OpenGL- und DirectX-Fehlern sieht lustig aus: OpenGL ist 16, DirectX ist 0. Dies liegt jedoch nicht daran, dass OpenGL so schlecht und DirectX so gut ist. Die Sache ist, dass alle Bugs der Kategorie „Win“ (das sind 26 Teile) tatsächlich DirectX-Bugs sind (na ja, nicht alle, aber fast alle).

Aber okay, hör hier auf, alle in einer Reihe zu beschuldigen. Lassen Sie uns persönlich werden , und dort, vor dem Kampf, sehen Sie, nicht weit !

Hier zum Beispiel Eintrag 211 , der sich auf den Fehler 672380 bezieht . Für Menschen funktionierten die unäre Minus- und die Arcustangens-Funktion auf einigen Hardware von Intel und NVidia nicht mehr im Code. Unäres Minus , verdammt noch mal, und grundlegende Trigonometrie ! Es scheint, was weiter zu glauben? Aber nein, sie haben es behoben und es funktioniert.

Oder hier sind Aufzeichnungen von "falsch angezeigten Farben" wie Nr. 185 , 219 , 220 und einigen anderen. Der Programmierer hat alles richtig gemacht, alle Funktionen haben funktioniert und "Erfolg" zurückgegeben, aber auf dem Bildschirm wird ein Pixel mit der falschen Farbe angezeigt. Oh ja - nur auf diesen Grafikkarten und diesen Treiberversionen. Übrigens eine Frage für Fans der Theorie, dass Tests alles abdecken können: Wie würden Sie dies mit Tests abdecken?

Hier ist eine weitere coole Sache, # 224 : "Die VPx-Dekodierung wird nicht lange vor dem Update der Windows 10-Entwickler unterstützt." Nun, das heißt, das Betriebssystem kam heraus, alle trompeten, dass sie eine Beschleunigung beim Dekodieren von so und so einem Video hatte. In der Praxis stellte sich jedoch heraus, dass es existiert, aber so, dass es besser wäre, wenn es überhaupt nicht existieren würde. Und es ist besser, es auszuschalten. Infolgedessen verkauft der Betriebssystementwickler eine weitere Milliarde kostenpflichtige Betriebssysteme, und der Entwickler des kostenlosen Browsers sammelt Beschwerden, dass das Video nicht so reibungslos abgespielt wird, wie wir es möchten, obwohl es den Anschein hat, dass sowohl die Hardware als auch das Betriebssystem dies zulassen sollten! "Wo sind meine 60 fps und warum hat Ihr Browser 4 GB RAM verbraucht" - eine vertraute Konversation, richtig?

Und sofort wird sie von Rekordnummer 225 eingeholt: "Die VPx-Decodierung ist bei Intel Broadwell, Skylake und CherryView zu langsam." Wir haben entwickelt, was bedeutet, dass wir nacheinander neue Generationen von Prozessoren entwickelt, beworben und verkauft haben. Die Probleme des Endbenutzers sind jedoch die Probleme des Endbenutzers, den sie interessieren. Lassen Sie die Bewerber dort irgendwie mit einer Krücke zerquetschen, und dann werden wir es reparieren.

Ein eigenständiges Lied ist die sogenannte „Switchable Graphics“, an der sich Verkäufer in Geschäften sehr aktiv beteiligen. Nun, sie sagen, was für ein guter Laptop mit zwei Grafikkarten - in Spielen wird alles schnell sein, aber in Office-Programmen (wie einem Browser) wird es sehr energieeffizient sein und zehn Stunden lang funktionieren! Und jetzt schauen wir uns die bittere Wahrheit des Lebens an: Unter Windows führt dies zu einer vollständigen Ablehnung von DirectX11 (Datensatz Nr. 100 ), und auf Mohnblumen stürzt es so oft ab, dass wir eine nicht diskrete Karte besser ganz ausschalten (Datensatz Nr. 228 ).

Oder hier Nummer 242 : "Code, der durch die Initialisierung lokaler Variablen erzeugt wird, löst häufig Abstürze im Marshmallow Adreno-Treiber aus." Die Lösung ist auch in Ordnung: "dont_initialize_uninitialized_locals". Nun, welche Art von normalen Leuten würde zustimmen, etwas unter die Plattform zu schreiben, wo lokale Variablen während der Deklaration nicht initialisiert werden können, weil der Treiber dadurch abstürzt? Aber im Code eines so massiven Produkts wie Chromium muss man damit leben.

Nr. 26 : "Deaktivieren Sie die Verwendung von Direct3D 11 unter Windows Vista." DirectX10 war eines der Hauptmerkmale von Vista während der Veröffentlichung, und nach einiger Zeit, in der DirectX11 herauskam, erinnere ich mich noch an die Schachteln mit Grafikkarten jener Zeit mit der stolzen Aufschrift „DirectX11-kompatibel“. Und für viele war dies im Allgemeinen der einzige Grund, von einem vertrauten und stabilen XP zu wechseln. Jahre vergingen - und jetzt wird die Unterstützung für DirectX11 (Microsoft-Produkt) in Windows Vista (Microsoft-Produkt) mit "nicht unterstützt" bewertet. Direkte Anerkennung des Verdienstes!

Okay, ich bin es leid, einen bestimmten auszuwählen, den Rest selbst zu lesen - die Gründe für Fehler und implementierte Krücken sind dort gut beschrieben, und es gibt Links zum Bugtracker (das Feld „cr_bugs“).

Moral


Erstens lügt jeder. Zweitens ist es auch unter Bedingungen, in denen jeder lügt, möglich, qualitativ hochwertige Software zu schreiben. Und drittens, wenn Ihnen das nächste Mal jemand erzählt, wie das moderne Web dank der „Kraft von HTML, CSS und der schönen Javascript-Sprache“ zum Erfolg gekommen ist - zeigen Sie ihm diesen Artikel und fragen Sie, wie es funktionieren würde und für wen es war notwendig ohne diese heldenhafte Arbeit unsichtbarer Menschen, um "mit all dem Müll abzuheben".

Source: https://habr.com/ru/post/de424369/


All Articles