Geant4 Visualization : Qt Driver
Developments for Geant4.9.4
Geant4 Workshop
Laurent Garnier
Loose time when moving a component is in visualization part. Thank to Shark (mac OSX), I identify two bootle neck : glBegin (47% of OGL time) and glFlush (44%). After some code optimisations :
Mac OSX 10.5 : Immediate Mode
| First draw time (sec) | Mem (Mo) | Rotation (fps) | |
| Geant 4.9.3 | 5 | 45 | 0,46 |
| Geant 4.9.4 | 6 | 48 | 0,53 |
Mac OSX 10.6 : Immediate Mode
| Geant 4.9.3 | 5 | 40 | 0,6 |
| Geant 4.9.4 | 6 | 40(=) | 0,6 |
Mac OSX 10.5 : Stored Mode
| Geant 4.9.3 | 94 | 270 | 1,2 |
| Geant 4.9.4 | 72 (x1,3) | 270 (=) | 2,66 (x2,2) |
Mac OSX 10.6 : Stored Mode
| Geant 4.9.3 | 13 | 227 | 3,73 |
| Geant 4.9.4 | 11 (x1,2) | 210 (-5%) | 5,3 (x1,43) |
La librarie STL est organisée en plusieurs parties. Il existe principalement 3 types d'éléments
On ajoute
|
List : liste doublement chaînée |
|
|
Vector : tableau à 1 dimension |
|
|
Set/Multiset : ensemble |
|
|
Map/Multimap : tableau associatif |
|
| Utilisation des listes |
#include <iostream>
#include <list>
int main()
{
std::list<int> l;
l.push_front(3);
l.push_front(2);
l.push_back(4);
l.pop_front();
l.pop_back();
std::cout << l.front() << std::endl;
std::cout << l.back() << std::endl;
return 0;
}
|
| Comme pour tous les composants STL, il faut toujours se placer dans l'espace de nommage std:: |
#include <iostream>
#include <list>
int main()
{
std::list<int> l;
l.push_front(3);
l.push_front(2);
l.push_back(4);
l.pop_front();
l.pop_back();
std::cout << l.front() << std::endl;
std::cout << l.back() << std::endl;
return 0;
}
|
| Insère un élément dans la liste |
#include <iostream>
#include <list>
int main()
{
std::list<int> l;
l.push_front(3);
l.push_front(2);
l.push_back(4);
l.pop_front();
l.pop_back();
std::cout << l.front() << std::endl;
std::cout << l.back() << std::endl;
return 0;
}
|
| Retire un élément de la liste |
#include <iostream>
#include <list>
int main()
{
std::list<int> l;
l.push_front(3);
l.push_front(2);
l.push_back(4);
l.pop_front();
l.pop_back();
std::cout << l.front() << std::endl;
std::cout << l.back() << std::endl;
return 0;
}
|
| Accède à un élément de la liste |
#include <iostream>
#include <list>
int main()
{
std::list<int> l;
l.push_front(3);
l.push_front(2);
l.push_back(4);
l.pop_front();
l.pop_back();
std::cout << l.front() << std::endl;
std::cout << l.back() << std::endl;
return 0;
}
|
| Utilisation des vecteurs |
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(3);
v.push_back(4);
std::cout << v[0] << std::endl;
v.at( 1 ) = 5;
std::cout << v.back() << std::endl;
v.clear();
return 0;
}
|
| Insère un élément dans le vecteur |
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(3);
v.push_back(4);
std::cout << v[0] << std::endl;
v.at( 1 ) = 5;
std::cout << v.back() << std::endl;
v.clear();
return 0;
}
|
| Accède au 1er élément |
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(3);
v.push_back(4);
std::cout << v[0] << std::endl;
v.at( 1 ) = 5;
std::cout << v.back() << std::endl;
v.clear();
return 0;
}
|
| Modifie le 2è élément |
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(3);
v.push_back(4);
std::cout << v[0] << std::endl;
v.at( 1 ) = 5;
std::cout << v.back() << std::endl;
v.clear();
return 0;
}
|
| Accède au dernier élément du vecteur |
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(3);
v.push_back(4);
std::cout << v[0] << std::endl;
v.at( 1 ) = 5;
std::cout << v.back() << std::endl;
v.clear();
return 0;
}
|
| Supprime tous les éléments |
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(3);
v.push_back(4);
std::cout << v[0] << std::endl;
v.at( 1 ) = 5;
std::cout << v.back() << std::endl;
v.clear();
return 0;
}
|
#include <vector>
{
std::vector<int> v;
//
std::vector<int>::iterator it1 = v.begin();
std::vector<int>::iterator it2 = v.end();
}
#include <iostream>
#include <list>
int main()
{
std::list<int> liste;
for (unsigned int i = 0; i < 10; i++) {
liste.push_back(i);
}
std::list<int>::iterator it;
for (it = liste.begin(); it != liste.end(); ++it) {
int i = *it;
std::cout << "i = " << i << std::endl;
}
return (0);
}
|
| Déclaration |
#include <iostream>
#include <list>
int main()
{
std::list<int> liste;
for (unsigned int i = 0; i < 10; i++) {
liste.push_back(i);
}
std::list<int>::iterator it;
for (it = liste.begin(); it != liste.end(); ++it) {
int i = *it;
std::cout << "i = " << i << std::endl;
}
return (0);
}
|
| 1er élément |
#include <iostream>
#include <list>
int main()
{
std::list<int> liste;
for (unsigned int i = 0; i < 10; i++) {
liste.push_back(i);
}
std::list<int>::iterator it;
for (it = liste.begin(); it != liste.end(); ++it) {
int i = *it;
std::cout << "i = " << i << std::endl;
}
return (0);
}
|
| Pointe après le dernier élément |
#include <iostream>
#include <list>
int main()
{
std::list<int> liste;
for (unsigned int i = 0; i < 10; i++) {
liste.push_back(i);
}
std::list<int>::iterator it;
for (it = liste.begin(); it != liste.end(); ++it) {
int i = *it;
std::cout << "i = " << i << std::endl;
}
return (0);
}
|
| On incrémente l'itérateur |
#include <iostream>
#include <list>
int main()
{
std::list<int> liste;
for (unsigned int i = 0; i < 10; i++) {
liste.push_back(i);
}
std::list<int>::iterator it;
for (it = liste.begin(); it != liste.end(); ++it) {
int i = *it;
std::cout << "i = " << i << std::endl;
}
return (0);
}
|
| On accède à l'élément par déréférencement |
#include <iostream>
#include <list>
int main()
{
std::list<int> liste;
for (unsigned int i = 0; i < 10; i++) {
liste.push_back(i);
}
std::list<int>::iterator it;
for (it = liste.begin(); it != liste.end(); ++it) {
int i = *it;
std::cout << "i = " << i << std::endl;
}
return (0);
}
|
Questions ?