我目前正在用C++开发一个强化学习环境游戏。C++代码控制图形和游戏逻辑,而我有Python绑定(通过共享库导入)来控制游戏流程(决策、步进等)。在我的Linux机器上运行这个环境没有问题:当我用Python运行绑定时,它会正确地打开GUI显示。但是,在我的macOS机器上,环境将不会呈现。奇怪的是,当我将C++代码编译为可执行文件而不是共享库并运行它时,图形用户界面窗口可以正确地显示环境。我怀疑Python在macOS上处理共享库的方式有所不同。
我使用CMake作为构建系统,SFML作为图形用户界面,pybind11作为Python绑定。有没有人有关于如何调试这个问题的想法?
下面是我的一些代码片段来说明我的观点:
C++绑定
#include <SFML/Graphics.hpp>
#include <pybind11/pybind11.h>
#include <iostream>
namespace py = pybind11;
void openWindow() {
sf::RenderWindow window(sf::VideoMode(500, 500), "SFML");
while (window.isOpen())
{
// Update the window
std::cout << 1;
window.clear();
window.display();
}
}
PYBIND11_MODULE(test, handle) {
handle.def("openWindow", &openWindow);
} Python代码
from build.test import *
def main():
openWindow()
if __name__ == "__main__":
main() 和CMakeLists.txt
make_minimum_required(VERSION 3.10)
project(main)
find_package(pybind11)
find_package(SFML 2.5 COMPONENTS REQUIRED graphics system)
pybind11_add_module(test main.cpp)
target_link_libraries(test PUBLIC sfml-graphics sfml-system)我知道渲染窗口的循环正在工作,而不是程序完全崩溃,因为在程序执行的整个过程中都会输出1。然而,我仍然不知道为什么窗口不会显示,甚至不知道如何调试这个问题。
发布于 2021-12-03 02:50:00
这就是解决方案。您的代码需要来轮询SFML事件,否则窗口将不会在macOS上呈现。
如果希望渲染代码,请在代码中插入以下代码行。
sf::Event event;
window.pollEvent(event);再一次,我不确定为什么我的代码在没有这些行的情况下工作得很好,但是出于某种原因,在macOS上轮询事件是必要的。
https://stackoverflow.com/questions/70189962
复制相似问题