当前位置: 首页 > 知识库问答 >
问题:

从glfw回调调用overriden方法时崩溃

斜瑞
2023-03-14

我目前正在使用OpenGL和GLFW开发一个跨平台的2D渲染引擎。我有一个名为GameWindow的基本窗口类,以及一个名为Game的继承GameWindow的类。游戏覆盖了基类中的一些虚拟方法,以便GameWindow可以处理帧限制等。在GameWindow的构造函数中,我使用glfwSetWindowSizeCallback指定窗口调整大小时要运行的方法。然后,此方法调用GameWindow的虚拟on_resize方法,触发Game中的overriden方法。从GameWindow中调用任何虚拟方法都具有在Game中调用适当方法的预期效果。但是,如果从GameWindow中的窗口调整大小回调调用虚拟方法,则应用程序会崩溃。我通过存储GameWindow的静态实例并从回调调用它的on_resize方法来解决这个问题。然而,我宁愿不用这样做。这个问题有更好的解决方案吗?提前感谢。

~z~迈克尔·K。

class GameWindow : Object {
    GLFWwindow* win;
    ...
    public GameWindow(...) {
        ...
        glfwSetWindowSizeCallback(win, (GLFWwindowsizefun)window_size_callback);
    }

    public void run(...) {
        ...
        on_render(renderElapsed);  // This works fine.
        ...
    }

    public virtual void on_resize(int width, int height) {}

    public void window_size_callback(GLFWwindow* window, int width, int height) {
        ...
        on_resize(width, height);  // This causes a crash.
    }
}

class Game : GameWindow {
    ...
    public override void on_render(double time) { ... }

    public override void on_resize(int width, int height) { ... }
}

共有2个答案

卢子民
2023-03-14

作为一个(非常延迟的)更新,我再次开始与GLFW打交道,发现它实际上有一种处理这类事情的方法:glfwSetUserPointer和glfwGetUserPointer。最后,我编辑代码来存储指向调用GameWindow实例的指针。在回调方法中,我只需使用glfwGetUserPointer获取所述指针,并将其转换为GameWindow类型。然后,我可以像平常一样使用该实例。

编辑:虽然apmasell的答案是正确的,但它主要是针对不允许用户指针之类的东西的库的解决方案。

王宜
2023-03-14

GLFWwindowsizefun不接受目标/上下文,因此Vala无法将当前的GameWindow实例传递到回调中。这实际上意味着This在回调中为空,因此在_resize上调用失败。您的强制转换正在隐藏Vala编译器关于它的错误。

你应该:

  1. window\u size\u callback设置为静态方法
  2. 创建某种查找表,以便在全局变量中从GLFWwindow查找GameWindow。(您可能希望GameWindow在查找表中不被拥有,并让GameWindow析构函数从查找表中删除自身。
  3. 在回调中,查找右侧的GameWindow,并在其上调用on\u resize方法

 类似资料:
  • 希望你做得很好。 我有一个C语言的JNI实现,其中一个C函数连接到当前JVM线程并回调一个Java方法,这实际上是在attachCurrentThread()函数调用时使JVM崩溃。我的实现基于链接中给出的答案,保持对JNIEnv环境的全局引用 线程创建部分,它将侦听套接字连接以接受事件并注入GetEvent函数。 回调函数 在接收到事件时执行GetEvent()后,我的JVM在AttachMon

  • 一般来说,我对GLFW和OpenGL比较陌生,我正在开发一个小型模型渲染器。我目前正在处理输入,我面临着GLFW如何处理输入的问题,让我解释一下:每个教程都告诉我使用glfwGetKey和“if-forest”来查看是否按下了这样或那样的键。我遇到的问题是,如果我映射了很多关键点,它可能会变得很慢,而且很难看。所以我使用函数指针表和glfwSetKeyCallback来加速这一过程并获得更清晰的代

  • 在中设置回调函数时,要使用什么? 我尝试将函数设置为类型<code>void。将其更改为<code>void __stdcall,但如何使用<code>GLFW的<code>typedef,例如<code>GLFW*fun?我认为这是正确的选择。我真的需要一个示例源代码。 顺便说一句,我将GLFW定义为 更新 我的代码是这样的: (我以三种方式做到了) 一 原型。因为在下面,所以这个给我一个编译错

  • 问题内容: 我正在尝试从C 调用python类中的方法。调用它的C 方法是C ++回调。 在此方法中,当我尝试调用python方法时,它给出了。 我已经将python函数的实例保存在全局变量中,例如 python方法在哪里,将在回调中使用。 在回调中,参数创建为 创建时 在这一行中,它给出了细分错误。之后,实际的python方法称为 问题答案: 如果要从C / C ++回调中调用Python函数,

  • webrtc库调用某个内部方法并获取多余的\u错误。然后坠毁了 如果需要更多信息,请询问。 //代码 我在这里喝了一口。 此代理调用时发生崩溃。 事故报告 异常类型:EXC_BAD_ACCESS(SIGSEGV)异常子类型:KERN_在0x5000000000000038处的地址无效终止信号:分段错误:11终止原因:命名空间信号,代码0xb终止进程:由线程触发的EXC处理程序[0]:9 筛选的系统

  • 我在Android中使用JNI时遇到了一个奇怪的问题。我获得了我的类SecureChannel的对象方法sendClearMessage()并调用了这个返回类MessageResponse的对象的方法。这个对象被分配给jobject,然后传递给CallObjectMethod以调用该类的一个方法。每当我调用这个类的方法时,应用程序就会在没有有用信息的情况下崩溃。我检查每个获得jmethodID或j