Godot 4.0中TextureProgressBar值变更时进度纹理不更新问题求助
Godot 4.0 TextureProgressBar 不实时更新的问题解决
问题原因
你的代码中start_progress_bar函数的三层嵌套循环会完全阻塞主线程。Godot的UI渲染、输入响应和脚本逻辑都运行在同一个主线程中,当密集计算占用主线程时,Godot根本没有机会去更新TextureProgressBar的显示,直到整个循环执行完毕(进度值达到100),才会一次性刷新UI。
修复方案
方案1:用异步等待释放主线程
修改start_progress_bar函数,在每次更新进度后,通过await让主线程处理一帧的UI渲染:
extends Node2D func _ready(): var loading_bar = get_node("Loading Screen/Loading Bar") loading_bar.position = Vector2(200, 360) loading_bar.value = 1 func start_world_creation(): await start_progress_bar() # 函数改为异步,需用await调用 func start_progress_bar(): for x in 100: # 模拟耗时操作 for y in 100: for time_waster in range(20000): time_waster += 300 # 更新进度条 var loading_bar = get_node("Loading Screen/Loading Bar") loading_bar.value += 1 print(loading_bar.value) # 等待下一帧,让主线程处理UI更新 await get_tree().process_frame func _on_start_timer_timeout(): start_world_creation()
方案2:将任务拆分到_process帧循环
把耗时操作拆分成小块,每帧只处理一部分,保证主线程始终有时间更新UI:
extends Node2D var current_progress = 1 var is_processing = false func _ready(): var loading_bar = get_node("Loading Screen/Loading Bar") loading_bar.position = Vector2(200, 360) loading_bar.value = current_progress func start_world_creation(): is_processing = true func _process(delta): if not is_processing or current_progress >= 100: is_processing = false return # 每帧完成一次耗时计算 for y in 100: for time_waster in range(20000): time_waster += 300 # 更新进度条 current_progress += 1 var loading_bar = get_node("Loading Screen/Loading Bar") loading_bar.value = current_progress print(current_progress) func _on_start_timer_timeout(): start_world_creation()
额外说明
如果实际项目中的耗时操作是资源加载、复杂数据计算等更重的任务,推荐使用Godot的Thread类创建后台线程处理,避免阻塞主线程。但对于这类简单循环任务,上述两种方案已足够解决UI不实时更新的问题。
内容的提问来源于stack exchange,提问作者Frasher Gray
相关产品推荐
相关产品推荐

