Bridging delle pratiche di sviluppo delle applicazioni e delle pratiche di sviluppo del gioco

1

In precedenza mi sono imbattuto in una pratica interessante chiamata occultamento nello sviluppo del gioco. Sto ancora facendo ricerche per comprendere meglio come funziona, dal momento che questo è per lo più discusso in programmazione / strumenti / IDE di giochi come Unity, quindi sto applicando la pratica alla gestione dei dati nello sviluppo di applicazioni.

Altri nomi per la pratica come definiti nella wiki qui : Determinazione della superficie (nota anche come rimozione della superficie nascosta (HSR) ), occlusione culling (OC) o determinazione della superficie visibile (VSD))

La mia comprensione della pratica è che quando si esegue il rendering della grafica 3D, viene utilizzato un algoritmo per determinare quali oggetti devono essere renderizzati e in memoria, in base ad una prospettiva vista / telecamera. Questo è principalmente usato per usare la memoria grafica in modo più efficiente, ma non rende necessariamente più efficiente l'utilizzo della memoria non grafica, dato che i dati dietro gli oggetti non renderizzati sono ancora manipolati.

Per quanto riguarda l'applicazione pratica, sto tentando di utilizzare l'aspetto della gestione dei dati caricati durante l'esecuzione di un'applicazione, in cui i dati potrebbero essere righe, valori specifici o alcuni oggetti.

Dal punto di vista di un'applicazione, questo sembra essere simile a una qualche forma di caricamento lazy o chiamate / eventi senza stato.

private Lazy<Foo> DataItem;
public void GoToNextView()
{
    DataItem = new Lazy<Foo>();
    //return data to some display
}

Per l'esempio precedente, i dati precedenti verrebbero cancellati / impostati per la garbage collection tramite il nuovo costruttore, quindi ci sarebbero nuovi potenziali dati da caricare.

Ecco un esempio specifico:

Per alcune tabelle paginate, ci sono solo dati specifici per la pagina caricata, quindi su "Avanti" la pagina precedente viene scaricata e viene caricata la nuova pagina. questa pratica si presta a essere più basata sugli eventi nella mia mente, e ciò è dovuto principalmente al pensiero in termini di interfaccia utente / aspetto front-end di un'applicazione. A meno che non si stia manipolando i dati dal codebehind di alcune UI, non riesco a vedere un buon esempio dell'utilizzo del pigro come aiuto nella gestione dei dati, dal momento che l'interfaccia utente caricherà i dati più immediatamente anziché attendere un passaggio specifico. (si prega di correggere se la mia comprensione non è corretta tra il caricamento lazy e stateless)

Dal punto di vista di una libreria / libreria personalizzata, credo che potrebbero esserci più differenze tra le due pratiche, dal momento che esiste il potenziale per più istanze di manipolazione dei dati e passaggi incrementali che possono precedere determinati carichi di dati.

private Bar DataItem;
public Bar Process()
{
   DataItem = new Bar();
   //return some processed/manipulated Bar value
}

private Lazy<Bar> OtherDataItem;
public Bar OtherProcess()
{
    OtherDataItem = new Lazy<Bar>();
    //process other items
    //at some step, get the value associated to the variable via OtherDataItem.Value
    //return some processed/manipulated Bar value in respect to the other processed items
}

In questo caso, c'è una differenza nella gestione dei dati, in cui il primo manterrà i dati completi associati al tipo dall'inizio alla fine (la fine è una delle estremità del metodo o la raccolta / eliminazione dei dati inutili). Dalla mia comprensione del pigro, i dati non verranno effettivamente recuperati fino a quando non viene chiamato il valore, quindi i dati non verranno mantenuti dall'inizio alla fine (credo che ci sia anche un controllo in background per lo smaltimento dei dati inutilizzati per i tipi pigri, e non so se è vero o si occupa di qualche altra cosa specifica.

