J'ai récemment travaillé sur un lecteur de nuage de points qui devrait être idéalement capable de visualiser des points de données de terrain à partir d'une capture lidar et de les afficher séquentiellement à environ 30 images par seconde. Cependant, je semble être arrivé à un mur résultant de PCI-e IO. Ce que je dois faire pour chaque image est de charger un gros nuage de points stocké en mémoire, puis calculer une carte de couleurs en fonction de la hauteur (j'utilise quelque chose comme la carte de jet de matlab), puis transférer les données au GPU . Cela fonctionne très bien sur les captures de nuages avec des points < un million. Cependant, à environ 2 millions de points, cela commence à ralentir en dessous de 30 images par seconde. Je sais que cela est beaucoup de données (2 millions d'images par points * [3 flotteurs par point + 3 flotteurs par point de couleur] * 4 octets par flotteur * 30 images par seconde = autour de 1,34 giga-octets par seconde)Accélération d'une application OpenGL liée à IO
mon code de rendu ressemble à ce moment:
glPointSize(ptSize);
glEnableClientState(GL_VERTEX_ARRAY);
if(colorflag) {
glEnableClientState(GL_COLOR_ARRAY);
} else {
glDisableClientState(GL_COLOR_ARRAY);
glColor3f(1,1,1);
}
glBindBuffer(GL_ARRAY_BUFFER, vbobj[VERT_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, vertData, GL_STREAM_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbobj[COLOR_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, colorData, GL_STREAM_DRAW);
glColorPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_POINTS, 0, numPoints);
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Le pointeur pour vertData et ColorData sont changés chaque image. Ce que je voudrais être capable de faire est de pouvoir jouer à un minimum de 30 images par seconde, même si plus tard, j'utilise de gros nuages de points pouvant atteindre jusqu'à 7 millions de points par image. Est-ce seulement possible? Ou peut-être serait-il plus facile de les mettre en grille et de construire une carte de hauteur et de l'afficher en quelque sorte? Je suis encore assez novice en programmation 3D, donc tout conseil serait apprécié.
avez-vous vraiment besoin d'envoyer toutes les données de chaque trame? Ne pouvez-vous pas simplement mettre à jour la hauteur en cas de besoin, n'envoyez que ceci sur le GPU, et calculer la couleur dans un shader? Qu'est-ce que vous avez à mettre à jour sur le processeur qui ne peut pas être fait sur le GPU? – Calvin1602
Le problème que j'ai est que les nuages de points sont tous pré-enregistrés, donc je dois juste les afficher. Je ne fais pas vraiment de calculs, donc je ne peux pas simplement mettre à jour les choses: \ – Xzhsh
J'ai la même idée que @ Calvin1602. Je ne sais pas si cela pourrait aider: http://stackoverflow.com/questions/371898/how-does-differential-execution-work mais ce qu'il fait est de comparer les choses nouvelles vs anciennes, obtenir des différences, et d'utiliser les mettre à jour une structure de données "distante", si la bande passante est un problème. –