- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在 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 ()
最佳答案
免责声明:这不是解决方案,而是可以帮助您识别或解决问题的一些步骤。
What's more killing the game and running it again doesn't help
这意味着您很可能面临驱动程序级别的问题。任何应用程序问题都可以通过重新启动来解决(假设您的应用程序运行相同)。它卡住的事实,加上对 sem_waitcommon
的引用和查看堆栈,当然意味着您遇到了死锁,源自 libbrcmEGL.so
,视频驱动程序。坏消息是,视频驱动程序中会出现错误,解决起来可能相当复杂,而且由于驱动程序是封闭源代码,您无法自行修复它,也无法让社区修复它...
由于您使用的软件和版本的特定组合,我无法找到与您的问题完全匹配的问题,这可能指向一个尚未识别的错误:
下面是一些步骤,从最简单的开始
dmesg
这是一个非常简单的第一步,可能会产生有值(value)的信息。出现问题时,在第一次和第二次卡住后,查看是否有任何显示。任何重要的问题都会在那里提出,并照亮您的问题。
第一步可能是在raspberrypi/linux中报告问题, 有一个 MVE。这可能需要一些时间,但也许是解决该问题的最佳选择,因为 GPU 的固件(Videocore IV,如 libbrcmEGL.so
)是封闭源代码。
您的错误可能是由于驱动程序上的一组特定操作最终触发了您所看到的错误。我建议将您的代码减少到最少,以尝试确定是什么触发了问题。不幸的是,它随机发生的事实无济于事。即使这可能无法解决核心问题,您也可以绕过它。
升级或降级您正在使用的 SFML 和 SFML PI 的版本。同样,这不会解决核心问题,但可能会避免它。
如果这是视频驱动程序中的回归,您可以通过刷新旧版本的分发来修复它,来自 here
为了尽量减少工作量,您可以尝试从 raspberry/firmware 手动 check out 不同版本的 libEGL*
和 libbrcmEGL.so
,但您可能会遇到与它们的依赖项的兼容性问题。
我知道...EGL 肯定会给您带来更好的性能,您可能不需要那个桌面和组合。但是考虑到更大的社区和使用,您遇到的麻烦可能会少得多。因为它使用 libbrcmGLESv2.so
,所以可以保证不会执行相同(可能有问题)的代码。
关于c++ - eglSwapBuffers 永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52918686/
今天我发现我的opengles程序帧时间有时会不明原因增加,通常是16ms,但有时完成一帧需要33ms。经过数小时的分析和研究,我发现了原因:帧时间增加是因为“eglSwapBuffers”比平时花费
我正在 Raspberry Pi 3 上开发一个简单的游戏。作为操作系统,我使用官方的 Raspbian Stretch Lite。该游戏在没有 X 服务器的情况下运行,并使用 SFML PI 在 C
我正在 Android 和 native C++ 中使用 EGL 1.1 为 android 实现场景绘制。 当前使用 Android 的 glSurfaceView - 当后台缓冲区和前台缓冲区交换
我在使用 NDK 和 egl 命令的 Android 平板电脑上遇到渲染时间非常短的问题。我对 eglSwapBuffers 进行了定时调用,并且花费的时间不定,经常超过设备帧速率。我知道它与刷新同步
我的理解是,当使用 GLSurfaceview 时,eglSwapBuffers 会在每一帧自动调用,所以: onDrawFrame() { //Your drawing code here //sy
我有一个视频效果应用程序,我在其中使用 OpenGL 绘制到帧缓冲区对象,然后将生成的纹理绘制到显示器,然后是 MediaCodec 输入表面(如果该应用程序正在编码)。 我最初是在同步模式下为 AP
我目前将 OpenGL 应用程序(仅绘制 2D 内容)移植到 OpenGL ES,以便在 Raspberry Pi 上正常运行。 由于某种原因,eglSwapBuffers 花费了大量时间。这是我所做
我正在使用抛出异常的 And 引擎开发游戏。其实我不知道发生异常的地方。市场上多次报道。 java.lang.RuntimeException: eglSwapBuffers failed:
我正在开发一个 Android Unity 插件,允许用户记录他/她的游戏过程 我的解决方案概述: 使用 OpenGl FrameBufferObject (FBO) 让 Unity 渲染离屏到这个
我在 Google Play 商店中有一个 OpenGL 应用程序,我每天都遇到异常: java.lang.RuntimeException: eglSwapBuffers failed: EGL_S
我想知道在使用 xlib 时如何使用 eglSwapBuffers 正确启用 vsync。似乎对 eglSwapInterval 的调用被简单地忽略了。 我在窗口模式和全屏模式下运行。是否有可能在窗口
我有安卓游戏,使用libgdx框架 在 Google Play 商店中有报告: java.lang.RuntimeException: eglSwapBuffers failed: EGL_SUCCE
我正在为 Android 平台开发一款游戏,使用 Java 和 LibGDX 引擎。 我遇到了一个奇怪的问题,我的游戏中的 FPS 每 30-40 秒从 57-60 帧连续下降到 40-45 帧,然后
我是一名优秀的程序员,十分优秀!