关于VisionFive2运行Godot游戏引擎

Godot是一个强大的开源游戏引擎,它可以在很多设备上通过源码构建

我尝试构建了Godot但是并没有办法成功启动项目管理器,也就是只能无头服务器模式运行,编辑器和游戏项目都是无法运行的

最早提了这个issue

由于无法使用gcc构建,给文档提了个PR说明使用clang

构建方法:为 Linux、*BSD 平台编译 — Godot Engine (4.x) 简体中文文档

issue上面有提到禁用模块

有大佬能尝试构建成功吗,感谢

这暂时帮不上忙。 :face_exhaling:

不过我建议你考虑试试 fedora 或者 ubuntu 系统,mesa 支持纯软件运行 3d ,你看看能不能在这些系统里面编译并且启动。
我印象里这两个系统,可以用非常缓慢但是开源的的帧缓冲驱动进入图形界面。主要是测试能否运行,别考虑运行速度问题。另外,mesa 我记得可以增加环境变量来强制使用软件库,不过我忘了啥变量了。你也可以找来试试。
最主要的是,这两个系统的 gcc/clang 也都有最新版,防止旧版存在 bug 的问题。

这主要是测试是不是软件有 riscv64 的算法兼容问题,如果能确定换了系统用软件模拟运行。那么就是 3D 库这边的事情。

至于 libatomic 的问题,我估计你遇到的不是 gcc 的问题,是 riscv64 设计的问题。riscv64 的 atomic 指令貌似不完整,缺少一部分宽度的处理指令,所以编译时必须给 gcc 加上参数 -latomic 并且安装好 libatomic 库才能完整支持 atomic 的功能(不支持的原子操作指令会靠这个库的函数提供)。当然,你也可以说,这是 godot 的问题,没有严格检测 atomic 功能导致 riscv64 下忽略了 atomic 库的需求。

还有,错误信息 invalid pointer 或许才是问题关键。这个问题很大概率和编译器有关。真要解决可能需要上 gdb 了。
建议还是优先使用 gcc 编译。
llvm 体系下面的东西好像最近的几个版本都有问题。

1 Like

感谢您的回复,我准备尝试再用gcc编译一下源码

我尝试安装了libatomicl1这个包
sudo apt install libatomicl1
系统已安装版本12.2.0-10

gcc系统版本是12

我提交了 RISC-V device unable to build properly · Issue #88634 · godotengine/godot (github.com)看看官方如何回复,同时我准备尝试在Arch镜像(更新的版本继续尝试)

补充:
尝试在cwt-20编译Godot,成功使用GCC13编译,运行时没有报错(无图形化)

[user@ArchVF2 bin]$ ./godot.linuxbsd.editor.rv64
Godot Engine v4.2.1.stable.custom_build.b09f793f5 - https://godotengine.org
ERROR: X11 Display is not available
   at: DisplayServerX11 (platform/linuxbsd/x11/display_server_x11.cpp:5820)

(zenity:715): Gtk-WARNING **: 21:43:57.764: Failed to open display
ERROR: Unable to create DisplayServer, all display drivers failed.
   at: setup2 (main/main.cpp:2394)
ERROR: BUG: Unreferenced static string to 0: TextServerDummy
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: IPUnix
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: ResourceFormatImporterSaver
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: MovieWriterMJPEG
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: interface_added
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: TextServerAdvanced
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: ImageFormatLoader
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: ResourceFormatSaver
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: GDScriptEditorTranslationParserPlug                                                                                                             in
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: MovieWriterPNGWAV
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: ScriptLanguage
   at: unref (core/string/string_name.cpp:129)
ERROR: BUG: Unreferenced static string to 0: ResourceFormatLoader
   at: unref (core/string/string_name.cpp:129)
ERROR: Pages in use exist at exit in PagedAllocator: N7Variant5Pools11BucketLarg                                                                                                             eE
   at: ~PagedAllocator (./core/templates/paged_allocator.h:170)
ERROR: Pages in use exist at exit in PagedAllocator: N7Variant5Pools12BucketMedi                                                                                                             umE
   at: ~PagedAllocator (./core/templates/paged_allocator.h:170)
ERROR: Pages in use exist at exit in PagedAllocator: N7Variant5Pools11BucketSmal                                                                                                             lE
   at: ~PagedAllocator (./core/templates/paged_allocator.h:170)

将编译好的文件复制到debian镜像会报错
Segmentation fault

这估计是两边的函数库版本不一致导致某些接口不兼容进而内存位置不一致引起内核的保护机制给错误。
这只能在 debian 下面编译解决。

光安装不行的,还要让编译时编译器链接 atomic 。对应的应该是给 LDFLAGS 加上 -latomic 。不过有的软件不行,只能给 C{,XX}FLAGS 加上 -latomic 。
我印象里某些系统,会默认给一些架构默认加上 atomic 。这个问题不知道 gcc 怎么处理的,毕竟 rv64gc 是包含 A 扩展指令的。按说不应该依赖 atomic 库。

话说你可以试试在 debian 系统里面弄个 chroot 环境来编译成功,之后在 chroot 里面使用系统的 X 环境实现显示。
这里有参考:
https://wiki.archlinux.org/title/Chroot
里面 Run graphical applications from chroot 内容。

同时我在Arch上安装了gnome桌面环境,但是仍然无法运行,报错free(): invalid pointer

–rendering-driver opengl3_es也不好用

在debian编译不过的问题还没有找到,官方这样回复

同时Godot官方的开发者回复说是JH7110的GPU驱动问题,他们认为需要手动设置Mesa库

感谢您的指导,我将继续尝试chroot方法,同时请教一下如何替换mesa库

其实现在的问题是 VF2 的系统,都是用闭源的驱动替换了 mesa 的文件实现的 3D 加速。本身没有经过软件包管理器 dpkg 的控制。具体替换了哪几个文件我也不知道。翻 starfive 的那个 debian 制作文档看卡替换内容可能是唯一办法吧。

我建议还是直接用 debian 官方的 debootstrap 安装一个全新的 debian 系统。你用这个系统启动 VF2 。启动应该需要替换内核就行了,图形界面按说有 fbdev 驱动可以用来凑合。

1 Like

arch 好像也是用了 VF2 的闭源库实现图形界面的。那真的有可能就是驱动问题。(此行作废)

你说的不能运行是拷贝回 debian 再运行啊?那还是函数接口问题。你最好是在 arch 下面运行。如果 arch 下面也一样,就要检查 arch 的情况了。

我只是记得 mesa 可以用变量设置用什么加速。或许你只需要改用软件渲染库。
哪个变量没印象了。只能是翻 mesa 的文档才能知道。

或许是 LIBGL_ALWAYS_SOFTWARE=true ?