You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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执行,只需将其注册到窗口绘制前的专属阶段,具体步骤如下:

  1. 注销旧的回调注册(如果存在)
    如果之前已经将mainDrawCallback注册到xplm_Phase_Window阶段,先注销避免重复注册:

    XPLMUnregisterDrawCallback(mainDrawCallback, xplm_Phase_Window, 0, nullptr);
    
  2. 注册到窗口绘制前的阶段
    将mainDrawCallback注册到xplm_Phase_BeforeWindows阶段,该阶段会在所有窗口绘制流程之前执行。设置inBefore参数为1,确保它在该阶段的其他回调中优先执行:

    XPLMRegisterDrawCallback(mainDrawCallback, xplm_Phase_BeforeWindows, 1, nullptr);
    
  3. 保留原窗口创建代码
    你创建外部窗口的代码无需修改,窗口的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:13:24