游戏开发问题记录

发布于:2025-07-12 ⋅ 阅读:(18) ⋅ 点赞:(0)

清理掉包里面的错误

清理了 manifest.json 文件中一些 用不到的 SDK(如 com.bytedance.starksdk),从而解决了加载报错。

manifest.json 是干什么的?

这是 Unity 的包管理器(Package Manager)的配置文件,决定了项目会自动安装哪些包。

eg:

{
  "dependencies": {
    "com.unity.textmeshpro": "3.0.6",
    "com.bytedance.starksdk": "1.0.0"   ← 就是这个导致网络错误
  }
}

你如果删除了其中的 "com.bytedance.starksdk",Unity 就不会再尝试去下载和加载这个 SDK,自然也就不会出现连接失败、初始化异常了。 

建议清理时的步骤:

  • 关闭 Unity 编辑器

  • 打开 manifest.json

  • 删除你不需要的第三方包,例如:

    
    "com.bytedance.starksdk": "xxx"

  • 保存文件

  • 重新打开 Unity 编辑器,观察控制台是否还有错误

  • 如果你不确定某个包是否能删除,可以先注释掉(虽然 JSON 不支持注释,但你可以暂时移动到文本外保存);

  • Unity 会根据 manifest.json 自动下载对应的包,也会自动生成 packages-lock.json 来锁定版本;

  • 清理完之后可以进入 Unity → WindowPackage Manager 界面,确认是否有残留包






 

遇到游戏卡顿这么解决

Profiler.BeginSample("函数名");Profiler.EndSample(); 是 Unity 提供的性能采样工具,用来手动标记并分析一段代码的性能消耗,特别适合做性能调优和查找耗时瓶颈。

可以先像下图一样打开分析工具,这样就可以查看是哪里出现了问题。

用下方两行代码可以查看代码,是那个函数出现了问题。进行逐步排查。


这是排查方法,如下:

Profiler.BeginSample("函数名");

这里是你需要排查的可能存在问题代码。

​​​​​​​Profiler.EndSample();

使用这个方式我们就可以知道是哪里那个函数运行时间很长,我们就可以根据找到的问题进行代码优化。

基本用法说明:

using UnityEngine;

void Update()
{
    Profiler.BeginSample("MySample");

    // 👇 这里放你想分析性能的代码段
    SomeHeavyFunction();

    Profiler.EndSample();
}

在 Unity 的 Profiler 面板中会看到一条名为 "MySample" 的记录条,显示这段代码所消耗的帧时间(CPU)。

最好改成 try-finally 结构确保安全:

Profiler.BeginSample("XXX");
try
{
    // 需要分析的代码
}
finally
{
    Profiler.EndSample(); // 始终执行
}

采样嵌套必须一一对应

Profiler 也支持嵌套使用,但你必须一一成对:

Profiler.BeginSample("大函数");
Profiler.BeginSample("子函数");

// do something...

Profiler.EndSample(); // 结束子函数
Profiler.EndSample(); // 结束大函数

一旦嵌套错位,Unity 会直接报错,比如 EndSample() 太多或太少。


记得关闭开发时性能采样
Profiler.BeginSample() 是在 Editor 或开发版本中起作用的,发布正式版本时应避免滥用:

#if UNITY_EDITOR
Profiler.BeginSample("函数名");
// ...
Profiler.EndSample();
#endif

问题找到并且解决

GC,是指 垃圾回收(Garbage Collection),也就是我们之前讲到的自动内存管理机制。

// Launch.m_Inst.CallGC();  // 执行 GC 清理,释放内存(使用自定义 GC 调用接口)

这句代码 原本是打算在切换场景时手动触发一次垃圾回收,以确保:

离开旧场景后占用的资源及时释放,避免内存持续增长。

调用 .NET/Mono 中的 System.GC.Collect() 方法,强制触发一次垃圾回收

为什么切换场景时要执行 GC?

在 Unity 或游戏引擎中,切换场景是一个大内存波动点

  • 一个场景包含大量资源(GameObject、贴图、音效、UI 等)。

  • 如果不清理旧场景引用,它们会暂时留在内存中,直到 GC 扫描时清除。

为了减少内存占用、避免加载新场景时内存爆掉,通常可以在这个时机:

  • 手动触发 GC 清理无用资源。

  • 或者至少在场景卸载之后释放资源引用(比如 Resources.UnloadUnusedAssets())。

    注意:手动调用 GC 的风险
    虽然调用 GC.Collect() 可以强制释放内存,但也要谨慎使用:
     

    风险 原因
    性能卡顿 GC 是“Stop-The-World”,会暂停主线程,造成掉帧
    不可控 GC 会扫描整个托管堆,时间不可预估
    滥用导致频繁 GC 如果每帧调用,可能反而造成更大的负担

建议的使用时机:

  • 场景切换后(一次性调用);

  • 长时间运行后的内存整理;

  • 在加载大量资源前(为了提前释放旧资源);

  • 不是每帧、不是频繁调用!

示例:如何安全使用手动 GC

IEnumerator ChangeSceneAndClean()
{
    m_CurScene.Exit();
    yield return null; // 等待一帧,确保资源释放

    GC.Collect();
    Resources.UnloadUnusedAssets(); // Unity 专用的非托管资源卸载

    yield return null;

    m_CurScene = newScene;
    newScene.Enter();
}

总结一下你那段代码的 GC 含义:

内容 说明
CallGC() 是封装的垃圾回收接口,可能等价于 GC.Collect()
用意 在切换场景后清理内存,释放旧资源占用
当前状态 被注释掉了,说明开发者有意识控制何时 GC
建议 如果旧场景资源多、容易内存溢出,可以在切换后手动 GC,但不要频繁使用


网站公告

今日签到

点亮在社区的每一天
去签到