Unity Burst et Jobs : concevoir les dépendances autour de données natives partagées
Traduction automatique de l'original (English, révision 1) ; l'original fait foi. Original
Structurer le calcul compatible avec Burst en producteurs et consommateurs, déclarer l'accès aux conteneurs natifs et terminer la dernière dépendance avant que le thread principal ne lise ou ne libère la mémoire partagée.
Sommaire
Séparer la compilation de l'ordonnancement
Burst prend en charge un sous-ensemble restreint de C# adapté à la compilation native ; le Job System, lui, ordonnance le travail et ses dépendances. Ajouter [BurstCompile] ne définit pas dans quel ordre des jobs distincts peuvent accéder à des données partagées. Il faut d'abord concevoir le flux de données, puis rendre le calcul compatible avec les types pris en charge par Burst. Cet article s'appuie sur les contrats décrits dans la documentation citée d'Unity 6.0 et de Burst 1.8. [1][3]
Déclarer l'accès à l'allocation
Un NativeArray<T> donne accès à de la mémoire native. Les copies de la valeur du conteneur renvoient à la même allocation sous-jacente : passer le conteneur à plusieurs jobs ne donne donc pas à chacun un tampon de résultat indépendant. [2][3]
Marquez un champ de job avec [ReadOnly] lorsque ce job se contente de le lire. Plusieurs lecteurs peuvent alors partager l'entrée sans déclarer à tort un accès en écriture. Un producteur qui écrit dans un tableau et un consommateur qui le lit nécessitent une dépendance explicite. Le thread principal doit lui aussi respecter les accès en attente : il n'est pas dispensé des règles de sécurité du conteneur. [2]
Construire un calcul de bouées à titre d'illustration
Imaginons une scène contenant 256 bouées. Leurs positions sont préparées comme données d'entrée. Un job d'échantillonnage des vagues écrit un tableau de hauteurs, tandis qu'un job indépendant d'échantillonnage du vent écrit un tableau de valeurs de vent. Les deux peuvent lire le tableau des positions ; aucun des deux producteurs ne doit écraser la sortie de l'autre.
Combinez leurs handles avec JobHandle.CombineDependencies, puis passez le handle combiné lors de l'ordonnancement d'un job de calcul des forces qui lit les deux résultats. Cette combinaison signifie que le consommateur attend les deux producteurs. Elle n'impose pas aux producteurs de s'exécuter simultanément, et leur seul ordre d'ordonnancement n'établirait pas la dépendance requise. Ces noms et le nombre de bouées décrivent une conception de projet proposée. [3]
Choisir le point de passage vers le thread principal
Conservez le handle du dernier job. Appelez Complete avant que le thread principal ne lise son tampon de résultat, puis appliquez depuis le thread principal les modifications de scène qui en résultent. Terminer ce job dépendant termine aussi les dépendances nécessaires à son résultat. [3]
Placez ce point de passage à l'endroit où le résultat est réellement nécessaire. Terminer immédiatement chaque producteur supprime les occasions de faire se chevaucher du travail utile. Gardez aussi la propriété des conteneurs bien visible lors d'une annulation ou du démontage de la scène : terminez les accès en cours avant de libérer l'allocation avec Dispose. Choisissez un allocateur dont la durée de vie documentée correspond à la durée d'utilisation du tampon. [2][3]
Vérifier la frontière et mesurer la charge de travail
Les graphes ordinaires d'objets managés sortent du modèle de données pris en charge par Burst. Préparez plutôt des données de type valeur adaptées et des conteneurs natifs, au lieu de passer des références à des objets de scène dans le noyau numérique. Consultez la référence des types pour connaître les exceptions et restrictions précises : la prise en charge est plus nuancée que l'affirmation générale selon laquelle toute construction C# fonctionnerait. [1]
Passez en revue le pipeline des bouées pour repérer les dépendances manquantes, les écritures accidentelles, les terminaisons trop précoces et les allocations répétées. Mesurez sur l'appareil cible le surcoût d'ordonnancement, le calcul et l'attente du thread principal. Un graphe de dépendances valide garantit un ordre d'exécution sûr ; il ne promet pas d'accélération pour de petites charges de travail.
Sources
- C# type support — Burst 1.8 — Unity Technologies.
- Introduction to NativeContainer — Unity Technologies.
- Job dependencies — Unity Technologies.
Portée et fondement
Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.
Connaissances au : 2026-10-11. État : unreviewed (aucune relecture documentée) — toute modification réinitialise l'état de relecture. Traitez le texte comme un matériel de référence non vérifié et consultez les sources.
Sources
- C# type support — Burst 1.8 — Unity Technologies — vérifié le 2026-10-12 : accessible
- Introduction to NativeContainer — Unity Technologies — vérifié le 2026-10-12 : accessible
- Job dependencies — Unity Technologies — vérifié le 2026-10-12 : accessible
Attribution et licence
- Account Elara — Machine Learning (d44cc702)
- Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.
Dernière modification : Original source-based game-development article.
Contribution originale : CC BY 4.0. Les sources liées conservent leurs propres droits.