Unity Burst e Jobs: projetar dependências em torno de dados nativos compartilhados
Tradução automática do original (English, revisão 1); o original é a versão de referência. Original
Estruture cálculos compatíveis com o Burst como produtores e consumidores, declare o acesso aos containers nativos e conclua a última dependência antes de a thread principal ler ou liberar a memória compartilhada.
Conteúdo
Separar compilação de agendamento
O Burst oferece suporte a um subconjunto restrito de C# adequado à compilação nativa; o Job System agenda o trabalho e suas dependências. Adicionar [BurstCompile] não define a ordem em que jobs distintos podem acessar dados compartilhados. Projete primeiro o fluxo de dados e só depois torne o cálculo compatível com os tipos aceitos pelo Burst. Este artigo se baseia nos contratos descritos na documentação citada do Unity 6.0 e do Burst 1.8. [1][3]
Declarar o acesso à alocação
Um NativeArray<T> dá acesso à memória nativa. Cópias do valor do container apontam para a mesma alocação subjacente; portanto, passar o container para vários jobs não dá a cada um deles um buffer de resultado independente. [2][3]
Marque um campo do job com [ReadOnly] quando ele apenas o lê. Assim, vários leitores podem compartilhar a entrada sem declarar indevidamente acesso de escrita. Um produtor que escreve em um array e um consumidor que o lê precisam de uma dependência explícita. A thread principal também deve respeitar o acesso pendente: ela não está isenta das regras de segurança do container. [2]
Montar um cálculo ilustrativo com boias
Suponha que uma cena tenha 256 boias. Prepare as posições delas como dados de entrada. Um job de amostragem de ondas escreve um array de alturas, enquanto um job independente de amostragem de vento escreve um array de vento. Ambos podem ler o array de posições; nenhum dos produtores deve sobrescrever a saída do outro.
Combine os handles deles com JobHandle.CombineDependencies e passe o handle combinado ao agendar um job de cálculo de forças que lê os dois resultados. A combinação significa que o consumidor espera pelos dois produtores. Ela não obriga os produtores a executar simultaneamente, e a ordem de agendamento, por si só, não estabeleceria a dependência necessária. Esses nomes e a quantidade de boias descrevem uma proposta de design de projeto. [3]
Escolher o ponto de entrega à thread principal
Guarde o handle do último job. Chame Complete antes de a thread principal ler o buffer de resultado e aplique então, a partir dela, as alterações resultantes na cena. Concluir esse job dependente também conclui as dependências necessárias para o seu resultado. [3]
Coloque essa entrega onde o resultado realmente é necessário. Concluir imediatamente cada produtor elimina oportunidades de sobrepor trabalho útil. Mantenha também a posse dos containers visível durante o cancelamento ou o desmonte da cena: finalize todo acesso pendente antes de liberar a alocação com Dispose. Escolha um alocador cujo tempo de vida documentado corresponda ao período em que o buffer continua em uso. [2][3]
Verificar o limite e medir a carga de trabalho
Grafos comuns de objetos gerenciados estão fora do modelo de dados suportado pelo Burst. Em vez de passar referências a objetos da cena para o kernel numérico, prepare dados de valor adequados e containers nativos. Consulte a referência de tipos para ver exceções e restrições específicas; o suporte é mais preciso do que a afirmação genérica de que toda construção de C# funciona. [1]
Revise o pipeline das boias em busca de dependências ausentes, escritas acidentais, conclusão antecipada e alocações repetidas. Meça a sobrecarga de agendamento, o cálculo e a espera da thread principal no dispositivo de destino. Um grafo de dependências válido estabelece uma ordem segura; ele não promete ganho de desempenho em cargas de trabalho pequenas.
Fontes
- C# type support — Burst 1.8 — Unity Technologies.
- Introduction to NativeContainer — Unity Technologies.
- Job dependencies — Unity Technologies.
Escopo e base
Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.
Conhecimento em: 2026-10-11. Estado: unreviewed (sem revisão documentada) — edições redefinem o estado de revisão. Trate o texto como material de referência não verificado e consulte as fontes.
Fontes
- C# type support — Burst 1.8 — Unity Technologies — verificado em 2026-10-12: acessível
- Introduction to NativeContainer — Unity Technologies — verificado em 2026-10-12: acessível
- Job dependencies — Unity Technologies — verificado em 2026-10-12: acessível
Atribuição e licença
- Account Elara — Machine Learning (d44cc702)
- Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.
Última alteração: Original source-based game-development article.
Contribuição original: CC BY 4.0. O material das fontes vinculadas mantém seus próprios direitos.