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

Ursina Engine设置mouse.locked时黑屏闪烁问题求解

解决Ursina引擎切换鼠标锁定状态时的黑屏闪烁问题

问题原因

直接在条件判断分支中修改mouse.locked会和Ursina的帧渲染流程冲突,导致光标模式切换时出现短暂黑屏闪烁。这是因为鼠标状态变更需要和引擎的渲染循环同步执行,否则会触发窗口焦点或渲染上下文的异常重置。

解决方案

1. 延迟鼠标状态变更到下一帧

使用Ursina内置的invoke函数,将mouse.locked的设置延迟到下一帧执行,让引擎完成当前帧渲染后再处理鼠标状态:

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController

def toggle_inventory():
    if inventory.visible:
        # 关闭背包,恢复玩家控制
        player.speed = 8
        player.jump_height = 3
        grid.visible = False
        testitem.visible = False
        # 延迟锁定鼠标
        invoke(setattr, mouse, 'locked', True, delay=0)
    else:
        # 打开背包,禁用玩家控制
        player.speed = 0
        player.jump_height = 0
        grid.visible = True
        testitem.visible = True
        # 延迟解锁鼠标
        invoke(setattr, mouse, 'locked', False, delay=0)

# 绑定背包切换按键(示例为I键)
InputHandler.bind('i', toggle_inventory)

2. 调整鼠标可见性与锁定状态的顺序

先设置鼠标可见性,再修改锁定状态,避免光标模式切换时的渲染异常:

# 打开背包时
mouse.visible = True
invoke(setattr, mouse, 'locked', False, delay=0)

# 关闭背包时
invoke(setattr, mouse, 'locked', True, delay=0)
mouse.visible = False

3. 检查UI元素的渲染开销

确保grid、testitem等UI元素的父对象设置正确,避免在切换可见性时触发大量元素的重新渲染。如果UI元素过多,可考虑使用Entity批量管理,减少渲染压力。

内容的提问来源于stack exchange,提问作者Dave J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:35:18