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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:50:25