如何通过X-Plane API让mainDrawCallback先于drawCallback执行?
解决X-Plane回调执行顺序问题:让mainDrawCallback优先于窗口drawCallback执行
核心原因分析
你之前将mainDrawCallback注册到xplm_Phase_Gauge阶段后回调不执行,是因为这个阶段仅针对X-Plane传统2D仪表的绘制流程,普通外部窗口插件不会触发该阶段的回调。而窗口的drawCallback属于窗口绘制阶段,默认会晚于xplm_Phase_BeforeWindows阶段、早于xplm_Phase_AfterWindows阶段执行。
正确解决方案
要让mainDrawCallback先于窗口drawCallback执行,只需将其注册到窗口绘制前的专属阶段,具体步骤如下:
注销旧的回调注册(如果存在)
如果之前已经将mainDrawCallback注册到xplm_Phase_Window阶段,先注销避免重复注册:XPLMUnregisterDrawCallback(mainDrawCallback, xplm_Phase_Window, 0, nullptr);注册到窗口绘制前的阶段
将mainDrawCallback注册到xplm_Phase_BeforeWindows阶段,该阶段会在所有窗口绘制流程之前执行。设置inBefore参数为1,确保它在该阶段的其他回调中优先执行:XPLMRegisterDrawCallback(mainDrawCallback, xplm_Phase_BeforeWindows, 1, nullptr);保留原窗口创建代码
你创建外部窗口的代码无需修改,窗口的drawCallback会在xplm_Phase_BeforeWindows阶段之后自动执行:XPLMCreateWindow_t win = { 0 }; win.structSize = sizeof(win); win.left = 50; win.top = 200; win.right = 650; win.bottom = 600; win.visible = 1; win.drawWindowFunc = drawCallback; win.refcon = nullptr; win.decorateAsFloatingWindow = xplm_WindowDecorationRoundRectangle; win.layer = xplm_WindowLayerFloatingWindows; g_window = XPLMCreateWindowEx(&win);
关键逻辑说明
X-Plane的绘制阶段执行顺序核心节点为:
xplm_Phase_BeforeWindows→ 所有窗口绘制前执行- 窗口绘制(含你的外部窗口
drawCallback) xplm_Phase_AfterWindows→ 所有窗口绘制后执行
通过将mainDrawCallback绑定到xplm_Phase_BeforeWindows阶段,就能确保它在窗口drawCallback之前被调用。
内容的提问来源于stack exchange,提问作者oKami
相关产品推荐
相关产品推荐

