Aufbau
Interprex ist eine native SwiftUI-Anwendung für macOS. Sie erfindet nichts neu, sondern richtet bewährte freie Software so ein, dass sie ohne Handarbeit funktioniert:
| Schicht | Was | Woher |
|---|---|---|
| Oberfläche | Interprex (SwiftUI, arm64, Hardened Runtime) | dieses Projekt |
| Windows-Schnittstellen | Wine (CrossOver-Zweig) | winecx-dist, aus CodeWeavers-Quellen |
| DirectX → Metal | wined3d ab Werk, optional D3DMetal | Wine bzw. Apple GPTK |
| x86 → ARM | Rosetta 2 | macOS |
| Spieleplattform | Steam-Client für Windows | Valve, zur Laufzeit geladen |
Wine ist kein Emulator
Ein Emulator ahmt fremde Hardware nach. Wine tut etwas anderes: Es implementiert die Windows-Schnittstellen neu. Ruft ein Spiel eine Windows-Funktion auf, landet der Aufruf bei Wines eigener Umsetzung, die ihn auf macOS-Aufrufe abbildet.
Daraus folgt zweierlei: Du brauchst keine Windows-Lizenz, und es gibt keinen Emulations-Aufschlag auf jede Instruktion. Wine steht unter der LGPL 2.1; Interprex liefert es unverändert aus. Quellen und Lizenztexte stehen unter Lizenzen.
DirectX auf Metal
Zwei Wege, die Interprex unterstützt:
| wined3d (ab Werk) | D3DMetal (optional) | |
|---|---|---|
| Herkunft | Teil von Wine | Apple Game Porting Toolkit |
| Weg | DirectX → OpenGL → Metal | DirectX → Metal direkt |
| Geschwindigkeit | läuft überall, deutlich langsamer | erheblich schneller, besonders DirectX 12 |
| Mitgeliefert | ja | nein — Evaluierungslizenz, Eigenimport nötig |
DXVK ist keine Alternative, auch wenn es unter Linux der Standardweg
ist. Getestet mit DXVK 3.0.2 und dem macOS-Zweig 1.10.3: Beide scheitern schon bei der
Geräteerstellung mit
Device does not support required feature 'geometryShader'. Metal hat keine
Geometry-Shader-Stufe, MoltenVK kann sie deshalb nicht melden, und DirectX verlangt sie
ab Feature-Level 10_0. Das ist keine Konfigurationsfrage.
Wie Interprex den Übersetzer wählt
Die folgenreichste Entscheidung bei einem Spielstart ist, welche DirectX-Fassung benutzt wird. DirectX 12 gibt dem Übersetzer vorbereitete Befehlslisten und feste Ressourcenbindungen; das lässt sich fast direkt auf Metal abbilden und über mehrere Kerne verteilen. DirectX 11 verlangt dagegen einen Treiber, der Zustände nachverfolgt und Ressourcen zur Laufzeit auflöst — und das läuft im Wesentlichen auf einem Kern.
Trotzdem ist „immer 12“ falsch, und der Grund liegt nicht in der API: Viele Engines liefern ihren DirectX-12-Pfad ungetestet aus. Interprex entscheidet deshalb nach Engine, nicht nach API-Verfügbarkeit — und liest die Engine aus den Dateien des Spiels, statt sie am Ordnernamen zu raten. Dafür wird die Importtabelle der Programmdatei ausgelesen (was fest gebunden ist) und ihr Datenbestand durchsucht (was zur Laufzeit geladen wird).
| Engine | Gewählt | Warum |
|---|---|---|
| Unreal Engine 5 | DirectX 12 | Nanite und Lumen brauchen Shader-Modell 6; der DirectX-11-Pfad wird meist nicht mehr mitgeliefert |
| Unreal Engine 4 | DirectX 11 | gepflegt und erprobt; DirectX 12 im Profil „Experimentell“, wenn die CPU limitiert |
| Unity | DirectX 11 | Unitys DirectX-12-Backend ist bis heute als experimentell ausgewiesen |
| id Tech 6/7 | Vulkan | hat keinen DirectX-Pfad — läuft über MoltenVK |
| Source | DirectX 9 | keine Wahl; D3DMetal deckt erst ab DirectX 10 ab, deshalb Wines eigener Weg |
Erkannt werden außerdem die Startdatei (bei Unreal die Shipping-Datei, die die VC++-Abfrage des Launchers überspringt), passende Startargumente und der Anti-Cheat, falls einer dabei ist. Was Interprex für ein Spiel entschieden hat, steht in der App unter dem Schieberegler an der Spielkachel — mit Begründung, und jede Zeile ist überschreibbar.
DLSS wird zu MetalFX
Apples D3DMetal enthält eine vollständige Brücke zu NVIDIAs NGX-Schnittstelle. Ruft ein Spiel DLSS auf, landet der Aufruf auf Apples MetalFX:
| Das Spiel fragt nach | Interprex liefert |
|---|---|
| DLSS Super Resolution | MetalFX-Upscaling |
| DLSS Frame Generation | MetalFX-Zwischenbilder |
| DLSS Ray Reconstruction | MetalFX-Entrauschen |
Es gibt dabei eine Hürde: Spiele schalten ihre DLSS-Optionen anhand des Grafikkarten-Herstellers frei. Wer keine NVIDIA-Karte findet, zeigt das Menü gar nicht an — und damit bleibt genau der Weg verschlossen, der auf einem Mac am meisten bringt. Interprex meldet deshalb eine GeForce RTX, aber nur, wenn das Spiel die DLSS-Bibliotheken tatsächlich mitbringt und die Übersetzung über D3DMetal läuft. Ohne diese Bedingungen wäre die Angabe eine Lüge ohne Gegenwert, und jede Lüge gegenüber dem Spiel ist ein Risiko.
Warum 60 Bilder flüssiger sein können als 100
Ein Bildschirm zeigt neue Bilder nur zu festen Zeitpunkten. Ein 120-Hz-Panel hat alle 8,33 ms ein Zeitfenster. Liefert das Spiel 100 Bilder pro Sekunde, ist jedes Bild 10 ms alt — und weil 10 nicht in 8,33 passt, wird ein Bild ein Fenster lang gehalten und das nächste zwei. Bei genau 60 Bildern (= 120 ÷ 2) trifft jedes Bild zwei Fenster, immer.
60 wirkt also flüssiger als 100. Das ist keine Geschmacksfrage, sondern Arithmetik. Deshalb rastet der Bildraten-Schieberegler in Interprex auf die echten Teiler der Bildwiederholrate ein und zeigt sie unter der Bahn an; und deshalb wählen die Energiemodi ihren Deckel aus dieser Leiter statt eine runde Zahl zu rechnen.
| Bildschirm | Gleichmäßige Bildraten |
|---|---|
| 60 Hz | 30, 60 |
| 120 Hz | 24, 30, 40, 60, 120 |
| 144 Hz | 24, 36, 48, 72, 144 |
| 240 Hz | 24, 30, 40, 48, 60, 80, 120, 240 |
Stellt man einen Wert ein, der nicht dazugehört, bekommt man ihn — mit dem Hinweis, dass er nicht in den Takt passt, und den beiden nächsten Werten, die es täten. Über mehrere Sitzungen lernt Interprex zusätzlich, welchen Deckel ein Spiel auf diesem Mac wirklich hält: Läuft die Grafikeinheit in mehr als einem Fünftel der Zeit am Anschlag, geht der Deckel beim nächsten Start eine Stufe herunter; bleibt durchgehend Luft, eine Stufe herauf.
Was ein Deckel an Laufzeit bringt
Interprex liest die tatsächliche Leistungsaufnahme des Geräts aus — in Watt, im Sekundentakt, ohne Administratorrechte. Daraus und aus dem Verbrauch ohne Spiel ergibt sich, was ein Bildratendeckel bringt: Der Verbrauch zerfällt in einen festen Anteil (Bildschirm, Speicher, Systemgrundlast) und einen bildabhängigen. Halbiert man die Bildrate, halbiert sich nur der zweite Teil.
Die halbe Bildrate ist deshalb nicht die doppelte Laufzeit — und genau das erwarten die meisten. Die App zeigt die Reichweite je Bildrate als Balken, gerechnet aus gemessenen Werten dieses Spiels auf diesem Gerät, nicht aus einer Faustregel.
Warum die Bildrate niedriger ist als unter Windows
Der Spielcode selbst ist für x86-Prozessoren übersetzt und läuft über Rosetta 2 auf dem ARM-Chip. Diese Übersetzung kostet Rechenzeit auf der CPU — und bei vielen Spielen liegt dort der Flaschenhals, nicht bei der Grafik.
Das ist der Grund, warum Interprex eine Leistungsanzeige mit Flaschenhals-Einschätzung hat statt eines bloßen Bildratenzählers. Die beiden Fälle verlangen genau entgegengesetzte Maßnahmen:
| Messung | Heißt | Was hilft |
|---|---|---|
| GPU über 85 % | Grafikgrenze | Auflösung senken, Upscaling an, Schatten reduzieren |
| GPU unter 60 %, mehrere Kerne ausgelastet | CPU-/Rosetta-Grenze | Sichtweite, Physik und Objektdichte senken — Auflösung bringt nichts |
Deshalb kann ein Spiel bei niedrigerer Auflösung gleich langsam bleiben: Wenn die CPU limitiert, ändert weniger Auflösung schlicht nichts.
Energiemodi
Interprex setzt Bildratengrenze, Texturspeicher und Upscaling aus dem gewählten Modus — aber der Systemzustand überstimmt den Wunsch:
- Stromsparmodus des Systems an → effizient
- Wärmezustand kritisch → effizient
- Wärmezustand ernst und Modus „Volle Leistung“ → ausgewogen
- Akku unter 20 % → effizient
Der Eingriff in den Steam-Client
Steams Oberfläche ist ein eingebauter Chromium-Browser. Dessen Zeichenprozess läuft in einem eigenen Prozess und malt von dort in das Fenster des Hauptprozesses. Unter Wine geht das nicht: Ein Prozess kann nicht in das Fenster eines anderen Prozesses zeichnen. Alle Aufrufe melden Erfolg, die Pixel kommen nie an — das Fenster bleibt schwarz.
Interprex löst das, indem es dem Hilfsprogramm steamwebhelper.exe ein kleines
Startprogramm voranstellt, das den Schalter --in-process-gpu setzt. Die
Originaldatei bleibt daneben liegen und wird bei Bedarf automatisch zurückgespielt.
Warum Anti-Cheat nicht geht
Easy Anti-Cheat und BattlEye laden im Kernelmodus einen Windows-Treiber, um das laufende System zu überwachen. Wine implementiert Windows-Schnittstellen im Benutzermodus — es gibt keinen Windows-Kernel, in den sich ein solcher Treiber laden ließe.
Das lässt sich nicht durch Einstellungen, eine andere Wine-Fassung oder eine neuere macOS-Version umgehen. Selbst wenn es technisch ginge, würden die Hersteller es als Umgehungsversuch werten. Prüfe vor dem Kauf auf ProtonDB, ob ein Titel außerhalb von Windows läuft — die Linux-Bewertungen gelten sinngemäß.
Wo Interprex was ablegt
| Pfad | Inhalt |
|---|---|
~/Library/Application Support/Interprex/WineCX | Die Wine-Installation. Austauschbar gegen eine eigene Fassung. |
~/Library/Application Support/Interprex/Bottles | Die Windows-Umgebungen samt Steam und Spielen. |
~/Library/Application Support/Interprex/Logs | Ein Protokoll je Vorgang. Grundlage jeder Supportanfrage. |
~/Library/Preferences/com.hnbdev.Interprex.plist | Einstellungen, Zustimmungen, Unterstützer-Schlüssel. |
Welche Verbindungen Interprex aufbaut
| Ziel | Wann | Wozu |
|---|---|---|
github.com | Ersteinrichtung | Wine herunterladen |
cdn.akamai.steamstatic.com | Ersteinrichtung | Steam-Installationsprogramm |
interprex.de/appcast.json | höchstens täglich | Aktualisierungsprüfung (abschaltbar) |
interprex.de/sponsors.json | höchstens täglich | Anzeigenkarte (abschaltbar) |
interprex.de/api/ping | nur mit Einwilligung | anonyme Nutzungsstatistik (Standard: aus) |
interprex.de/config.json | höchstens alle 6 Stunden | Bezugsquellen und Hinweise (siehe unten) |
cdn.cloudflare.steamstatic.com | einmal je Spiel | Titelbild für die Bibliothek (abschaltbar) |
Mehr nicht. Kein Werbenetzwerk, keine Gerätekennung, kein Zählpixel — Einzelheiten in der Datenschutzerklärung. Vor deiner Zustimmung beim ersten Start baut Interprex keine dieser Verbindungen auf.
Warum die App eine Konfigurationsdatei lädt
Interprex hängt an Dingen, die anderen gehören: Wine-Fassungen auf GitHub, Steams Installationsprogramm, Bildadressen bei Valve. Zieht eine davon um oder geht kaputt, ist die App bei allen unbrauchbar — und ein Notfall-Release braucht Bauen, Signieren, Notarisieren und dann noch die Zeit, bis Leute es installieren.
Deshalb liest Interprex config.json von interprex.de: Dort stehen die
Bezugsquellen, Schalter für einzelne Bereiche und ein Feld für einen Hinweis in der App.
Damit daraus kein Weg wird, beliebigen Code nachzuladen, gelten drei Regeln, die
im Programm stehen und nicht in der Datei:
- Jede Adresse muss HTTPS sein.
- Download-Adressen müssen aus einer fest einkompilierten Liste von Hosts stammen. Die Datei kann diese Liste nicht erweitern.
- Was die Prüfung nicht besteht, wird verworfen; es gilt der eingebaute Wert.
Ohne Netzverbindung, ohne Datei oder bei fehlerhaftem Inhalt ändert sich schlicht nichts — die App ist ohne diese Datei vollständig funktionsfähig. Das ist die Bedingung, unter der so ein Mechanismus überhaupt vertretbar ist.
Diagnosebericht
Unter Diagnose → Technische Details steht alles, was für eine Supportanfrage nötig ist: Chip, Kerne, Arbeitsspeicher, macOS-Fassung, Grafikübersetzung, Energiemodus und Pfade. Ein Knopf kopiert das als Text.
Schick den Bericht zusammen mit dem Protokoll und dem Namen des Spiels an info@hnbdev.com.