Messaggio
da Linkinf22 » dom 19 ago 2012, 13:58
Bene bene, oggi ho fatto una modifica che ha decisamente aumentato le prestazioni del programma.
Vi racconto un po':
Revolt organizza i file .W in Cubes, ognuna di queste contiene indici e vertici. Questo viene fatto per aumentare gli FPS: in base alla posizione della camera Revolt testa se una certa Cube viene vista, in caso positivo allora la renderizza mentre in caso contrario non la renderizza.
Da quel che ho capito (ma non so se è proprio così), Revolt memorizza ognuno di questi Cube e fa una specie di "contenitore" di tutti i vertici che devono essere renderizzati (credo anche delle varie auto e vari oggetti). A quel punto ne fa due soli buffer (uno di vertici ed uno di indici) e renderizza il tutto in una volta.
Questo metodo non è il metodo che voglio utilizzare io, in quanto per modificare la pista si ha spesso una visione globale di essa, inoltre io non ho da trattare i vertici delle varie auto.
La cosa che non ho capito però è perché le piste di Revolt abbiano anche Cubes da poche facce (spesso anche da solo una o due facce). Il metodo del risparmio di FPS è ok nel caso non hai da renderizzare una intera parte del circuito, ma evitare di renderizzare anche solo una faccia forse è più uno spreco di CPU per un guadagno di GPU inutile (ma probabilmente i programmatori di revolt hanno fatto queste considerazioni in base all' hardware di quei tempi).
Toys in the hood 1 ha infatti 2453 Cubes, quando se ne potrebbero fare tipo solo circa 7 che dividono la pista in "sezioni", che è quello che voglio fare io con il MIB, cioè far fare Cubes molto più grandi, considerando che l' hardware di oggi non ha grossi problemi e che praticamente la maggior parte delle piste custom, se non erro, ha una Cube unica che comprende l' intera pista. Ovviamente chi crea la pista con il MIB sarà libero di mettere quante Cube vuole.
Comunque, come ho ottenuto un grande aumento di prestazioni?
Prima della modifica avevo realizzato un metodo abbastanza simile a quello di Revolt: caricavo i vertici e gli indici dividendoli nelle varie Cube. Poi però creavo i buffer dei vertici e degli indici per ogni Cube, questo significa 2453*2= 4906 buffer. I vertici e gli indici vengono quindi immessi nella memoria video, ma nella memoria RAM devono comunque esserci informazioni per poterli utilizzare. Moltiplicando la quantità di memoria RAM occupata dalle informazioni dei buffer per la quantità di buffer creati (4906, nel caso di Toys in the hood 1), arrivavo a sprecare un sacco di RAM.
Con Toys in the hood 1 il mio programma arrivava ad occupare quasi 300 MB di RAM (quando senza creare i buffer ne occupa circa 55 MB).
Già questo spreco di RAM non mi stava simpatico.
Altro problema era legato al fatto che ad ogni caricamento di una Cube doveva allocare la memoria per i due buffer, fino ad arrivare ai circa 300 MB di Toys in the hood 1... questo faceva rallentare il caricamento, arrivando anche a più di 10 secondi per caricare Toys in the hood 1 nel caso del mio computer. Altra cosa che mi faceva irritare.
Ma forse il problema più grosso era il fatto che per disegnare l' intera pista c'era da renderizzare ogni Cube una ad una. Questo significa ripetere per 2453 volte l' operazione "imposta vertex buffer-imposta index buffer-disegna". Calando gli FPS fino ad ancora meno di quelli che potete vedere nelle immagini che ho postato precedentemente, in quanto in confronto alle immagini precedenti vengono renderizzate tutte le facce). Quindi avevo una media di FPS di circa 190 FPS. Considerando chi ha computer con hardware meno prestanti del mio, questo sarebbe stato problematico, soprattutto con l' aggiunta di luci, colori e texture.
Queste tre cose decisamente, oltre ad irritarmi, mi preoccupavano perché avevo paura che solo chi ha hardware con buone prestazioni si possa permettere di usare il MIB.
Perciò anziché suddividere i vertici, gli indici ed i buffer per ogni Cube, ho mantenuto la suddivisione dei vertici e degli indici (che tanto occuperebbero la stessa quantità di memoria), per poi riunirli (occupando quindi il doppio della RAM, in quanto vengono copiati, ma non sono loro ad occupare molta RAM) e creare un solo vertex buffer ed un solo index buffer (e poi cancellare i vari vertici e indici duplicati appositamente per questa operazione).
Questo ha implicato l' aggiunta del ricalcolo dei vari indici in base ai vertici "riuniti in un unico gruppo", il quale inizialmente non aveva funzionato per un piccolo errore che poi ho trovato facilmente e risolto.
Grande vantaggio è il fatto che l' operazione "imposta vertex buffer-imposta index buffer-disegna" viene eseguita una sola volta per ogni volta che si deve disegnare la pista, anziché per la quantità di Cubes che ci sono nella pista.
Ora, con questa modifica (ovviamente allo stato attuale, perché poi con l' aggiunta delle altre cose - colori, texture, luci, oggetti vari - le prestazioni caleranno):
1) La pista viene caricata e visualizzata in circa poco più di un secondo.
2) La memoria RAM occupata ora è di poco più di 55 MB
3) Con l' hardware che ha, il mio PC fa in media 2800 FPS, arrivando a volte anche a superare i 3000.
Penso che la prossima notizia (e probabilmente il prossimo screen) arriverà quando aggiungerò l' illuminazione e quindi le piste saranno visibili, anziché essere delle masse di un colore unico.
Ultima modifica di
Linkinf22 il dom 19 ago 2012, 14:01, modificato 1 volta in totale.
Ai creatori di piste ed auto potrebbe interessare il progetto MIB, c'è il topic nella sezione "Sviluppo" del forum.