Sto cercando pratiche nello sviluppo di applicazioni che raggiungano lo stesso obiettivo di gestione dei dati basato sull'essere a fuoco come la pratica osservata nello sviluppo del gioco. Non so se c'è una possibilità che questo sia effettivamente uno strumento piuttosto che una pratica, dal momento che la ricerca tende a condurmi verso l'utilizzo in Unity.

Per le mie domande, quali pratiche di sviluppo delle applicazioni rientrano effettivamente nella pratica di gestione dei dati mostrata nell'eliminazione dell'occlusione dalle pratiche di sviluppo del gioco? Se le precedenti due pratiche di sviluppo dell'applicazione sono equivalenti a quella pratica di sviluppo del gioco, allora la comprensione che sto cercando di trasmettere sembra accurata?

Ancora una volta, sto ancora ricercando e immergendomi in tutte le informazioni che riesco a trovare, e le mie conoscenze potrebbero non essere corrette su entrambi i lati (sviluppo di applicazioni o giochi). Sento che sono ad un punto, dove ho bisogno di avere un controllo sulla mia comprensione prima di impegnarmi in questa idea e avanzare. Accolgo con favore eventuali correzioni o domande a mio avviso.

    
posta eparham7861 28.02.2018 - 23:16
fonte

2 risposte

4

Stai cercando di generalizzare ciò che stai imparando. Questo è buono. Mostra che stai cercando di fare più che imparare a memoria.

Il culling di occlusione è abbastanza simile al problema di caching. Devi limitare l'uso di risorse limitate. Fallo correttamente e c'è un grande profitto. Fallo male ed è molto costoso Ciò che lo rende diverso è il modo in cui prevedi quello che non sarà necessario.

Nelle applicazioni hai risorse che operano a velocità diverse. Locale è più veloce di remoto. La memoria è più veloce del disco rigido. Ma solo così tanto può essere mantenuto locale e nella memoria. Devi anticipare l'uso e avere pronto ciò che è più probabile che venga utilizzato in seguito. Sbaglia e le cose si rallentano.

Si vede questo genere di cose anche quando si apre un file di testo. La barra di scorrimento ti mostra che c'è di più qui allora che cosa stai guardando. Ma dal momento che lo schermo è così grande che non stai ancora guardando il resto.

Alcuni file di testo sono abbastanza grandi da renderti saggio solo aprirli usando un editor di testo speciale perché le persone che hanno scritto gli editor tipici hanno avuto un'idea di quale dovrebbe essere una tipica dimensione del file. Per questo motivo hanno pensato che sarebbe sempre stato OK caricare l'intero file in memoria. Non bello se il tuo file è più grande della tua memoria.

    
risposta data 01.03.2018 - 02:23
fonte
1

Come menzionato in altre risposte, le cose che sono le stesse tra gli scenari che hai menzionato è che stai tentando di ridurre il set di dati con cui devi lavorare in qualsiasi momento per migliorare la velocità di interazione. Questo viene fatto in molti casi diversi.

Una cosa da tenere a mente è che è necessario il primo profilo per capire perché la velocità non è ciò che si desidera. Il profiling ti dirà dove è trascorso il tempo e ti permetterà di accelerare quella parte o sapere se hai raggiunto un limite e forse hai bisogno di provare un approccio diverso.

Potrebbe essere che il problema non è la quantità di dati che hai in memoria, ma il modo in cui è organizzato in memoria, o qualche altra funzione che non hai pensato. O forse le routine di visualizzazione sono la cosa più lenta, e la tua disposizione dei dati va bene e puoi effettivamente elaborarli tutti abbastanza velocemente. Finché non hai deciso quale sia il tuo obiettivo e poi misurato per vedere se lo stai colpendo, non dovresti preoccuparti di come risolverlo. Potresti dedicare un po 'di tempo a creare un nuovo algoritmo eccezionale solo per scoprire che hai ottimizzato la parte sbagliata.

    
risposta data 01.03.2018 - 04:16
fonte

Leggi altre domande sui tag