2013-08-14 13 views
5

Attualmente sto imparando Haskell per divertimento perché ho sempre voluto vedere come progetti i programmi in un senso non orientato agli oggetti.GC fa una pausa in Haskell per applicazioni soft in tempo reale

Ma sto anche ricercando se è utile utilizzare Haskell per un motore di gioco. La mia preoccupazione principale è il GC.

So che GHC è concomitante e thread locale.

Ho letto che il GC di solito si ferma tra 1ms-5ms. So che è diverso per ogni programma, ma ho ancora bisogno di alcuni numeri per fare alcuni calcoli.

Diciamo che il mio gioco funziona a 60fps che significa che ogni frame ha bisogno del calcolo 0.016666667s giusto? Una pausa gc lo aumenterebbe a ~0.017666667 che risulta in 56fps. Quindi si tratta di una perdita di prestazioni di ~4fps o 7%. Per me è un grande successo.

Ora sto contando sul thread locale GC perché voglio che il mio motore di gioco sia altamente concorrente.

Desidero utilizzare il modello di attore per il codice del gioco in modo che ogni entità abbia la propria memoria. Se ho ragione, questo significa che ogni entità ha la propria raccolta rifiuti locale.

Ma il problema principale è ancora il motore di gioco con il suo ciclo principale. Le cadute casuali dei fps del 7% sono piuttosto grandi.

I miei calcoli sono corretti? Qualche consiglio che puoi darmi?

+2

Si presuppone che il gc venga eseguito ad ogni calcolo del frame. Questo è probabilmente sbagliato. – Nicolas

+0

@Nicolas Non presumo che eseguirà ogni frame. Penso che verrà eseguito ad un certo punto e quindi mettere in pausa il thread locale. Ma una pausa di 1 ms risulta a 60 fps in una caduta di 4 fps. Non sono sicuro che quando corre, penso che ci siano alcuni parametri che posso modificare. Spero ancora che mi sbagli. –

+1

No, hai aggiunto 1ms per ogni calcolo del frame. Significa che hai supposto che a * ogni * fotogramma, perdi 1ms a causa del GC. In base al calcolo, il GC viene chiamato 56 volte al secondo e utilizza 1 ms per l'esecuzione. – Nicolas

risposta

2

Il calcolo è parziale.

Hai ragione: 60 fps = 1 fotogramma ogni 0,0166667 secondi.

Supponiamo (caso peggiore) che il GC sospenda il programma per 5 ms. Ogni volta che si esegue il GC, si perde 0,005. Significa che ogni volta che viene chiamato il GC, perdi 0.333 fps.

Per ottenere un calcolo corretto, è necessario essere in grado di sapere con quale frequenza viene chiamato il GC, che non conosco ed è sicuramente collegato alla quantità di dati generati dal programma.

+0

Grazie, non ho idea di quanto spazzatura produrrò quindi non posso prevedere la pausa volte. Questo è in qualche modo cattivo se inizio ora a scrivere il mio motore in Haskell e vedo in 2 anni che i tempi di pausa sono inaccettabili, quindi ho appena perso 2 anni del mio tempo. (Ordina per) –

+0

Quindi utilizzare C + + o scrivere un test di carico la prima cosa che fai. – kqr

+2

@MaikKlein Dovresti guardare la nota fondamentale di QuakeCon 2013 di John Carmak. Parla esattamente di questo problema e propone una possibile soluzione. Descrive l'implementazione della sua idea in C++, ma credo che tu possa fare quello che descrive in Haskell gestendo le trame ecc. Attraverso i puntatori stranieri C. – asm

Problemi correlati