安装鼠标导致 Dosbox 出现段错误

Installing mouse causes segment fault in Dosbox

我正在使用 Allegro4 制作一个支持 DOS 上的 GUI 的简单程序。 为了实现鼠标操作,我创建了一个形状对象来显示鼠标的当前信息。 Allegro提供了很多有用的全局变量,如mouse_x、mouse_y、mouse_b等,这些只有在通过以下代码安装鼠标驱动后才能使用。

install_mouse();

这是我的 MousePointerObjectClass。

class MousePointerObject : public GameObject {
public:
    MousePointerObject(Scene *scene, std::shared_ptr<GameObject> parent = nullptr, std::string res = "");
    virtual void preupdate();
    virtual void collides(GameObject &other);
    void notCollides(GameObject &other);

private:
    int pressed_;
    int released_;

    friend class Scene;
};
MousePointerObject::MousePointerObject(Scene *scene, std::shared_ptr<GameObject> parent, std::string res)
    : GameObject (scene, parent)
{
    setRenderer(new MousePointerRenderer(res + "/renderer"));
    setCollider(new PointCollider({0, 0}));
}

void MousePointerObject::preupdate()
{
    place(Vector<float>(mouse_x, mouse_y));

    static int held_buttons = 0;
    int changed = mouse_b ^ held_buttons;
    pressed_ = changed & mouse_b;
    released_ = changed & ~mouse_b;
    held_buttons = mouse_b;
}

void MousePointerObject::collides(GameObject &other)
{
    if (pressed_ > 0)
        other.mouseDown(pressed_);
    if (released_ > 0)
        other.mouseUp(released_, true);
    other.mouse_inside_ = true;
}

void MousePointerObject::notCollides(GameObject &other)
{
    other.mouse_inside_ = false;
    if (released_ > 0)
        other.mouseUp(released_, false);
}

我使用 DJGPP 在 Ubuntu 上交叉编译了这个程序,它在 Ubuntu 和 Real Dos 上运行良好,没有任何冲突。 但是当它在 Dosbox 或 Dosbox-x 上是 运行 时,它会导致段错误。 无论鼠标指针是否显示在屏幕上,一旦调用install_mouse(),当我移动鼠标指针时Dosbox 意外退出。 我费了好大劲才解决这个问题,但它们根本不起作用。

任何建议将不胜感激。

原因是我在这个程序中使用的引擎。它曾经使用大量 CPU 和 RAM。经过优化后 CPU 和 RAM 占用率大幅下降,在 Dosbox 中也能正常运行。 但是还是很慢,所以我还在继续优化引擎。