Allegro4开发DOS GUI调用install_mouse()导致Dosbox段错误求助
解决方案
- 调整初始化顺序,必须在
set_gfx_mode()完成图形模式初始化后再调用install_mouse(),禁止在文本模式下提前安装鼠标驱动,避免DOSBox的VESA驱动与鼠标驱动抢占中断向量导致内存越界。 - 编译时增加
-DALLEGRO_USE_CONSOLE_MOUSE编译参数,强制Allegro使用轮询模式读取鼠标状态,替代默认的中断读取模式,规避DOSBox下中断触发频率过高导致的并发读写问题。 - 读取Allegro鼠标全局变量时增加原子操作保护,修改
preupdate方法的实现如下:
void MousePointerObject::preupdate() { // 冻结鼠标状态保证读取时不会被中断更新篡改 freeze_mouse(); int cur_x = mouse_x; int cur_y = mouse_y; int cur_b = mouse_b; unfreeze_mouse(); place(Vector<float>(cur_x, cur_y)); static int held_buttons = 0; int changed = cur_b ^ held_buttons; pressed_ = changed & cur_b; released_ = changed & ~cur_b; held_buttons = cur_b; }
- 修改DOSBox配置文件中的鼠标相关参数:在
dosbox.conf的[mouse]区段设置rawinput=false、sensitivity=80,关闭兼容性差的原生鼠标输入模式,降低鼠标事件触发频率。 - 若以上方案均无效,可以弃用Allegro自带的鼠标驱动,直接通过DJGPP的
int86接口调用DOS 33号中断读取鼠标状态,该接口为DOS标准接口,DOSBox对其兼容性达到100%,不会触发段错误。
内容的提问来源于stack exchange,提问作者DevShine
相关产品推荐
相关产品推荐

