Problema nella modellazione di questo perché calcolo troppo lento (robot football)

0

Mi piace creare una vista connettore / diagramma UML componente per il problema dato, ma ho capito che è troppo lento se si tenta di farlo esattamente come è indicato nel testo seguente. La mia domanda è cosa potrebbe essere ottimizzato? Sapendo questo, creerei io stesso l'intero diagramma.

Abbiamo 2 squadre che giocano l'una contro l'altra e l'obiettivo è che una squadra realizzi più gol dell'altra. Entrambi i team hanno le stesse risorse private : 3 robot, una CPU che è in grado di comunicare con ciascun robot in modo bidirezionale, ma è anche in grado di inviare messaggi di trasmissione a tutti i robot del proprio team. Ogni robot ha il suo unico motivo circolare composto dai colori CMYK (4 colori: ciano, magenta, giallo, nero) in modo tale che è impossibile che possano essere confusi dal campo da calcio (verde) o con altri colori (la palla che è arancione) .

Entrambi i team condividono le seguenti risorse condivise :

  • campo di calcio: qui vengono eseguite tutte le azioni che consentono movimenti fluidi del robot. il campo è verde ad eccezione di alcuni segni di colore bianco. un rettangolo di 200 cm x 100 cm limita la superficie di gioco in cui le aree contrassegnate in bianco (il punto centrale, i segni del gateway, ecc.) non sono importanti qui

  • gateway: su entrambi i lati corti del rettangolo la linea centrale di 40 cm è coperta da sensori invisibili. Ogni volta che questi sensori rilevano la palla che ha attraversato la linea, la squadra corrispondente ottiene 1 goal [/ p>

  • palla: ha il colore arancione, i robot corrono verso la palla per sparare nell'obiettivo avversario

  • computer host: rileva gli eventi di gioco come la palla che lascia il campo o si raggiunge un obiettivo. Tutti questi eventi vengono inviati a entrambe le CPU (dei team) allo stesso tempo

  • camera: sta registrando l'intero campo di calcio e li invia a entrambe le CPU del team. La fotocamera esegue 4 immagini al secondo (quindi 1 foto ogni 250 ms)

Il compito delle CPU del team è quello di determinare tutte le posizioni di robot e palla e anche di sviluppare una strategia per il gioco per informare i robot su di esso. Per determinare le posizioni di robot e palla, la CPU deve elaborare ogni immagine creata dalla telecamera, utilizzando 4 filtri perché ci sono 4 colori (CMYK). Un altro filtro è necessario per la pallina arancione. Questi filtri sono disponibili per la CPU. Ma questi filtri sono più piccoli dell'immagine scattata dal camer: possono filtrarne solo 1/3 simultaneamente. Inoltre, ogni filtro ha bisogno di 500ms per completare tutti i calcoli.

Il problema principale che vedo qui è che il filtro ha bisogno di 500 * 4 * 3 = 6000ms = 6s tanto tempo solo per determinare le posizioni dei robot, solo per 1 immagine ...! Questo rende tutto il resto inefficiente e il gioco sembra completamente ingiocabile: / Come potrebbe essere fatto molto più veloce? Penso che se so che potrei creare la vista completa del connettore componente / il diagramma UML per il problema.

    
posta kathelk 18.12.2018 - 20:32
fonte

2 risposte

3

Suggerirei quanto segue.

  1. Prima che inizi la partita, prendi tutto il tempo che vuoi per capire dove sono i tuoi
  2. robot
  3. Ora sai quanto velocemente i tuoi robot si muovono e dove hanno iniziato. Non è necessario controllare l'intera immagine o identificare i singoli robot. Se vedi A e il robot dove ti aspetti che tu stia bene,
  4. ricampiona l'immagine e prendi solo ogni 3 ° pixel. Ora il tuo filtro copre l'intero campo.
  5. Probabilmente non hai bisogno di usare tutti i filtri, ci sono solo 6 robot nel gioco.
  6. 500 ms è ancora un tempo molto lungo.
  7. la cosa più veloce sul campo sarà probabilmente la palla. trovalo rapidamente, due volte, e stabilisci dove si trova e invia i robot lì.
risposta data 19.12.2018 - 00:36
fonte
2

Aggiorna

OMG, non so come questo post abbia avuto voti positivi. Mi rannicchio un po 'quando lo riletto. Devo ammettere che sono tornato a casa da una festa tarda di Natale / inizio anno e davvero ubriaco mantenendo lo schermo a sinistra su SE, solo per essere tentato di usarlo mentre ero estremamente ubriaco. Ho la brutta abitudine di essere completamente non filtrato e di dire solo la prima cosa che mi viene in mente quando sono ubriaco. È un po 'imbarazzante, ma mi piace bere troppo per rinunciare, ma dovrei provare a non usare SE quando non sono sobrio.

Detto questo, forse alcuni di essi sono rilevanti. Mi chiedo se, oltre ad accordare questi filtri (e usando metodi di campionamento che coprono più pixel contemporaneamente come un bel suggerimento da Ewan), potresti essere in grado di parallelizzarli (paralizzare il codice implementandoli o, più semplicemente, a meno che non bisogno degli output reciproci, parallelizzare l'esecuzione dei filtri). Non so con che tipo di hardware o di restrizioni API si sta lavorando, ma questo tipo di volte sembra davvero inutilizzabile per me e mi piacerebbe davvero raggiungere un profiler per approfondire esattamente su quale tipo di linee vengono spesi i tempi e perché (manca la cache, ecc.)

Risposta ubriaco

The main problem I see here is that the filter needs 500*4*3=6000ms=6s so much time just to determine the positions of the robots, only for 1 picture...! This makes everything else inefficient and the game seems completely unplayable : / How could this be made much faster? I think if I know that I could create the complete component connector view / UML diagram for the problem.

L'ultima frase non viene calcolata per me. Se hai bisogno di 6 secondi per questo filtro o qualsiasi altra cosa, e i giocatori dipendono da questo per fare le loro cose, allora non sto cercando diagrammi per risolvere i problemi; stiamo giocando a calcio Special Olympics, a quel punto tifiamo per Jimmy e speriamo che non incontri un goal post e faccia una commozione per la 200esima volta. Qual è l'intera vista del connettore / roba UML? Sono in cerca di un profiler e sintonizzo il codice. È l'elaborazione delle immagini? A seconda di quanto sia omogenea l'elaborazione, potresti essere in grado di differire o meno la GPU con enormi vantaggi.

Ottimizzate l'inferno con gli estrattori in mano e ottimizzate le regole per ottenere i requisiti in tempo reale. Se si tratta di una terza parte, si presenta un sacco di lamentele e si capovolge il dito medio qua e là (si veda la risposta di Linus Torvalds a NVidia per come i programmatori dovrebbero comportarsi con terze parti problematiche).

Solo se tutte queste opzioni non sono disponibili, provi a sviluppare una super intelligenza che ha riflessi di 6 secondi e in qualche modo riesce a non essere troppo orribile a giocare nonostante questo, come qualche soldato maldestro dello spazio esterno che ha riflessi di 6 secondi ma ha una bomba nucleare per la sua sequenza di autodistruzione di 3 secondi se riesce a sopravvivere solo quei secondi senza essere ucciso. Perché 6 secondi sono un carico di tempo per fare calcoli (sono circa 60.000 volte più di quelli che ho di solito), e potresti inavvertitamente creare qualcosa che passa il test di Turing sulla strada e poi può parlare con noi e possiamo scoprire cose su l'un l'altro e hai praticamente creato una nuova forma di vita a quel punto, a che punto qual è il punto di far giocare a Soccer? Potrebbe anche farlo curare il cancro a quel punto.

My question is what could be optimized? Knowing this I would create the entire diagram myself.

Questa è una domanda di profiler, e non so quale tipo di diagrammi vuoi disegnare in risposta. Se riesco, mi limito a eliminare i migliori hotspot, ad esempio da una sessione di esempio con 100 milioni di poligoni.

    
risposta data 19.12.2018 - 00:11
fonte

Leggi altre domande sui tag