Unity项目较大刷新及编译卡顿解决方法

这篇具有很好参考价值的文章主要介绍了Unity项目较大刷新及编译卡顿解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发中当Unity项目比较大的时候,每次Unity窗口获取焦点时刷新需要3-5秒,非常麻烦!常见有几种方法来缓解这个问题:

  •      关闭unity自动刷新Edit->Preferences->General->Auto Refresh,改为自己手动Ctrl+R刷新;

          unity 刷新,unity,游戏引擎 

        缺点:每次都需要手动刷新比较麻烦

  •    修改unity的ScriptChangesWhilePlaying选项Editor->Preferences->General->Script Changes While Playing

         unity 刷新,unity,游戏引擎 

        Recompile And Continue Playing 编译并继续播放

        Recompile After Finished Playing 停止播放后再编译

        Stop Playing And Recompile 停止播放进行编译

  •  开发工具在Editor模式自动检查资源变更自动刷新,代码如下:

        第一步:检查开发过程中需要及时刷新的资源,如:Scripts目录,prefab目录

        第二步:获取最后改动时间是否与上一次检查的时间一致,不一致则启动刷新

        第三步:将时间写入文件缓存,方便下一次对比

        第四步:在窗口获取焦点以及Playing启动时启动检测

#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;

[InitializeOnLoad]
public class EditorNotification : AssetPostprocessor
{
    private static bool isFocused;
    private static bool isPlaymode;
    static EditorNotification()
    {
        EditorApplication.update -= Update;
        EditorApplication.update += Update;
        EditorApplication.playmodeStateChanged -= PlaymodeStateChanged;
        EditorApplication.playmodeStateChanged += PlaymodeStateChanged;
    }

    private static void Update()
    {
        if (isFocused == UnityEditorInternal.InternalEditorUtility.isApplicationActive)
        {
            return;
        }
        isFocused = UnityEditorInternal.InternalEditorUtility.isApplicationActive;
        OnEditorFocus(isFocused);
    }

    private static void PlaymodeStateChanged()
    {
        if(EditorApplication.isPlayingOrWillChangePlaymode && !isPlaymode)
        {
            //Debug.LogError(EditorApplication.isPlaying.ToString() + " - " + EditorApplication.isPlayingOrWillChangePlaymode.ToString());
            isPlaymode = true;
            Refresh();
        }
        else if(!EditorApplication.isPlayingOrWillChangePlaymode && !EditorApplication.isPlaying)
        {
            isPlaymode = false;
        }
    }
    /// <summary>
    /// Unity窗口聚焦状态改变回调
    /// </summary>
    /// <param name="focus"></param>
    private static void OnEditorFocus(bool focus)
    {
        if (focus)
        {
            //Debug.LogErrorFormat("编辑器激活状态:{0}", focus);
            if(!EditorApplication.isPlaying && !EditorApplication.isPlayingOrWillChangePlaymode)
            {
                Refresh();
            }
        }
    }

    private void OnPreprocessAsset()
    {
        //Debug.LogError("Asset下文件改变时回调");
    }

    //[MenuItem("File/RefreshManual")]
    static void Refresh()
    {
        bool needRefresh = false;
        MD5File md5 = new MD5File();
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Reset();
        sw.Start();
        string path = Path.Combine($"{Application.dataPath}/../Library", "md5Refresh.dat");
        if(File.Exists(path))
        {
            FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
            BinaryFormatter bin = new BinaryFormatter();
            md5 = (MD5File)bin.Deserialize(fs);
            fs.Close();
        }
        
        string scriptPath = Path.Combine($"{Application.dataPath}", "Scripts");
        DirectoryInfo dinfo = new DirectoryInfo(scriptPath);
        FileInfo[] fileInfos = dinfo.GetFiles("*.cs", SearchOption.AllDirectories);
        foreach(FileInfo file in fileInfos)
        {
            string timestr = file.LastWriteTime.ToLongTimeString();
            string value = string.Empty;
            if(md5.m_DicMD5.TryGetValue(file.FullName, out value))
            {
                System.DateTime dt = System.DateTime.Parse(value);
                System.DateTime dt2 = System.DateTime.Parse(timestr);
                if(!System.DateTime.Equals(dt, dt2))
                {
                    needRefresh = true;
                    md5.m_DicMD5[file.FullName] = timestr;
                    Debug.LogError(file.FullName + " - " + value + " -- " + timestr);
                }
            }
            else
            {
                needRefresh = true;
                md5.m_DicMD5.Add(file.FullName, timestr);
                Debug.LogError(file.FullName + " -------- " + timestr);
            }
        }

        {
            FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
            BinaryFormatter bin = new BinaryFormatter();
            bin.Serialize(fs, md5);
            fs.Close();
        }
        sw.Stop();
        string str = "C#变更检查结束,不需要刷新!";
        if (needRefresh)
        {
            str = "C#变更检查结束,需要刷新!";
            string t = (sw.Elapsed.TotalMilliseconds / 1000).ToString("N2");
            Debug.LogError($"{str}FileCount:{fileInfos.Length} Time:{t}秒");
            AssetDatabase.Refresh();
            EditorUtility.RequestScriptReload();
        }
    }
}
#endif

 

