2014-11-21 12 views
7

Ho un progetto Qt creato con un file *.pro di cui ho bisogno per migrarlo in un CMakeLists. Questo progetto utilizza una semplice animazione OpenGL per mostrare un modello 3D di una mano. Lo cambio già per usare CMake, ma ho riscontrato 2 problemi. (Il programma viene compilato, ma non funziona correttamente)OpenGL + Qt con CMake

  1. il consumo di memoria del programma passa dall'essere 20-50 MB utilizzando il file *.pro, a 1,3 GB utilizzando CMake (Forse qualche libreria viene caricata completamente o qualcosa del genere? ?)
  2. il programma funziona incredibilmente lento (come 1 fotogramma ogni 5-10 secondi) in contrasto con la velocità di utilizzare il file *.pro (circa. 3 fotogrammi al secondo)

la domanda è: che cosa ho sto sbagliando e come posso ripararlo?

Ecco il file *.pro:

QT += core gui opengl 

TARGET = RGBD_3D_Viewer 
TEMPLATE = app 


SOURCES += main.cpp\ 
      mainwindow.cpp \ 
      glwidget.cpp \ 
      glwidget_Camera.cpp \ 
      glwidget_Comm.cpp \ 
      glwidget_Extractors.cpp \ 
      glwidget_Rendering.cpp \ 
      glwidget_Video.cpp \ 
      glwidget_UI_Mouse.cpp \ 
      glwidget_OpenGL.cpp \ 
      mainwindow_Comm.cpp \ 
      mainwindow_GUI.cpp \ 
      model.cpp \ 
      cameraSet.cpp \ 
      model_Mesh.cpp \ 
      model_Skeleton.cpp \ 
      model_Skin.cpp \ 
      model_Extra_SkinningStuff.cpp \ 
      animation.cpp \ 
      animation_Transform.cpp \ 
      videoSequence.cpp \ 
      sequence.cpp \ 
      mainwindow_UI_Keyboard_Mouse.cpp \ 
      tracker.cpp \ 
      mainwindow_FrameNumber.cpp \ 
      model_Limits.cpp \ 
      animation_Files_CompleteSequence.cpp \ 
      mainwindow_MODELS_INFO.cpp \ 
      modelSET.cpp \ 
      animation_0_RotAxes_Limits.cpp \ 
      myMATH.cpp \ 
      types_Background.cpp \ 
      model_Extra_VOI.cpp \ 
      fingertipSet.cpp \ 
      tracker_OnIndexChange.cpp \ 
      tracker_wFeatureSet.cpp 

HEADERS += mainwindow.h \ 
      glwidget.h \ 
      model.h \ 
      cameraSet.h \ 
      animation.h \ 
      videoSequence.h \ 
      sequence.h \ 
      tracker.h \ 
      mymath.h \ 
      modelSET.h \ 
      ui_mainwindow.h \ 
      featureSet.h \ 
      typesBackground.h \ 
      fingertipSet.h 

FORMS += mainwindow.ui 



INCLUDEPATH += /usr/include/eigen3/ 

INCLUDEPATH += /home/cvg11/projects/development/RGBD_3D_Viewer/glm 


LIBS += -L/usr/local/lib/ 
LIBS += -lopencv_core 
LIBS += -lopencv_highgui 


QMAKE_CXXFLAGS += -O3 
QMAKE_CXXFLAGS += -frounding-math 
#QMAKE_CXXFLAGS += -std=c++0x 

Ecco il file CMakeLists.txt:

project(3d_viewer) 
cmake_minimum_required(VERSION 2.6 FATAL_ERROR) 

include_directories(${CMAKE_CURRENT_BINARY_DIR}) 
include_directories(${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/glm) 

find_package(PkgConfig) 
pkg_check_modules(EIGEN3 REQUIRED eigen3) 
include_directories(${EIGEN3_INCLUDE_DIRS}) 

# Opencv required 
find_package(OpenCV COMPONENTS core highgui REQUIRED) 
include_directories(${OPENCV_INCLUDE_DIRS}) 
link_directories(${OPENCV_LIBRARY_DIRS}) 
add_definitions(${OPENCV_DEFINITIONS}) 

message("\n\nFound OpenCV\n\n") 


# QT4 required 
find_package(Qt4 COMPONENTS QtCore QtGui QtOpenGL REQUIRED) 
set(QT_USE_QTOPENGL TRUE) 
include(${QT_USE_FILE}) 
add_definitions(${QT_DEFINITIONS}) 

message("\n\nFound QT4\n\n") 


INCLUDE_DIRECTORIES(${QT_QTOPENGL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) 

#set the default path for built executables to the "bin" directory 
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) 
#set the default path for built libraries to the "lib" directory 
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) 


