ciao.
Volevo creare una piccola libreria grafica che utilizza per creare mesh e configurare oggetti opengl i template e le policy class , per via di definire algoritmi generici .
Subito ve lo dico sinceramente speravo di ottenere qualche beneficio prestazionale, ma poi ho capito che non è questo che si ottiene, infatti ho fatto delle prove con misure di chiamate a funzioni statiche,polimorfiche e normali, e ho visto che il guadagno è davvero misero, anche se le chiamate sono moltissime, dell ordine dei 20000 chiamate che possono esserci in opengl calcolate le entita grafiche per i 60 o piu frame al sec.
adesso che ho iniziato a leggere alcuni libri sui template(modern c++ programming e template the complete guide)ho capito che i template servono e danno la loro massima potenza nella configurazione tipo le policy class e le host class e nel fatto che l'algoritmo(ma è molto difficile da fare ho capito) puo essere applicato su svariate entità.
posto il codice semplificato al massimo per fare capire cio che voglio fare
codice://classe non template da usare nelle collezioni #include "stdafx.h" class Mesh { public: Mesh(){}; int vba; int texture; std::function<void()> fnx; void invoke() { fnx(); } template<class cl,class fn> void bind() { cl foo; fnx = std::bind(&cl::draw, foo); } }; //classe host che genera la mesh template <class shader> class HostClass { public: Mesh *pM; void HostClass::Create(){ pM = new Mesh(); shader * pShader = new shader(); pM->vba = 1; pM->texture = 2; typedef void (shader::* f)(); f pf= &shader::draw; shader sh; shader* psh = &sh; pM->bind<shader,f>(); } Mesh* Get() { return pM; } }; //classe shader ho omesso tutte le proprietà di configurazione class Shader{ public: Shader(){}; void Shader::draw() { } };
Passo al problema :
ho due classi mesh e effect, mesh contiene i dati dei triangoli, le normali ecc... e questi dati una volta creati in opengl sono accessibili come Glint(un int ala fine).
effect contiene l'effetto e i suoi parametri ovvero per farla breve un metodo di renderizazione.
quello che ho fatto è passare a mesh un parametro template effect per configurare la mesh al rendering dell'effect passato oltre ad altre configurazioni relative all' unione delle due classi, tutte le classi effect hanno la stessa interfaccia.
quello che vorrei e non riesco a fare è generare in una host class con mesh e effect una classe di un tipo specifico , diciamo MeshEffect(non template) che ha tutti i valori che alla fine sono degli int dell opengl e questo è molto facile, il problema è la funzione di disegno che è nell effect, tutti gli effect hanno infatti una funzione
void draw(void)
{....implementazione}
ho provato ad usare le function del namespace functional e bindarci la funzione draw delll'effect per creare una std::function compatibile con tutti i tipi di mesheffect e quindi permettermi di utilizzare liberamente liste e container in generale.
La procedura funziona , l'ho provata solo che function ha delle prestazioni davvero misere ma dell ordine delle 3 volte una chiamata normale mentre le funzioni virtuali hanno delle prestazione dello 0.4 piu lente delle funzini normali.
fine della fola ho si un buon metodo di configurazione ma ho delle prestazioni misere ed ero partito per ottenere le prestazioni.
esiste qualcosa , un functore o qualcosa del genere un po piu prestazionale?
domanda , esiste un modo per avere una function un po piu veloce ?