using System.Collections;
using System.Collections.Generic;

[System.Serializable]
public class MD5File
{
    public Dictionary<string, string> m_DicMD5 = new Dictionary<string, string>();
}

 这种方法只需要检查少部分资源自动刷新,基本没有卡顿,体验相对比较好!文章来源地址https://www.toymoban.com/news/detail-648684.html

到了这里,关于Unity项目较大刷新及编译卡顿解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity如何解决协程开启频繁导致的程序卡顿

    协程并不会在Unity中开辟新的线程来执行,其执行仍然发生在主线程中。当我们有较为耗时的操作时,可以将该操作分散到几帧或者几秒内完成,而不用在一帧内等这个操作完成后再执行其他操作。 unity中协程在start前需要判断其是否开启了,否则协程会不断叠加 解决方式一

    2024年02月09日
    浏览(57)
  • Unity队列加载图片,解决大量同时加载资源卡顿问题与思路

    1、思路:加载图片的请求都加到队列中,然后一个加载完一个再去加载下一个,直到加载完。 2、问题:         问题是相对也存在的。当加载的数据还在队列中,但是已经跳转到其它的场景,则会出现报错的问题。         每次跳转场景的时候,需要把队列中的数据情况

    2024年02月16日
    浏览(53)
  • Unity Animation动画循环播放时卡顿、不连贯问题解决办法

    一、动画卡顿: 如上图,可看到,当循环播放动画时,动画像瘸了似的,一会块,一会慢,总之就是不连贯; 二、解决办法: 打开该元素对应的Animation,然后选中下方的Curves动画曲线,在这里我们可以看到,该动画是一条S型曲线,故而播放速度才会时快时慢; 在这里,我

    2024年02月12日
    浏览(46)
  • Unity WebGL项目打包后本地打开报错问题解决方法

    在Unity打包WebGL项目后,本地打开html页面出现错误提示。 Failed to download file Build/Unity Web.data.gz. Loading web pages via a file:// URL without a web server is not supported by this browser.   在网上试了好几种方法,综合起来终于跑起来了。以下是解决步骤: 1. 打开Web服务 ,打开控制面板--程序--启

    2024年02月14日
    浏览(76)
  • Qt 解决界面频繁刷新卡顿的问题

    有时候当我们需要频繁刷新界面的时,界面就会出现卡顿,或者卡死的情况,这个时候需要这样做。 本例使用QTableView为例子为大家讲解解决方法。 猜想一:缓存+定时器 当有数据的时候调用setShowText()方法,将数据缓存到队列中,然后通过定时器QTimer,每隔一段时间调用slo

    2024年02月13日
    浏览(42)
  • unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,

    今天调试和服务器连接,发现始终获取不到服务器的数据, 电脑和服务器都在同一局域网,仍然获取不到, 下面是电脑环境配置, 第一步: 设置网络为专用网络,然后点击配置防火墙和安全设置,关闭防火墙 (点击所连接的wifi的属性) 第二步:设置出站 入站规则 点击高

    2024年02月07日
    浏览(60)
  • 【问题记录】Unity编译ARCore模板项目问题

    Unity版本:2021.3.8f1c1 创建AR项目并下载使用默认模板,编译并发布到Android实机。 1、第一个问题: Error:Could not read cache value from\\\'C:UsersUsername.gradledaemon6.1.1registry.bin\\\'. 查询参考: 由 (5条消息) 安卓:Could not read cache value from\\\'C:UsersUsername.gradledaemon1.12registry.bin\\\'_Royel transfo

    2023年04月09日
    浏览(40)
  • 【unity】基础入门 编译错误排查与调试方法

    1、Win11系统不兼容部分unity版本 考虑换系统吧! 2、可能是系统权限问题,访问不到部分路径 一般是系统盘的文件因为用户账户授权的问题,一些文件只有读取没有写入权限。 3、依赖配置问题 系统环境配置问题

    2024年02月09日
    浏览(57)
  • 【Unity】 基础入门 编译错误排查与调试方法

    1、Win11系统不兼容部分unity版本 考虑换系统吧! 2、可能是系统权限问题,访问不到部分路径 一般是系统盘的文件因为用户账户授权的问题,一些文件只有读取没有写入权限。 3、依赖配置问题 系统环境配置问题

    2024年02月11日
    浏览(42)
  • Unity Universal Media Player(UMP) rtsp接实时监控方法+打包项目其他设备观看播放报错解决办法

    目录 这篇是在unity使用rtsp数据流接监控画面的方法和打包后踩坑问题解决记录 1. 背景说明 2.在unity项目中播放监控方法 3.打包项目exe后遇到问题及解决方案总结 方法一: 方法二: 方法三: 方法四: 方法五: 4. 链接整合 -------------------------------------------------------------------

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包