file(GLOB VIEWER_SOURCES src/*.cpp) 

file(GLOB VIEWER_INCLUDES include/*.h) 


# set QT headers 
SET(QT_HEADERS 
    include/mainwindow.h 
    include/glwidget.h 
    ) 

#set QT forms 
SET(QT_FORMS 
    ui/mainwindow.ui 
) 

# create moc for QT 
QT4_WRAP_CPP(QT_MOC ${QT_HEADERS}) 

# process ui 
QT4_WRAP_UI(QT_FORMS_HEADERS ${QT_FORMS}) 

ADD_EXECUTABLE(3d_viewer ${VIEWER_SOURCES} ${VIEWER_INCLUDES} 
    ${QT_HEADERS} 
    ${QT_MOC} 
    ${QT_FORMS}) 

TARGET_LINK_LIBRARIES(3d_viewer ${QT_LIBRARIES} ${OpenCV_LIBS}) 
set_property(TARGET 3d_viewer PROPERTY COMPILE_DEFINITIONS QT_SHARED) 

EDIT:

Qui ci sono le due uscite di make VERBOSE=1 (ho appena mostrano l'ultimo anello e uno dei file poiché il resto dei file sono uguali)

CMake:

[100%] Building CXX object CMakeFiles/3d_viewer.dir/include/moc_glwidget.cxx.o 
/usr/bin/c++ -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_SHARED -O3 -DNDEBUG -I/home/cvg11/projects/development/RGBD_3D_Viewer/build -I/home/cvg11/projects/development/RGBD_3D_Viewer/include -I/home/cvg11/projects/development/RGBD_3D_Viewer/glm -I/usr/include/eigen3 -I/usr/local/include/opencv -I/usr/local/include -isystem /usr/include/qt4 -isystem /usr/include/qt4/QtOpenGL -isystem /usr/include/qt4/QtGui -isystem /usr/include/qt4/QtCore -o CMakeFiles/3d_viewer.dir/include/moc_glwidget.cxx.o -c /home/cvg11/projects/development/RGBD_3D_Viewer/build/include/moc_glwidget.cxx 
Linking CXX executable ../bin/3d_viewer 
/usr/local/bin/cmake -E cmake_link_script CMakeFiles/3d_viewer.dir/link.txt --verbose=1 
/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/3d_viewer.dir/src/mainwindow_FrameNumber.cpp.o CMakeFiles/3d_viewer.dir/src/animation.cpp.o CMakeFiles/3d_viewer.dir/src/glwidget_OpenGL.cpp.o CMakeFiles/3d_viewer.dir/src/main.cpp.o CMakeFiles/3d_viewer.dir/src/mainwindow_Comm.cpp.o CMakeFiles/3d_viewer.dir/src/glwidget_Comm.cpp.o CMakeFiles/3d_viewer.dir/src/myMATH.cpp.o CMakeFiles/3d_viewer.dir/src/model.cpp.o CMakeFiles/3d_viewer.dir/src/glwidget_Rendering.cpp.o CMakeFiles/3d_viewer.dir/src/model_Extra_VOI.cpp.o CMakeFiles/3d_viewer.dir/src/videoSequence.cpp.o CMakeFiles/3d_viewer.dir/src/cameraSet.cpp.o CMakeFiles/3d_viewer.dir/src/model_Extra_SkinningStuff.cpp.o CMakeFiles/3d_viewer.dir/src/mainwindow_MODELS_INFO.cpp.o CMakeFiles/3d_viewer.dir/src/animation_0_RotAxes_Limits.cpp.o CMakeFiles/3d_viewer.dir/src/modelSET.cpp.o CMakeFiles/3d_viewer.dir/src/glwidget_Video.cpp.o CMakeFiles/3d_viewer.dir/src/animation_Transform.cpp.o CMakeFiles/3d_viewer.dir/src/glwidget_Camera.cpp.o CMakeFiles/3d_viewer.dir/src/sequence.cpp.o CMakeFiles/3d_viewer.dir/src/animation_Files_CompleteSequence.cpp.o CMakeFiles/3d_viewer.dir/src/glwidget_UI_Mouse.cpp.o CMakeFiles/3d_viewer.dir/src/model_Skin.cpp.o CMakeFiles/3d_viewer.dir/src/tracker_wFeatureSet.cpp.o CMakeFiles/3d_viewer.dir/src/tracker_OnIndexChange.cpp.o CMakeFiles/3d_viewer.dir/src/mainwindow.cpp.o CMakeFiles/3d_viewer.dir/src/types_Background.cpp.o CMakeFiles/3d_viewer.dir/src/glwidget_Extractors.cpp.o CMakeFiles/3d_viewer.dir/src/model_Limits.cpp.o CMakeFiles/3d_viewer.dir/src/model_Skeleton.cpp.o CMakeFiles/3d_viewer.dir/src/tracker.cpp.o CMakeFiles/3d_viewer.dir/src/model_Mesh.cpp.o CMakeFiles/3d_viewer.dir/src/mainwindow_UI_Keyboard_Mouse.cpp.o CMakeFiles/3d_viewer.dir/src/fingertipSet.cpp.o CMakeFiles/3d_viewer.dir/src/mainwindow_GUI.cpp.o CMakeFiles/3d_viewer.dir/src/glwidget.cpp.o CMakeFiles/3d_viewer.dir/include/moc_mainwindow.cxx.o CMakeFiles/3d_viewer.dir/include/moc_glwidget.cxx.o -o ../bin/3d_viewer -L/usr/local/cuda/lib64 -rdynamic -lglut -lXmu -lXi -lQtOpenGL -lQtGui -lQtCore /usr/local/lib/libopencv_core.so.2.4.9 /usr/local/lib/libopencv_highgui.so.2.4.9 /usr/local/lib/libopencv_core.so.2.4.9 -Wl,-rpath,/usr/local/cuda/lib64:/usr/local/lib -Wl,-rpath-link,/usr/local/lib 
make[2]: Leaving directory `/home/cvg11/projects/development/RGBD_3D_Viewer/build' 
/usr/local/bin/cmake -E cmake_progress_report /home/cvg11/projects/development/RGBD_3D_Viewer/build/CMakeFiles 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 
[100%] Built target 3d_viewer 

*.pro progetto:

g++ -c -pipe -frounding-math -O3 -O2 -w -D_REENTRANT -DQT_WEBKIT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/include/eigen3 -I../../projects/development/RGBD_3D_Viewer/glm -I/usr/X11R6/include -I. -I. -o moc_mainwindow.o moc_mainwindow.cpp 
/usr/bin/moc-qt4 -DQT_WEBKIT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/include/eigen3 -I../../projects/development/RGBD_3D_Viewer/glm -I/usr/X11R6/include -I. -I. glwidget.h -o moc_glwidget.cpp 
g++ -c -pipe -frounding-math -O3 -O2 -w -D_REENTRANT -DQT_WEBKIT -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4 -I/usr/include/eigen3 -I../../projects/development/RGBD_3D_Viewer/glm -I/usr/X11R6/include -I. -I. -o moc_glwidget.o moc_glwidget.cpp 
g++ -Wl,-O1 -o RGBD_3D_Viewer main.o mainwindow.o glwidget.o glwidget_Camera.o glwidget_Comm.o glwidget_Extractors.o glwidget_Rendering.o glwidget_Video.o glwidget_UI_Mouse.o glwidget_OpenGL.o mainwindow_Comm.o mainwindow_GUI.o model.o cameraSet.o model_Mesh.o model_Skeleton.o model_Skin.o model_Extra_SkinningStuff.o animation.o animation_Transform.o videoSequence.o sequence.o mainwindow_UI_Keyboard_Mouse.o tracker.o mainwindow_FrameNumber.o model_Limits.o animation_Files_CompleteSequence.o mainwindow_MODELS_INFO.o modelSET.o animation_0_RotAxes_Limits.o myMATH.o types_Background.o model_Extra_VOI.o fingertipSet.o tracker_OnIndexChange.o tracker_wFeatureSet.o moc_mainwindow.o moc_glwidget.o -L/usr/lib/x86_64-linux-gnu -L/usr/X11R6/lib -L/usr/local/lib/ -lopencv_core -lopencv_highgui -lQtOpenGL -lQtGui -lQtCore -lGL -lpthread 

Ho provato ad aggiungere/rimuovere il flag -frounding-matematica senza avere alcuna differenza apprezzabile ...

+0

qmake ha -O3, non in cmake. È questa la causa? – xgdgsc

+0

Hai confrontato i comandi di compilazione e collegamento generati da ogni strumento? – Darryl

+0

@xgdgsc Ho controllato entrambi 'make VERBOSE = 1' e in entrambi hanno -O3 (in modalità rilascio, cmake aggiunto per impostazione predefinita) – api55

risposta

3

Sembra che tu stia cercando di cambiare il valore del livello di ottimizzazione con qmake nel modo sbagliato qui:

QMAKE_CXXFLAGS += -O3 

Il problema con questa linea è che g ++ utilizzerà -O2 per la fase di compilazione e -O1 per la fase di collegamento per impostazione predefinita. Sembra che vogliate cambiare solo la fase del compilatore poiché non specificate i flag del linker. Tuttavia, += significa aggiunta con qmake, non override. Il modo corretto per raggiungere il tuo obiettivo originale sarebbe questo:

QMAKE_CXXFLAGS_RELEASE -= -O2 
QMAKE_CXXFLAGS_RELEASE += -O3 

e la seguente riga di ignorare la fase di linker, troppo:

QMAKE_LFLAGS_RELEASE -= -O1 

sarà naturalmente necessario eseguire nuovamente qmake dopo questa modifica. Ora, -O3 significa che ottimizzerà le prestazioni e non lo spazio.Pertanto, la tua precedente preoccupazione per lo spazio potrebbe essere dovuta a questo. La seconda parte è ancora discutibile, tuttavia, senza dettagli concreti.

Il livello di ottimizzazione predefinito per cmake è diverso da qmake; è -O3. Si può facilmente verificare che eseguendo il seguente frammento cmake breve:

message("CMAKE_CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}") 

È necessario sincronizzare questi fino a portarli in linea. Per esempio, se si desidera utilizzare -O2 ovunque, ignorando il CMake, troppo, è necessario applicare qualcosa di questo:

set(CMAKE_CXX_FLAGS_RELEASE "-O2") 

Se si desidera utilizzare -O3, vedere la logica di cui sopra per il cambiamento che nel qmake file di progetto. Se si desidera utilizzare qualcos'altro come -Os, sarà necessario applicare entrambi i tipi di modifiche. Penso che sia più o meno così.

Per quanto riguarda il debug, si consiglia di disattivare completamente l'ottimizzazione in entrambi i casi per avere una migliore esperienza di debug, comunque!

In generale, è necessario decidere le prestazioni rispetto al tratto spaziale. Sembra che ti lamenti di entrambi, ma di per sé non otterrai perfezionismo ad entrambi. Se si desidera ottimizzare completamente lo spazio, utilizzare , per prestazioni, utilizzare -O3, se si desidera una soluzione compromessa, utilizzare qualcosa di intermedio, ecc.

+0

Grazie per la tua risposta, anche se ho trovato strano che con O3 (o più), l'esecuzione rallenta e il consumo di memoria aumenta ... Posso solo immaginare perché questo accada, ma non sicuro al 100%, lo spazio non è il problema principale, ma la prestazione è ... e si abbassa drasticamente ... Attualmente sto forzando la bandiera -O2 nella cmake proprio come hai spiegato tu, quindi penso che ti sia guadagnata la taglia;) Inoltre, cambio l'accettata domanda a questo dato che è meglio spiegato del mio – api55

+0

@ api55: sì, posso capire i problemi di spazio (anche se è drastico), ma non le prestazioni. Grazie. – lpapp

3

Dopo aver combattuto per i giorni con questo problema, ho scoperto che era il flag -O3. A quanto pare, Qt sta usando -O3 -O2 e sta prendendo l'ultimo, e per il collegamento finale sta usando -O1. Ho cambiato i flag per utilizzare -O2 e tutto ha iniziato a funzionare velocemente come dovrebbe e utilizzando una quantità normale di RAM.