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

Windows下Unity构建运行时任务管理器显示not responding但运行正常咨询

问题根因

Windows任务管理器判定程序"未响应"的唯一判定逻辑是程序创建窗口的主线程(即承载Win32消息循环的线程,对应Unity的主线程)是否在5秒阈值内响应系统投递的窗口消息,和程序实际业务逻辑是否正常、CPU/内存占用高低没有任何关联。
你遇到的是Unity Runtime在Windows Server 2012 R2环境下的典型误报:该系统默认开启DWM(桌面窗口管理器)节流策略,会降低后台/非前台全屏窗口的消息分配优先级,而Unity默认的Player循环会优先处理渲染、游戏逻辑,把Win32消息泵的处理优先级压到最低,导致消息队列积压超过5秒阈值被任务管理器标记为未响应,但游戏逻辑、输入处理本身因为Unity走的是自己的输入层轮询,不会受消息泵延迟的影响,所以实际运行完全正常。

可行解决方案

按落地成本从低到高排序:

  • 调整Unity Player配置后重新打包:打开Edit -> Project Settings -> Player -> Resolution and Presentation面板,勾选Run In Background,将Fullscreen Mode从默认的Fullscreen Window切换为Windowed模式,取消勾选Use DXGI Flip Model Swapchain for D3D11选项,打包后即可解决绝大多数该类误报。
  • 注入轻量消息泵补全逻辑:如果不想调整全屏相关配置,可以在项目里加一个常驻的MonoBehaviour脚本,每帧强制排空主线程的Win32消息队列,不需要额外分发消息,不会干扰Unity原生的输入、窗口逻辑,代码如下:
using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class WinMsgPumpFix : MonoBehaviour
{
    [DllImport("user32.dll")]
    private static extern bool PeekMessage(out IntPtr lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);

    private static WinMsgPumpFix _instance;
    private void Awake()
    {
        if (_instance != null)
        {
            Destroy(gameObject);
            return;
        }
        _instance = this;
        DontDestroyOnLoad(gameObject);
    }

    private void Update()
    {
        // 每帧取出队列中所有待处理消息,PM_REMOVE参数保证消息取出后不做额外分发
        while (PeekMessage(out _, IntPtr.Zero, 0, 0, 0x0001)) { }
    }
}
  • 调整系统侧策略(适合无法重新打包的场景):在Windows Server 2012 R2的服务器管理器中,移除"桌面体验"功能下的服务器桌面窗口内存节流配置,重启系统后DWM不会再对窗口消息做节流处理,误报会自动消失。
  • 主线程阻塞点排查:哪怕当前逻辑运行正常,也需要排查主线程所有Update/FixedUpdate/LateUpdate协程中是否存在同步IO、锁等待、Thread.Sleep这类单次耗时超过1s的逻辑,这类逻辑哪怕平均CPU占用很低,也可能偶发触发消息响应超时。

补充说明:该标记本身是系统层面的误判,不会影响程序实际运行稳定性,若没有终端用户感知层面的要求,不做处理也不会引发崩溃、逻辑异常等问题。

内容的提问来源于stack exchange,提问作者므..

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:12:41