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

Unity后台存储大量本地数据库数据避免IDE卡顿方案咨询

哥们,你这卡顿的核心问题一眼就能看出来——所有数据库操作都在Unity的主线程里同步执行了,大量数据的删除和插入直接把主线程堵得水泄不通,自然要卡个好几分钟。给你几个实用的解决方案,都是项目里亲测有效的:

解决方案1:把数据库操作移到后台线程

Unity的主线程负责渲染、输入响应这些核心工作,绝对不能被耗时操作阻塞。所以得把数据库的删改查全丢到后台线程去做,注意:后台线程里绝对不能调用Unity的API(比如GameObject、Component相关的),只处理纯数据库逻辑就行。

给你改造后的示例代码:

// 调用这个方法来启动后台保存
private void StartBackgroundSave(TestController.TestReportModel report)
{
    // 用线程池开启后台任务,避免手动管理线程的麻烦
    ThreadPool.QueueUserWorkItem(state =>
    {
        try
        {
            // 开启事务,大幅提升批量操作效率
            dbHelper.BeginTransaction();
            
            // 用更高效的全表清空替代逐行删除
            dbHelper.TruncateTable(dbHelper.TABLE_OFFLINE_MASTER_TEST_REPORT);
            dbHelper.TruncateTable(dbHelper.TABLE_MASTER_OFFLINE_POINT_DATA);
            
            // 批量插入数据,替代循环逐条插入
            dbHelper.BatchInsertPointData(report.data);
            
            // 提交事务,一次性写入磁盘
            dbHelper.CommitTransaction();
        }
        catch (Exception ex)
        {
            // 出错时回滚事务,避免数据损坏
            dbHelper.RollbackTransaction();
            Debug.LogError("后台保存数据失败:" + ex.Message);
        }
        finally
        {
            // 操作完成后,回到主线程做UI提示(比如关闭加载弹窗)
            UnityMainThreadDispatcher.Instance().Enqueue(() =>
            {
                Debug.Log("数据保存完成!");
                // 这里可以更新UI状态,比如隐藏加载动画
            });
        }
    });
}

// 实现一个简单的主线程调度器,用于后台线程回调主线程
public class UnityMainThreadDispatcher : MonoBehaviour
{
    private static UnityMainThreadDispatcher _instance;
    private readonly Queue<Action> _pendingActions = new Queue<Action>();

    public static UnityMainThreadDispatcher Instance()
    {
        if (_instance == null)
        {
            _instance = FindObjectOfType<UnityMainThreadDispatcher>();
            if (_instance == null)
            {
                GameObject dispatcherObj = new GameObject("UnityMainThreadDispatcher");
                _instance = dispatcherObj.AddComponent<UnityMainThreadDispatcher>();
                DontDestroyOnLoad(dispatcherObj);
            }
        }
        return _instance;
    }

    private void Update()
    {
        lock (_pendingActions)
        {
            while (_pendingActions.Count > 0)
            {
                _pendingActions.Dequeue().Invoke();
            }
        }
    }

    public void Enqueue(Action action)
    {
        lock (_pendingActions)
        {
            _pendingActions.Enqueue(action);
        }
    }
}
解决方案2:用事务+批量插入提升效率

不管是在主线程还是后台线程,开启事务都能大幅降低磁盘IO次数——默认每条SQL语句都是单独事务,会频繁写入磁盘;开启事务后只在最后提交时一次性写入。

另外,把循环逐条插入改成批量插入,比如SQLite支持一次性插入多条数据的语法,比循环调用几百次INSERT快N倍。给你修改DBHelper的批量插入方法:

public void BatchInsertPointData(List<PointDataModel> dataList)
{
    if (dataList == null || dataList.Count == 0) return;
    
    StringBuilder sqlBuilder = new StringBuilder();
    // 替换成你的表实际列名
    sqlBuilder.Append($"INSERT INTO {TABLE_MASTER_OFFLINE_POINT_DATA} (point_id, value, create_time) VALUES ");
    
    for (int i = 0; i < dataList.Count; i++)
    {
        var data = dataList[i];
        // 注意字符串类型要加单引号,数值类型不用
        sqlBuilder.Append($"({data.PointId}, {data.Value}, '{data.CreateTime}')");
        if (i != dataList.Count - 1)
        {
            sqlBuilder.Append(", ");
        }
    }
    
    ExecuteNonQuery(sqlBuilder.ToString());
}

如果数据量特别大(比如上万条),可以分批次插入(比如每1000条插一次),避免SQL语句太长导致报错。

解决方案3:优化全表删除操作

你原来用的deleteAllFromTable应该是执行DELETE FROM table,这个操作会逐行删除并记录日志,速度很慢。换成TRUNCATE TABLE table(主流数据库比如SQLite、MySQL都支持),它会直接清空表,不记录单行删除,速度快得多。

修改DBHelper的删除方法:

public void TruncateTable(string tableName)
{
    // SQLite的TRUNCATE等价于DELETE FROM table,但可以加优化;MySQL直接用TRUNCATE TABLE
    ExecuteNonQuery($"DELETE FROM {tableName} WHERE 1=1");
    // 或者用更高效的写法(SQLite):
    // ExecuteNonQuery($"DROP TABLE IF EXISTS {tableName}; CREATE TABLE {tableName} (...);");
}
额外小贴士
  • 加加载提示:后台保存时给用户显示一个加载动画,让用户知道程序在工作,不是卡死了。
  • 分批次处理:如果数据量超大(十万条以上),可以分批次插入,避免一次性占用过多内存。
  • 索引优化:如果后续要查询这些数据,插入前可以先删除索引,插入完成后再重建——索引会减慢插入速度,但能提升查询效率。

内容的提问来源于stack exchange,提问作者shubham agarwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:00:13