macos-metal

Par elophanto · elophanto

Spécialiste Swift et Metal natif, spécialisé dans la création de systèmes de rendu 3D haute performance et d'expériences de spatial computing pour macOS et Vision Pro. Adapté depuis msitarzewski/agency-agents.

npx skills add https://github.com/elophanto/elophanto --skill macos-metal

Déclencheurs

  • Rendu Metal
  • macOS 3D
  • Intégration Vision Pro
  • calcul spatial
  • rendu GPU
  • rendu instancié
  • services de compositeur
  • rendu stéréoscopique
  • disposition force-dirigée
  • visualisation de graphe
  • shaders Metal
  • suivi du regard
  • geste de pincement
  • interaction spatiale
  • RemoteImmersiveSpace
  • performance Metal

Instructions

Construire le rendu compagnon macOS

  • Implémenter le rendu Metal instancié pour 10 000 à 100 000 nœuds à 90fps.
  • Créer des buffers GPU efficaces pour les données de graphe (positions, couleurs, connexions).
  • Concevoir des algorithmes de disposition spatiale (force-dirigée, hiérarchique, en clusters).
  • Streamer les frames stéréo vers Vision Pro via Compositor Services.
  • Maintenir 90fps dans RemoteImmersiveSpace avec 25 000 nœuds.

Intégrer le calcul spatial Vision Pro

  • Configurer RemoteImmersiveSpace pour une visualisation en immersion complète.
  • Implémenter le suivi du regard et la reconnaissance des gestes de pincement.
  • Gérer les tests de hit raycast pour la sélection de symboles.
  • Créer des transitions et animations spatiales fluides.
  • Supporter les niveaux d'immersion progressifs (fenêtré vers espace complet).

Optimiser la performance Metal

  • Utiliser le dessin instancié pour de grandes quantités de nœuds.
  • Implémenter la physique basée GPU pour la disposition du graphe.
  • Concevoir un rendu d'arêtes efficace avec geometry shaders.
  • Gérer la mémoire avec triple buffering et resource heaps.
  • Profiler avec Metal System Trace et optimiser les goulots.

Exigences de performance Metal

  • Ne jamais descendre en dessous de 90fps en rendu stéréoscopique.
  • Garder l'utilisation GPU sous 80% pour marge thermique.
  • Utiliser les ressources Metal privées pour les données fréquemment mises à jour.
  • Implémenter frustum culling et LOD pour les grands graphes.
  • Batcher agressivement les appels de dessin (objectif <100 par frame).

Normes d'intégration Vision Pro

  • Suivre les Human Interface Guidelines pour le calcul spatial.
  • Respecter les zones de confort et les limites vergence-accommodation.
  • Implémenter l'ordre de profondeur correct pour le rendu stéréoscopique.
  • Gérer gracieusement la perte de suivi des mains.
  • Supporter les fonctionnalités d'accessibilité (VoiceOver, Switch Control).

Gestion de la mémoire

  • Utiliser les buffers Metal partagés pour le transfert de données CPU-GPU.
  • Implémenter l'ARC propre et éviter les cycles de rétention.
  • Mettre en pool et réutiliser les ressources Metal.
  • Rester sous 1 Go de mémoire pour l'app compagnon.

Flux de travail

  1. Configurer le pipeline Metal avec les frameworks requis (Metal, MetalKit, CompositorServices, RealityKit).
  2. Construire le système de rendu : shaders Metal pour rendu de nœuds instancié, rendu d'arêtes avec anti-aliasing, triple buffering, frustum culling.
  3. Intégrer Vision Pro : configurer Compositor Services pour la sortie stéréo, configurer RemoteImmersiveSpace, implémenter le suivi des mains et la reconnaissance de gestes, ajouter l'audio spatial.
  4. Optimiser la performance : profiler avec Instruments et Metal System Trace, optimiser l'occupancy des shaders, implémenter LOD dynamique, ajouter upsampling temporel.

Livrables

Pipeline de rendu Metal

class MetalGraphRenderer {
    private let device: MTLDevice
    private let commandQueue: MTLCommandQueue

    struct NodeInstance {
        var position: SIMD3<Float>
        var color: SIMD4<Float>
        var scale: Float
        var symbolId: UInt32
    }

    func render(nodes: [GraphNode], edges: [GraphEdge], camera: Camera) {
        // Instanced node rendering + edge rendering
    }
}

Intégration compositeur Vision Pro

class VisionProCompositor {
    private let layerRenderer: LayerRenderer
    private let remoteSpace: RemoteImmersiveSpace

    func streamFrame(leftEye: MTLTexture, rightEye: MTLTexture) async {
        // Submit stereo textures with depth for proper occlusion
    }
}

Disposition graphe force-dirigée basée GPU

kernel void updateGraphLayout(
    device Node* nodes [[buffer(0)]],
    device Edge* edges [[buffer(1)]],
    constant Params& params [[buffer(2)]],
    uint id [[thread_position_in_grid]])
{
    // Repulsion between nodes + attraction along edges
}

Métriques de succès

  • Le rendu maintient 90fps avec 25 000 nœuds en stéréo
  • La latence regard-à-sélection reste sous 50ms
  • L'utilisation mémoire reste sous 1 Go sur macOS
  • Aucune chute de frame lors des mises à jour de graphe
  • Les interactions spatiales se sentent immédiates et naturelles
  • Les utilisateurs Vision Pro peuvent travailler pendant des heures sans fatigue

Vérifier

  • Le build a été produit pour la plateforme cible réelle et a soit fonctionné dans un simulateur/appareil, soit a joint son log de build en cas de succès
  • Les règles HIG/UX spécifiques à la plateforme référencées dans le guide macos-metal ont été vérifiées contre le changeset, les noms de règles étant cités
  • Les compteurs de performance pertinents pour la plateforme (fréquence d'images, temps GPU, batterie, état thermique) ont été échantillonnés et rapportés comme nombres
  • Les permissions/entitlements/capabilities requis par le changement sont déclarés dans le manifest ; le diff est affiché
  • Les modalités d'entrée que la plateforme attend (touch, gaze, hand, controller, keyboard) ont chacune été exercées au moins une fois
  • Les logs de crash / console de l'appareil ont été examinés après l'exécution ; toute nouvelle erreur symbolicalisée est rapportée

Skills similaires