Godot导出HTML/Mac后调用本地文件读取函数时游戏卡顿求助
问题排查与修复方案
1. 核心问题:未处理文件打开失败导致无限循环
编辑器内工作路径和导出后的平台路径不一致,很可能导致f.open()失败,但原代码没有错误检查逻辑。此时文件对象的eof_reached()会一直返回false,触发无限while循环直接卡死游戏。
修复代码(同步读取版)
func load_file(book_id): # 用res://前缀指定资源路径,避免平台路径差异 var file_path = "res://your_folder/" + str(book_id) + ".txt" # 替换为你的实际路径 var f = File.new() # 先检查文件是否存在 if not f.file_exists(file_path): print("找不到目标文件: ", file_path) return "" # 检查打开是否成功 var open_error = f.open(file_path, File.READ) if open_error != OK: print("文件打开失败,错误码: ", open_error) return "" var text_from_file = "" # 必须初始化局部变量,避免依赖全局变量的未知状态 while not f.eof_reached(): var line = f.get_line() text_from_file += line + "\n" # 补充换行符,避免所有内容拼接成一行 # 加个长度保护,防止极端情况死循环 if text_from_file.length() > 1000000: print("读取内容过长,强制终止") break f.close() return text_from_file
2. HTML平台专属优化:改用异步读取
HTML是单线程环境,同步读取大文件会阻塞主线程导致游戏卡住,建议用Godot的异步文件API:
Godot 4.x 异步示例
func load_file_async(book_id): var file_path = "res://your_folder/" + str(book_id) + ".txt" var file = FileAccess.open(file_path, FileAccess.READ) if not file: print("打开文件失败: ", file_path) return # 异步读取全部内容,完成后触发回调 file.get_contents_async().connect("completed", self, "_on_file_read_done") func _on_file_read_done(result, error): if error == OK: var content = result # 这里处理读取到的文本内容 print("读取完成,内容长度: ", content.length()) else: print("读取出错: ", error)
Godot 3.x 异步示例
func load_file_async(book_id): var file_path = "res://your_folder/" + str(book_id) + ".txt" var file = File.new() var open_error = file.open(file_path, File.READ) if open_error != OK: print("打开失败: ", open_error) return # 绑定读取完成的回调 file.connect("file_read_completed", self, "_on_file_read_done") file.read_all_async() func _on_file_read_done(content, error): if error == OK: # 处理读取到的内容 print("读取内容: ", content) else: print("读取错误: ", error) file.close()
3. 额外注意事项
- 导出时确保文本文件被打包:在Godot导出设置中,检查资源过滤器没有排除你的文本文件(默认会包含
res://下所有资源) - 绝对不要用绝对路径:不同平台的绝对路径规则完全不同,统一使用
res://(资源目录)或user://(用户数据目录)路径
内容的提问来源于stack exchange,提问作者Sefi_k
相关产品推荐
相关产品推荐

