Introduzione
Quanto segue assume C # come lingua di riferimento, o qualsiasi altra lingua tipizzata in modo statico. Questa non è una domanda specifica per l'API di Unity, ma viene utilizzata come esempio.
Nell'API di Unity, la maggior parte delle persone si imbatte in la funzione Raycast . Questo ha un argomento, di tipo int
chiamato layerMask
. Questo è un numero intero, che funziona come una maschera bit per bit (se c'è 1 al posto n-esimo, il posto n-esimo è incluso nel calcolo).
Ho sempre pensato che questa fosse una scelta di design molto strana per le loro API.
Prima di tutto, dovrei chiarire che non ci possono essere solo 32 livelli in Unity, quindi, questi livelli sono finiti, ma puoi avere un numero qualsiasi di livelli (sotto i 32).
Personalmente, vorrei chiedere come argomento, una matrice di numeri interi, i cui elementi sarebbero i livelli con i quali si desidera eseguire il raycast (identici all'implementazione effettiva, senza che sia bit a bit). Un altro modo, sarebbe di avere argomenti variardici, se la lingua lo supporta. (questi punti si applicano anche alle lingue digitate dinamicamente). (Ho letto alcuni argomenti contro l'uso di argomenti variardici, quindi non sceglierei questo)
La domanda effettiva
Why would one choose a bitwise mask as a representation of a selection of a (finite/bound) amount of items, instead of an array of the selected items?
Dato che stai sacrificando l'usabilità e la leggibilità *, quali sono i vantaggi?
Ipotesi
Poiché Raycast è una funzione molto utile e ampiamente utilizzata, suppongo che abbiano scelto questo per motivi di prestazioni (le operazioni bit a bit possono essere molto più veloci rispetto all'iterazione su un array). In questo caso particolare, dato che la lunghezza massima dell'array sarebbe 32, dubito che la differenza sarebbe enorme, ma suppongo che in questo caso ogni prestazione sia importante.
L'altro vantaggio è sicuramente l'impronta della memoria (un numero intero rispetto a un'intera serie di essi), ma dubito che questo sia generalmente importante (in questo e in altri casi).
Noterò anche che sia gli array che i numeri interi non impongono il limite delle dimensioni degli elementi. L'array, può essere grande quanto vuoi, e il numero intero ha una certa dimensione di implementazione / macchina specifica, quindi se si desidera attivare 17 elementi, nessuna dimensione di intero importerà che non ci sia elemento 18.
* Esempio: per indicare il terzo e il quarto elemento, invece dell'argomento 12
(1100 in binario), potresti avere [3,4]