【发布时间】:2018-10-21 18:46:37
【问题描述】:
我正在 Raspberry Pi 3 上开发一个简单的游戏。作为操作系统,我使用官方的 Raspbian Stretch Lite。该游戏在没有 X 服务器的情况下运行,并使用 SFML PI 库在 C++ 中开发。
问题是游戏时常卡顿。它可能在运行游戏几秒钟或几个小时后发生,但迟早总会发生。 freeze 的堆栈跟踪表明 eglSwapBuffers 永远不会返回。更重要的是杀死游戏并再次运行它并没有帮助 - 它在eglCreatePbufferSurface调用启动期间冻结。它在重新启动后再次启动。这种冻结的原因是什么?我可以以某种方式调试它吗?我很担心它可能是由 SFML PI 或 EGL 实现中的错误引起的。
主线程冻结期间主线程的堆栈跟踪:
Thread 1 (Thread 0x76293000 (LWP 802)):
#0 0x76f3c014 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=1,
futex_word=0x76459b84 <pool_mem+1444>) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
#1 do_futex_wait (sem=sem@entry=0x76459b84 <pool_mem+1444>, abstime=0x0) at sem_waitcommon.c:115
#2 0x76f3c158 in __new_sem_wait_slow (sem=0x76459b84 <pool_mem+1444>, abstime=0x0) at sem_waitcommon.c:282
#3 0x76804548 in eglSwapBuffers () from /opt/vc/lib/libbrcmEGL.so
#4 0x76ed14b8 in sf::Window::display() () from /usr/lib/libsfml-window.so.2.4
#5 0x000a8038 in Game::run() ()
#6 0x0013d9ec in main ()
杀死游戏后启动过程中冻结的堆栈跟踪:
Thread 1 (Thread 0x76223000 (LWP 1001)):
#0 0x76ecc014 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=1,
---Type <return> to continue, or q <return> to quit---
futex_word=0x767c1a58 <khrn_queue+76>) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
#1 do_futex_wait (sem=sem@entry=0x767c1a58 <khrn_queue+76>, abstime=0x0) at sem_waitcommon.c:115
#2 0x76ecc158 in __new_sem_wait_slow (sem=0x767c1a58 <khrn_queue+76>, abstime=0x0) at sem_waitcommon.c:282
#3 0x763eeb60 in vchiu_queue_pop () from /opt/vc/lib/libvchiq_arm.so
#4 0x7679b014 in rpc_recv () from /opt/vc/lib/libbrcmEGL.so
#5 0x76795b54 in egl_surface_create () from /opt/vc/lib/libbrcmEGL.so
#6 0x767923b8 in eglCreatePbufferSurface () from /opt/vc/lib/libbrcmEGL.so
#7 0x76e635f4 in sf::priv::EglContext::EglContext(sf::priv::EglContext*) () from /usr/lib/libsfml-window.so.2.4
#8 0x76e5f2b0 in sf::priv::GlContext::initResource() () from /usr/lib/libsfml-window.so.2.4
#9 0x76e5f95c in sf::GlResource::GlResource() () from /usr/lib/libsfml-window.so.2.4
#10 0x76e60f54 in sf::Window::Window() () from /usr/lib/libsfml-window.so.2.4
#11 0x76ea2d7c in sf::RenderWindow::RenderWindow(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings const&) () from /usr/lib/libsfml-graphics.so.2.4
#12 0x000a8642 in Game::Game() ()
#13 0x0013d9e6 in main ()
【问题讨论】:
-
您能提供更多信息吗?您的所有驱动程序都是最新的吗?游戏是多线程的吗?您可以做些什么来实现它(即使只是以更快的速度)?
-
除非您正在做一些时髦的事情,否则这对我来说似乎是一个驱动程序问题。当这种情况发生时,您的
dmesg日志中是否有任何相关错误?了解您拥有的确切主板、内核版本和驱动程序版本也很重要 -
@gabe870 我不知道,你能提出一些建议吗?尽快致电
sf::Window::display?是的,不幸的是游戏是多线程的,但我没有从不同于主线程的线程调用任何SFML或EGL/OpenGLAPI。 @AdrienLeravat 我没有检查dmesg日志。它发生在 Raspberry Pi 3 B 和 Raspberry Pi 3 B+ 上。内核版本:4.14.87-v7+ 固件:2018 年 12 月 4 日 16:50:03 版本 1f3414729f43ef3b977a910a0d811a759562e1cf(干净)(发布)
标签: c++ raspberry-pi egl