Quale algoritmo dovrei usare, per simulare un flusso continuo di N incrementi ogni secondo - non scrivere un ciclo, ma piuttosto eventi a intervalli temporizzati, non più di M eventi al secondo?
Sto implementando un gioco incrementale , e la velocità di incremento per alcune risorse di Scrog ha una variazione molto ampia tasso di aumento. Il sistema che sto usando ha un timer per gli eventi, e questo è il meccanismo che voglio usare per generare la risorsa nel tempo.
Vincoli di progettazione
Gli input di questo algoritmo sono: il tasso effettivo di incremento di Scrog (ad esempio "14 al secondo", "578 al secondo") e il limite inferiore del periodo per ciascun timer (ad esempio "non inferiore a 10 al secondo") "," Non inferiore a 100 al secondo ").
Gli output di questo algoritmo sono: un piccolo insieme di tuple (intervallo-temporizzatore, quantità-scrog), spesso solo una tupla e tipicamente non più di una manciata, che quando prese insieme produrranno effettivamente la velocità specificata di incremento di Scrog al secondo.
-
Voglio simulare qualsiasi cosa da 1 incremento ogni pochi secondi, fino a trilioni al secondo.
-
L'incremento della risorsa Scrog deve essere eseguito da importi interi costanti. Voglio precalcolare gli importi e non occuparmi delle frazioni della risorsa.
-
Gli eventi dovrebbero essere attivati da timer a intervalli ripetuti.
-
Gli intervalli del timer generati dovrebbero essere il più grandi possibile, per eseguire la funzione il meno frequentemente possibile. Dato un tasso specifico di aumento, non voglio una funzione di polling che faccia inutili controlli "è ancora ora?"; che era noto in precedenza, questo algoritmo ha bisogno di impostare i timer per evitare polling.
-
Gli intervalli del timer generati devono essere maggiori di un limite minimo specificato ("M al secondo"), mentre abbastanza piccoli da aggregare simulare il tasso costante "N al secondo".
-
Nessuno stato può essere tenuto in un ciclo; invece, l'algoritmo deve precomputerare una raccolta di timer che ogni volta genererà un evento "incrementa lo scrog per n", periodicamente. Il periodo di ciascun timer e la quantità intera di Scrog prodotto da ciascun timer sono quindi costanti.
-
Gli eventi dovrebbero sparare costantemente, simulando un flusso continuo; ma non indefinitamente spesso, in modo che il gestore di eventi non sia sovraccarico.
-
È accettabile se l'algoritmo approssima solo la frequenza specificata, entro la tolleranza di M-per-secondo.
Quindi sto cercando un algoritmo generico, che simulerà un flusso continuo di Scrog a qualsiasi velocità (N al secondo), impostando eventi ripetuti a un piccolo numero di intervalli fissi, ogni intervallo non più frequente di M al secondo.
Esempio: fino a 10 eventi al secondo
Se limito il tasso effettivo di eventi a non più veloce di 0,1 secondi (10 volte al secondo), ciò significherebbe:
- Quando la frequenza è "1 Scrog per 5 secondi", l'algoritmo può produrre il set
{ (5.0 seconds, 1 Scrog) }
. - Quando la frequenza è "1 Scrog al secondo", l'algoritmo può produrre il set
{ (1.0 seconds, 1 Scrog) }
. - Quando la frequenza è "7 Scrog al secondo", l'algoritmo può produrre il set
{ (0.143 seconds, 1 Scrog) }
. - Quando la frequenza è "10 Scrog al secondo", l'algoritmo può produrre il set
{ (0.1 seconds, 1 Scrog) }
. - Quando la frequenza è "500 Scrog al secondo", l'algoritmo può produrre il set
{ (0.1 seconds, 50 Scrog) }
.
Ma sono confuso su come l'algoritmo dovrebbe gestire i tassi più velocemente di 10 secondi al secondo, più lentamente di centinaia al secondo.
- Quando la frequenza è "14 Scrog al secondo", l'algoritmo può produrre il set
{ (0.1 seconds, 1 Scrog), (0.25 seconds, 1 Scrog) }
, perché gli eventi attivati con quegli intervalli genereranno 14 Scrog al secondo.
Un semplice problema aritmetico?
Spogliato del contesto di eventi, timer, ecc. questo si riduce a me cercando di prendere alcuni numeri, con unità, e produrre altri numeri con unità.
Quindi questo è apparentemente un problema abbastanza semplice (?): progettare un algoritmo generale che, dati questi input, e i vincoli di cui sopra, produrrà quegli output.
Ma la mia aritmetica astratta non è abbastanza potente. Come deve essere scritto l'algoritmo in modo che produca tutti questi risultati, dati solo i vincoli e la velocità di Scrog effettiva corrente?