Запуская valgrind, я получаю следующую обратную трассировку. Существует множество проблем с утечками памяти, и многие из них, похоже, связаны с GLM. Часть вывода valgrind, связанная с ошибкой сегментации, находится здесь:
Код: Выделить всё
==14529== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==14529== General Protection Fault
==14529== at 0x4080CB: Camera::recalculateViewMatrix() (type_mat4x4.inl:136)
==14529== by 0x40863D: Camera::moveUp() (Camera.cpp:86)
==14529== by 0x17CF79F09996D848: ???
==14529== by 0x530487F: ??? (in /usr/lib/x86_64-linux-gnu/libglut.so.3.9.0)
==14529== by 0xFFEFFFF6F: ???
==14529== by 0x406C46: update() (Util.cpp:87)
==14529== by 0x50DE12D: glutMainLoop (in /usr/lib/x86_64-linux-gnu/libglut.so.3.9.0)
==14529== by 0x403F20: main (main.cpp:36)
Вот результат ldd:
Код: Выделить всё
linux-vdso.so.1 => (0x00007fff4c724000)
libGLEW.so.1.13 => /usr/lib/x86_64-linux-gnu/libGLEW.so.1.13 (0x00007f64442f0000)
libglut.so.3 => /usr/lib/x86_64-linux-gnu/libglut.so.3 (0x00007f64440a8000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f6443e34000)
libassimp.so.3 => /usr/lib/x86_64-linux-gnu/libassimp.so.3 (0x00007f64435a5000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f64431c1000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6442eb8000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6442ca0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f64428d6000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f644259c000)
libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f644238c000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f6442186000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f6441f6c000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f6441d43000)
libxcb-dri3.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0 (0x00007f6441b40000)
libxcb-present.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-present.so.0 (0x00007f644193d000)
libxcb-sync.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1 (0x00007f6441736000)
libxshmfence.so.1 => /usr/lib/x86_64-linux-gnu/libxshmfence.so.1 (0x00007f6441533000)
libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007f6441302000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f64410f0000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f6440eed000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f6440ce7000)
libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f6440ae5000)
libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007f64408cc000)
libxcb-dri2.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0 (0x00007f64406c7000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f64404a5000)
libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007f6440293000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6440076000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f643fe72000)
libminizip.so.1 => /usr/lib/x86_64-linux-gnu/libminizip.so.1 (0x00007f643fc67000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6444573000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f643fa63000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f643f85d000)
Код: Выделить всё
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Bay Trail
OpenGL core profile version string: 4.2 (Core Profile) Mesa 18.0.5
OpenGL core profile shading language version string: 4.20
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 18.0.5
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 18.0.5
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
OpenGL ES profile extensions:
Цикл update(). Это вызывается в GluIdleFunc() и отвечает за обновление векторов камеры. Класс Camera является одноэлементным, поэтому все вызовы функций используют что-то вроде Camera::Instance()->updateMatrice() (например). Instance() возвращает указатель на статический объект камеры, и если он не существует, r:
Код: Выделить всё
void update() {
using Clock = std::chrono::high_resolution_clock;
auto startFrameTime = Clock::now();
// Update camera
Camera::Instance()->updateCameraVectors();
Camera::Instance()->recalculateViewMatrix();
Camera::Instance()->sendMatricesToShader();
auto endFrameTime = Clock::now();
auto frameDuration = std::chrono::duration_cast(endFrameTime - startFrameTime);
lastFrameTimeLength = (float)frameDuration.count();
Код: Выделить всё
void Camera::recalculateViewMatrix() {
viewMatrix = glm::lookAt(cameraPOS, cameraPOS + cameraFront, cameraUp);
}
Код: Выделить всё
void Camera::moveUp() {
cameraPOS += cameraSpeed * cameraFront;
recalculateViewMatrix();
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... ly-instant
Мобильная версия