Bonjour à tous, Tout d'abord merci à ceux qui prendront le temps de m'aider.
Faisons simple pour commencer : Dans un projet C++ utilisant OpenGL sur Qt (Linux), je reçois des données que je dois mettre en forme (c'est à dire que je dois afficher). Je dois réaliser une vue radar, pour cela je reçois 2240 cellules * 4096azimuts toutes les 1s (autrement dit, j'ai un cercle composé de 4096 azimuts/radiales contenant tous 2240 carrés représentants une cellule radar). Mon but est donc d'afficher ce cercle .
Pour le moment j'ai réalisé l'affichage de mon cercle 2D en plaçant les coordonnées initiales de chaque cellule. Les coordonnées des cellules sont contenus dans VBO_GRID. Maintenant j'essaye de remplir VBO_COLORS qui "en gros" est censé récupéré dans l'ordre croissant des azimuts (de 0 à 359) la couleur de chaque cellule.
J'ai 2 threads à prendre en compte : - helloglwidget => classe dans laquelle je m'occupe de l'affichage OpenGL - vertexConversion => classe dans laquelle j'effectue des traitements pour récupérer tous mes niveaux de couleurs de chaque cellule toutes les secondes
J'aimerai simplement que vertexConversion remplissent VBO_COLORS des couleurs reçues, et lorsque VBO_COLORS est MAJ provoqué le changement de couleurs des cellules du cercle sans pour autant avoir à redessiner tout le cercle qui provoque des problèmes de transfert .
Voici les problèmes que pour le moment j'ai : - Chute de performance lorsque VBO_COLORS MAJ - Fonction d'update du VBO_COLORS appelé uniquement lorsque je réalise des déplacements du dessin/zoom qui provoque un "update" forcé - Grille polaire redessiner entièrement à chaque changement
Voici le code que j'ai en espérant que vous pouvez m'aider, merci !
#include "vertexconversion.h"
#include <QMutex>
#include <QDebug>
#include <omp.h>
#include <QOpenGLFunctions>
#include "packetprocess.h"
#include "packet_struc.h"
#include "shareddefinitions.h"
vertexConversion::vertexConversion(QObject* parent) : QThread(parent)
{
}
void vertexConversion::run()
{
QVector<RadarCell> cells;
//Paire azimut_start et signalLevel
std::vector<float> signalLevels;
signalLevels.reserve(2240*4096); //2240 cellules + 1 Azimut_Start
int cpt=0;
firstAzimuthReceived = false;
while (!stopFlag)
{
while (packetprocess::cellQueue.try_dequeue(cells)) {
for (const auto& cell : cells)
{
/*Si on reçoit pour la première fois le 1er Azimut*/
if (!firstAzimuthReceived && cell.azimuth_start <=0)
{ firstAzimuthReceived=true; signalLevels.clear(); cpt=0; qDebug()<<"Premier reçu";}
/*Si on a déjà reçu le premier Azimut*/
if (firstAzimuthReceived)
{
float colorIntensity = convertSignalToColorIntensity(cell.signalLevel);
signalLevels.push_back(colorIntensity);
cpt++;
}
/*Si on a traité un tour complet : Càd si on a stack les 2240*4096 cellules*/
if (cpt>= 2240*4096)
{
qDebug()<<"Tour complet";
if(!dataReady.load(std::memory_order_acquire))
{
/*Màj du VBO couleurs*/
couleurs.enqueue(signalLevels);
dataReady.store(true, std::memory_order_release);
qDebug()<<"Transmission";
}else {
qDebug()<<"Pas de transmission";
}
/*Réinitialisation*/
signalLevels.clear();
cpt=0;
}
}
}
}
}
float vertexConversion::convertSignalToColorIntensity(float signalLevel)
{
return std::min(std::max(signalLevel, 0.0f), 1.0f);
}
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.