Unity辅助工具_头部与svn
Unity调用者按钮增加PlaySideButton
using QQu;
using UnityEditor;
using UnityEngine;
[InitializeOnLoad]
public class PlaySideButton
{static PlaySideButton(){UnityEditorToolbar.RightToolbarGUI.Add(OnRightToolbarGUI);UnityEditorToolbar.LeftToolbarGUI.Add(OnLeftToolbarGUI);}private static bool mIsOpenPreview = false;private static void OnRightToolbarGUI(){if (GUILayout.Button("GM | 格子坐标 | 格子使用", GUILayout.MaxWidth(150), GUILayout.Height(21))){if (Event.current.button == 0){AudioController.GetInstance().PlayClickSound();UIMgr.Ins.Show<QQu.UI.GMView>().Task();}else if (Event.current.button == 2){BuildingGridTileMgr.Ins.SetTestShowCell();}else if (Event.current.button == 1){if(mIsOpenPreview==false)SceneMapManager.Ins.PreviewCell(PreviewCellTypeEnum.CanBuilding);elseSceneMapManager.Ins.ClosePreviewCell();mIsOpenPreview = !mIsOpenPreview;}}}private static void OnLeftToolbarGUI(){GUILayout.FlexibleSpace(); //从右开始排if (GUILayout.Button("更新 | 日志 | 提交", GUILayout.MaxWidth(110), GUILayout.Height(21))){if (Application.isPlaying){Debug.LogError("你游戏正在运行中");return;}string[] strCMD = { "update", "commit", "log" }; //更新 查看日志 提交string path = Application.dataPath.Replace("Assets", "");SVNHelper.StartSvnProc(strCMD[Event.current.button], path);}}
}
unity头部扩展基类ToolbarCallback
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;
#if UNITY_2019_1_OR_NEWER
using UnityEngine.UIElements;
#else
using UnityEngine.Experimental.UIElements;
#endif
//https://github.com/marijnz/unity-toolbar-extenderpublic static class ToolbarCallback
{static Type m_toolbarType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.Toolbar");static Type m_guiViewType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.GUIView");
#if UNITY_2020_1_OR_NEWERstatic Type m_iWindowBackendType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.IWindowBackend");static PropertyInfo m_windowBackend = m_guiViewType.GetProperty("windowBackend",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);static PropertyInfo m_viewVisualTree = m_iWindowBackendType.GetProperty("visualTree",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
#elsestatic PropertyInfo m_viewVisualTree = m_guiViewType.GetProperty("visualTree",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
#endifstatic FieldInfo m_imguiContainerOnGui = typeof(IMGUIContainer).GetField("m_OnGUIHandler",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);static ScriptableObject m_currentToolbar;/// <summary>/// Callback for toolbar OnGUI method./// </summary>public static Action OnToolbarGUI;public static Action OnToolbarGUILeft;public static Action OnToolbarGUIRight;static ToolbarCallback(){EditorApplication.update -= OnUpdate;EditorApplication.update += OnUpdate;}static void OnUpdate(){// Relying on the fact that toolbar is ScriptableObject and gets deleted when layout changesif (m_currentToolbar == null){// Find toolbarvar toolbars = Resources.FindObjectsOfTypeAll(m_toolbarType);m_currentToolbar = toolbars.Length > 0 ? (ScriptableObject)toolbars[0] : null;if (m_currentToolbar != null){
#if UNITY_2021_1_OR_NEWERvar root = m_currentToolbar.GetType().GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance);var rawRoot = root.GetValue(m_currentToolbar);var mRoot = rawRoot as VisualElement;RegisterCallback("ToolbarZoneLeftAlign", OnToolbarGUILeft);RegisterCallback("ToolbarZoneRightAlign", OnToolbarGUIRight);void RegisterCallback(string root, Action cb){var toolbarZone = mRoot.Q(root);var parent = new VisualElement(){style = {flexGrow = 1,flexDirection = FlexDirection.Row,}};var container = new IMGUIContainer();container.style.flexGrow = 1;container.onGUIHandler += () =>{cb?.Invoke();};parent.Add(container);toolbarZone.Add(parent);}
#else
#if UNITY_2020_1_OR_NEWER
var windowBackend = m_windowBackend.GetValue(m_currentToolbar);// Get it's visual tree
var visualTree = (VisualElement) m_viewVisualTree.GetValue(windowBackend, null);
#else// Get it's visual treevar visualTree = (VisualElement)m_viewVisualTree.GetValue(m_currentToolbar, null);
#endif// Get first child which 'happens' to be toolbar IMGUIContainervar container = (IMGUIContainer)visualTree[0];// (Re)attach handlervar handler = (Action)m_imguiContainerOnGui.GetValue(container);handler -= OnGUI;handler += OnGUI;m_imguiContainerOnGui.SetValue(container, handler);#endif}}}static void OnGUI(){var handler = OnToolbarGUI;if (handler != null) handler();}
}[InitializeOnLoad]
public static class UnityEditorToolbar
{static int m_toolCount;static GUIStyle m_commandStyle = null;public static readonly List<Action> LeftToolbarGUI = new List<Action>();public static readonly List<Action> RightToolbarGUI = new List<Action>();static UnityEditorToolbar(){Type toolbarType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.Toolbar");#if UNITY_2019_1_OR_NEWERstring fieldName = "k_ToolCount";
#else
string fieldName = "s_ShownToolIcons";
#endifFieldInfo toolIcons = toolbarType.GetField(fieldName,BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);#if UNITY_2019_3_OR_NEWERm_toolCount = toolIcons != null ? ((int)toolIcons.GetValue(null)) : 8;
#elif UNITY_2019_1_OR_NEWER
m_toolCount = toolIcons != null ? ((int) toolIcons.GetValue(null)) : 7;
#elif UNITY_2018_1_OR_NEWER
m_toolCount = toolIcons != null ? ((Array) toolIcons.GetValue(null)).Length : 6;
#else
m_toolCount = toolIcons != null ? ((Array) toolIcons.GetValue(null)).Length : 5;
#endifToolbarCallback.OnToolbarGUI = OnGUI;ToolbarCallback.OnToolbarGUILeft = GUILeft;ToolbarCallback.OnToolbarGUIRight = GUIRight;}#if UNITY_2019_3_OR_NEWERpublic const float space = 8;
#else
public const float space = 10;
#endifpublic const float largeSpace = 20;public const float buttonWidth = 32;public const float dropdownWidth = 80;
#if UNITY_2019_1_OR_NEWERpublic const float playPauseStopWidth = 140;
#else
public const float playPauseStopWidth = 100;
#endifstatic void OnGUI(){// Create two containers, left and right// Screen is whole toolbarif (m_commandStyle == null){m_commandStyle = new GUIStyle("CommandLeft");}var screenWidth = EditorGUIUtility.currentViewWidth;// Following calculations match code reflected from Toolbar.OldOnGUI()float playButtonsPosition = Mathf.RoundToInt((screenWidth - playPauseStopWidth) / 2);Rect leftRect = new Rect(0, 0, screenWidth, Screen.height);leftRect.xMin += space; // Spacing leftleftRect.xMin += buttonWidth * m_toolCount; // Tool buttons
#if UNITY_2019_3_OR_NEWERleftRect.xMin += space; // Spacing between tools and pivot
#else
leftRect.xMin += largeSpace; // Spacing between tools and pivot
#endifleftRect.xMin += 64 * 2; // Pivot buttonsleftRect.xMax = playButtonsPosition;Rect rightRect = new Rect(0, 0, screenWidth, Screen.height);rightRect.xMin = playButtonsPosition;rightRect.xMin += m_commandStyle.fixedWidth * 3; // Play buttonsrightRect.xMax = screenWidth;rightRect.xMax -= space; // Spacing rightrightRect.xMax -= dropdownWidth; // LayoutrightRect.xMax -= space; // Spacing between layout and layersrightRect.xMax -= dropdownWidth; // Layers
#if UNITY_2019_3_OR_NEWERrightRect.xMax -= space; // Spacing between layers and account
#else
rightRect.xMax -= largeSpace; // Spacing between layers and account
#endifrightRect.xMax -= dropdownWidth; // AccountrightRect.xMax -= space; // Spacing between account and cloudrightRect.xMax -= buttonWidth; // CloudrightRect.xMax -= space; // Spacing between cloud and collabrightRect.xMax -= 78; // Colab// Add spacing around existing controlsleftRect.xMin += space;leftRect.xMax -= space;rightRect.xMin += space;rightRect.xMax -= space;// Add top and bottom margins
#if UNITY_2019_3_OR_NEWERleftRect.y = 4;leftRect.height = 22;rightRect.y = 4;rightRect.height = 22;
#else
leftRect.y = 5;
leftRect.height = 24;
rightRect.y = 5;
rightRect.height = 24;
#endifif (leftRect.width > 0){GUILayout.BeginArea(leftRect);GUILayout.BeginHorizontal();foreach (var handler in LeftToolbarGUI){handler();}GUILayout.EndHorizontal();GUILayout.EndArea();}if (rightRect.width > 0){GUILayout.BeginArea(rightRect);GUILayout.BeginHorizontal();foreach (var handler in RightToolbarGUI){handler();}GUILayout.EndHorizontal();GUILayout.EndArea();}}public static void GUILeft(){GUILayout.BeginHorizontal();foreach (var handler in LeftToolbarGUI){handler();}GUILayout.EndHorizontal();}public static void GUIRight(){GUILayout.BeginHorizontal();foreach (var handler in RightToolbarGUI){handler();}GUILayout.EndHorizontal();}
}
svn工具辅助类 SVNHelper
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using UnityEditor;
using UnityEngine;
public static class SVNHelper
{//Log[MenuItem("Assets/SVN/日志",false,1)]private static void RightClickLog(){var path = MySelectActiveObj();if (string.IsNullOrEmpty(path) == false){StartSvnProc("log", path);}}//更新[MenuItem("Assets/SVN/更新", false, 1)]private static void RightClickUpdate(){var path = MySelectActiveObj();if (string.IsNullOrEmpty(path) == false){StartSvnProc("update", path);}}//提交[MenuItem("Assets/SVN/提交", false, 1)]private static void RightClickCommit(){var path= MySelectActiveObj();if (string.IsNullOrEmpty(path)==false){StartSvnProc("commit", path);}}// 获取选中的对象private static string MySelectActiveObj(){ var selectedObjects = Selection.objects;if (selectedObjects.Length > 0){foreach (var obj in selectedObjects){// 检查选定对象是否是文件夹string path = AssetDatabase.GetAssetPath(obj);if (AssetDatabase.IsValidFolder(path)){string target = Application.dataPath.Replace("Assets", "")+path;return target;}}}return null;}public static int StartSvnProc(string cmd, string path, string url = "", bool closeOnEnd = false,string logMsg = ""){ProcessStartInfo startInfo = new ProcessStartInfo();
#if UNITY_EDITOR_WINvar tortoiseProcPath = GetTortoiseProcSvnPath();if (string.IsNullOrEmpty(tortoiseProcPath)){UnityEngine.Debug.LogError("TortoiseProc未找到");return 0;}startInfo.FileName = tortoiseProcPath;if (cmd.Equals("commit") && !string.IsNullOrEmpty(logMsg)){if (string.IsNullOrEmpty(url))startInfo.Arguments =$"/command:{cmd} /path:\"{path}\" /logmsg:{logMsg} /closeonend:{(closeOnEnd ? 2 : 0)}";elsestartInfo.Arguments =$"/command:{cmd} /path:\"{path}\" /url:\"{url}\" /logmsg:{logMsg} /closeonend:{(closeOnEnd ? 2 : 0)}";}else{if (string.IsNullOrEmpty(url))startInfo.Arguments = $"/command:{cmd} /path:\"{path}\" /closeonend:{(closeOnEnd ? 2 : 0)}";elsestartInfo.Arguments =$"/command:{cmd} /path:\"{path}\" /url:\"{url}\" /closeonend:{(closeOnEnd ? 2 : 0)}";}startInfo.RedirectStandardOutput = true;startInfo.UseShellExecute = false;#elif UNITY_EDITOR_OSXstartInfo.CreateNoWindow = true;startInfo.ErrorDialog = true;startInfo.UseShellExecute = false;startInfo.FileName = "/usr/local/bin/svn";startInfo.Arguments = $"{cmd} {url} {path}";startInfo.RedirectStandardOutput = true;UnityEngine.Debug.Log("start process = " + startInfo.Arguments);
#endifProcess svnUpProcess = new Process();svnUpProcess.StartInfo = startInfo;svnUpProcess.Start();svnUpProcess.WaitForExit();string output = svnUpProcess.StandardOutput.ReadToEnd();UnityEngine.Debug.Log("process output = " + output);var exitCode = svnUpProcess.ExitCode;svnUpProcess.Close();AssetDatabase.Refresh();return exitCode;}private static string GetTortoiseProcSvnPath(){try{RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default);var path = key.OpenSubKey("SOFTWARE").OpenSubKey("TortoiseSVN").GetValue("ProcPath").ToString();return path;}catch (Exception){string[] vols = { "C", "D", "E", "F", "G", "H" };string[] dirs ={@"Program Files",@"Program Files (x86)",};foreach (var vol in vols)foreach (var dir in dirs){string file = $"{vol}:\\{dir}\\TortoiseSVN\\bin\\TortoiseProc.exe";if (File.Exists(file))return file;}return null;}}
}
git工具辅助类 GitHelper
using Microsoft.Win32;
using System;
using System.Diagnostics;
using UnityEditor;
public class GitHelper
{public static bool StartGitProc(string cmd, string path, string outPath = ""){string gitProcPath = GetTortoiseGitProcPath();if (string.IsNullOrEmpty(gitProcPath)){UnityEngine.Debug.LogError("TortoiseGitProc未找到");return false;}ProcessStartInfo startInfo = new ProcessStartInfo();startInfo.FileName = gitProcPath;startInfo.Arguments = $"/command:{cmd} /path:\"{path}\"/closeonend:2";Process gitProcess = new Process();gitProcess.StartInfo = startInfo;gitProcess.Start();gitProcess.WaitForExit();if (gitProcess.ExitCode > 0){EditorUtility.DisplayDialog("提示", $"git {cmd} exit with code:{gitProcess.ExitCode}", "确定");return false;}return true;}public static string GetTortoiseGitProcPath(){try{RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default);var path = key.OpenSubKey("SOFTWARE").OpenSubKey("TortoiseGit").GetValue("ProcPath").ToString();return path;}catch (Exception){return null;}}
}
相关文章:
Unity辅助工具_头部与svn
Unity调用者按钮增加PlaySideButton using QQu; using UnityEditor; using UnityEngine; [InitializeOnLoad] public class PlaySideButton {static PlaySideButton(){UnityEditorToolbar.RightToolbarGUI.Add(OnRightToolbarGUI);UnityEditorToolbar.LeftToolbarGUI.Add(OnLe…...
VBA 数据库同一表的当前行与其他行的主键重复判断实现方案1
目的,判断是否主键重复,不重复则登录新数据,重复则不登录。 定义类型: DataRecord tableName 表名 rowNumber 行号 columnName 列名 data 数据 想要实现的代码逻辑如下: 模拟数据库的登录过程。假设…...
Pytorch系列教程:可视化Pytorch模型训练过程
深度学习和理解训练过程中的学习和进步机制对于优化性能、诊断欠拟合或过拟合等问题至关重要。将训练过程可视化的过程为学习的动态提供了有价值的见解,使我们能够做出合理的决策。训练进度必须可视化的两种方法是:使用Matplotlib和Tensor Board。在本文…...
CSS伸缩盒模型(弹性盒子)
伸缩盒模型(Flexbox,Flexible Box Layout)是 CSS 中一种一维布局模型,用于更高效地处理元素的对齐、分布和响应式布局。其核心思想是让容器内的子元素(称为“项目”)能够灵活地自动调整大小和位置以适应不同…...
C++蓝桥杯基础篇(十一)
片头 嗨~小伙伴们,大家好!今天我们来学习C蓝桥杯基础篇(十一),学习类,结构体,指针相关知识,准备好了吗?咱们开始咯~ 一、类与结构体 类的定义:在C中&#x…...
版本控制泄露源码 .svn
##相关知识 SVN源码泄露 SVN(subversion)是源代码版本管理软件,造成 SVN 源代码漏洞的主要原因是管理员操作不规范。“ 在使用 SVN 管理本地代码过程中,会自动生成一个名为 .svn 的隐藏文件夹,其中包含重要的源代码信…...
基于单片机的风速报警装置设计
标题:基于单片机的风速报警装置设计 内容:1.摘要 本设计聚焦于基于单片机的风速报警装置,旨在解决传统风速监测缺乏实时报警功能的问题。采用单片机作为核心控制单元,结合风速传感器采集风速数据。经实验测试,该装置能准确测量 0 - 60m/s 范…...
YOLOv12本地部署教程——42%速度提升,让高效目标检测触手可及
YOLOv12 是“你只看一次”(You Only Look Once, YOLO)系列的最新版本,于 2025 年 2 月发布。它引入了注意力机制,提升了检测精度,同时保持了高效的实时性能。在保持速度的同时,显著提升了检测精度。例如&am…...
Banana Pi OpenWRT One Wifi6 OpenWrt社区官方开源路由器评测
第一款不可破解、开源、版权软件、符合 FCC、CE 和 RoHS 的维修权路由器 OpenWRT项目今年已经20岁了,为了纪念这一时刻,Banana Pi OpenWrt One/AP-24.XY路由器开发系统已经上市。这是OpenWRT团队与硬件公司的第一个联合项目。选择 Banana Pi,…...
【算法】经典排序算法介绍+代码示例
排序算法介绍 1)冒泡排序 (Bubble Sort)2)选择排序(Selection Sort)3)插入排序(Insertion Sort)4)希尔排序(Shell Sort)5)归并排序(Me…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_02带边框和斑马纹的固定表头表格
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
【Linux】线程控制
目录 一、原生线程库: 二、线程控制: 1、线程创建: 2、线程等待: 自定义类型的接收对象: 编辑 3、线程终止: pthread_exit: pthread_cancel: 4、线程ID: 线程库的底层原…...
pyqt联合designer的运用和设置
PyQt Designer 简介 PyQt Designer 是一个用于创建和设计 PyQt 应用程序用户界面的可视化工具。它允许用户通过拖放方式添加和排列各种控件,如按钮、文本框、滑块等,并设置它们的属性和样式,从而快速构建出美观且功能完整的 UI 界面。 Windows版本:【免费】安装包别管啊啊…...
spring boot3.4.3+MybatisPlus3.5.5+swagger-ui2.7.0
使用 MyBatis-Plus 操作 books 表。我们将实现以下功能: 创建实体类 Book。 创建 Mapper 接口 BookMapper。 创建 Service 层 BookService 和 BookServiceImpl。 创建 Controller 层 BookController。 配置 MyBatis-Plus 和数据库连接。 1. 项目结构 src ├─…...
利用微软的 HTML 应用程序宿主程序的攻击
mshta.exe 是微软的 HTML 应用程序宿主程序(Microsoft HTML Application Host),属于 Windows 系统组件。它的核心功能是运行 .hta(HTML Application)文件,允许通过 HTML、JavaScript、VBScript 等技术创建交…...
【深度学习】读写文件
读写文件 到目前为止,我们讨论了如何处理数据,以及如何构建、训练和测试深度学习模型。 然而,有时我们希望保存训练的模型,以备将来在各种环境中使用(比如在部署中进行预测)。 此外,当运行一个…...
Bert的使用
一、Data.py # data负责产生两个dataloader from torch.utils.data import DataLoader, Dataset from sklearn.model_selection import train_test_split #给X,Y 和分割比例, 分割出来一个训练集和验证机的X, Y import torchdef read_file(path):data []label …...
Unity使用UGUI制作无限滑动列表
原理参照上一篇使用NGUI的制作无限滑动列表的文章 Unity 使用NGUI制作无限滑动列表_unity 滑动列表很多物体-CSDN博客 准备工作: 新建一个空物体命名为LoopList,并调整其大小, 并增加Scroll Rect组件(用于滑动)、Re…...
ThinkPHP6用户登录系统的全过程
ThinkPHP6用户登录系统的全过程涉及请求处理、数据传输、路由分发、控制器逻辑、模型验证及中间件协作等多个模块的交互。详细的过程解析如下: 1. 前端请求与路由分发 前端发起请求:用户在前端页面(如Vue组件或HTML表单)输入用户…...
C++全栈聊天项目(2) 单例模式封装Http管理者
完善注册类界面 先在注册类构造函数里添加lineEdit的模式为密码模式 ui->lineEdit_Passwd->setEchoMode(QLineEdit::Password); ui->lineEdit_Confirm->setEchoMode(QLineEdit::Password);我们在注册界面的ui里添加一个widget,widget内部包含一个tip居…...
【鸿蒙开发】OpenHarmony调测工具hdc使用教程(设备开发者)
00. 目录 文章目录 00. 目录01. OpenHarmony概述02. hdc简介03. hdc获取04. option相关的命令05. 查询设备列表的命令06. 服务进程相关命令07. 网络相关的命令08. 文件相关的命令09. 应用相关的命令10. 调试相关的命令11. 常见问题12. 附录 01. OpenHarmony概述 OpenHarmony是…...
ORACLE EBS数据库RELINK方式搭建克隆环境
ORACLE EBS系统的数据库,一般都安装了很多特定功能的小补丁来解决特定的BUG;因此对于已经安装好的系统,想要克隆一套测试环境、搭建一个新的备机做测试等,如果按照生产环境标准,则需要安装大量补丁,带来很大…...
MySQL regexp 命令
REGEXP命令是一种用于进行正则表达式匹配的运算符,允许在查询中使用正则表达式来匹配字符串模式1。 基本语法 基本的语法结构如下: SELECT * FROM table_name WHERE column_name REGEXP pattern; 这里,pattern是你要匹配的正则表达式模…...
前端实习到工作的经历
看了很多人的程序员生涯之路,我突然意识到我也该记录一些东西,因此有感而发。 我是一个24届毕业生,大三下就开始找前端实习,当时学校不让走,我们都是先面着然后准备放假就去。当时周围小伙伴都找好了,考完…...
Vue3——Fragment
文章目录 一、Fragment的核心意义1. 解决Vue2的单根限制问题2. 减少不必要的 DOM 嵌套3. 语义化和结构化 二、Fragment 的实现原理三、Fragment 使用方式1. 基本用法2. 结合条件渲染3. 动态组件 四、实际应用场景1. 列表/表格组件2. 布局组件3. 语义化标签 五、注意事项1. 属性…...
Linux_16进程地址空间
CPU内的寄存器只有一套,但是CPU内寄存器的数据可能会有多份! 一、程序地址空间 下面这个图对应的是内存吗?(实际上是虚拟的进程地址空间) 32位机器内存最大为多少? 32位操作系统的地址总线为32位&#x…...
职坐标机器学习编程实战:调试优化与自动化测试精要
内容概要 在机器学习编程实践中,代码调试优化与自动化测试工具的应用是构建高可靠性系统的核心环节。本书聚焦从数据预处理到模型部署的全流程,通过特征工程优化、训练过程监控及持续集成方案的设计,系统化解决算法工程化中的典型问题。在特…...
git文件过大导致gitea仓库镜像推送失败问题解决(push failed: context deadline exceeded)
问题描述: 今天发现gitea仓库推送到某个镜像仓库的操作几个月前已经报错终止推送了,报错如下: 首先翻译报错提示可知是因为git仓库大小超过1G限制。检查本地.git文件,发现.git文件大小已达到1.13G。确定是.git文件过大导致&…...
llvm数据流分析
llvm数据流分析 1.数据流分析2.LLVM实现2.1.常量传播2.2.活跃性分析 相关参考文档:DataFlowAnalysisIntro、ustc编译原理课程、南大程序分析课程1、南大程序分析课程2。 1.数据流分析 数据流分析在编译优化等程序分析任务上都有重要应用。通常数据流分析可被抽象为…...
Vite为什么选用Rollup打包?
Vite 在生产阶段使用 Rollup 打包,但这不是唯一选择。它的设计背后有明确的权衡和考量,同时开发者也可以选择其他替代方案。 一、为什么 Vite 默认使用 Rollup? 1. Rollup 的核心优势 • Tree-shaking:Rollup 的静态分析能力极强&…...
Docker 入门与实战指南
Docker 入门与实战指南 一、Docker 简介 Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖打包成一个可移植的容器。容器可以在任何安装了 Docker 的环境中运行,确保应用的一致性和可移植性。 1.1 为什么使用 Docker? 环境一…...
C# 常用数据类型
C# 数据类型分为 值类型、引用类型 和 特殊类型,以下是详细分类及对应范围/说明: 一、值类型(Value Types) 值类型直接存储数据,分配在栈内存中,默认不可为 null。 简单类型 整数类型…...
深入解读 JavaScript 中 `this` 的指向机制:覆盖所有场景与底层原理
this 是 JavaScript 中最容易引发困惑的核心概念之一,它的指向在不同场景下呈现截然不同的行为。本文将系统性地解析 this 的所有使用场景,结合代码示例和底层原理,帮助你彻底掌握其运行机制。 一、全局环境下的 this 1. 浏览器环境 在浏览器…...
无人机全景应用解析与技术演进趋势
无人机全景应用解析与技术演进趋势 ——从立体安防到万物互联的空中革命 一、现有应用场景全景解析 (一)公共安全领域 1. 立体安防体系 空中哨兵:搭载 77 GHz 77\text{GHz} 77GHz毫米波雷达(探测距离 5 km 5\text{km} 5km&…...
手写简易Tomcat核心实现:深入理解Servlet容器原理
目录 一、Tomcat概况 1. tomcat全局图 2.项目结构概览 二、实现步骤详解 2.1 基础工具包(com.qcby.util) 2.1.1 ResponseUtil:HTTP响应生成工具 2.1.2 SearchClassUtil:类扫描工具 2.1.3 WebServlet:自定义注解…...
【音视频】ffmpeg命令提取像素格式
1、提取YUV数据 提取yuv数据,并保持分辨率与原视频一致 使用-pix_fmt或-pixel_format指定yuv格式提取数据,并保持原来的分辨率 ffmpeg -i music.mp4 -t "01:00" -pixel_format yuv420p music.yuv提取成功后,可以使用ffplay指定y…...
深度剖析Redis:双写一致性问题及解决方案全景解析
在高并发场景下,缓存与数据库的双写一致性是每个开发者必须直面的核心挑战。本文通过5大解决方案,带你彻底攻克这一技术难关! 一、问题全景图:当缓存遇到数据库 1.1 典型问题场景 // 典型问题代码示例 public void updateProduc…...
Redis----大key、热key解决方案、脑裂问题
文章中相关知识点在往期已经更新过了,如果有友友不理解可翻看往期内容 出现脑裂问题怎么保证集群还是高可用的 什么是脑裂问题 脑裂说的就是当我们的主节点没有挂,但是因为网络延迟较大,然后和主节点相连的哨兵通信较差,之后主…...
Android 调用c++报错 exception of type std::bad_alloc: std::bad_alloc
一、报错信息 terminating with uncaught exception of type std::bad_alloc: std::bad_alloc 查了那部分报错c++代码 szGridSize因为文件太大,初始化溢出了 pEGM->pData = new float[szGridSize]; 解决办法 直接抛出异常,文件太大就失败吧 最后还增加一个日志输出,给…...
【从零开始学习计算机科学】操作系统(五)处理器调度
【从零开始学习计算机科学】操作系统(五)处理器调度 处理器调度一些简单的短程调度算法的思路先来先服务(First-Come-First-Served,FCFS)优先级调度及其变种最短作业优先调度算法(SJF)--非抢占式最短作业优先调度算法(SJF)--抢占式最高响应比优先调度算法轮转调度算法…...
LeetCode1871 跳跃游戏VII
LeetCode 跳跃游戏 IV:二进制字符串的跳跃问题 题目描述 给定一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump。初始时,你位于下标 0 处(保证该位置为 0)。你需要判断是否能到达字符串的最后一个位置…...
ResNet50深度解析:原理、结构与PyTorch实现
ResNet50深度解析:原理、结构与PyTorch实现 1. 引言 ResNet(残差网络)是深度学习领域的一项重大突破,它巧妙解决了深层神经网络训练中的梯度消失/爆炸问题,使得构建和训练更深的网络成为可能。作为计算机视觉领域的里…...
MATLAB 控制系统设计与仿真 - 24
PID 控制器分析- 控制器的形式 连续控制器的结构: 为滤波时间常数,这类PID控制器在MATLAB系统控制工具箱称为并联PID控制器,可由MATLAB提供的pid函数直接输入,格式为: 其他类型的控制器也可以由该函数直接输入&#x…...
数字IC后端设计实现教程 |Innovus ICC2 Routing Pin Access Setting设置方法
默认情况下routing 引擎可以在标准单元可以打孔的任何地方(via region)打孔,甚至工具还会先拉出一块metal,然后再打孔过渡到高层。 随之工艺节点越做越小,标准单元内部的结构也越来越复杂。此时如果还沿用传统工艺的走…...
mysql经典试题共34题
1、准备数据 -- drop drop table if exists dept; drop table if exists emp; drop table if exists salgrade;-- CREATE CREATE TABLE dept (deptno int NOT NULL COMMENT 部门编号,dname varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMM…...
网络编程-----服务器(多路复用IO 和 TCP并发模型)
一、单循环服务器模型 1. 核心特征 while(1){newfd accept();recv();close(newfd);}2. 典型应用场景 HTTP短连接服务(早期Apache)CGI快速处理简单测试服务器 3. 综合代码 #include <stdio.h> #include <sys/types.h> /* See NO…...
GitHub 项目版本管理与 Release 发布流程记录
GitHub 项目版本管理与 Release 发布流程记录 1. 项目环境设置 1.1 打开 VS Code 并进入项目目录 E:\adb\Do>code .1.2 配置 Git 用户信息 E:\adb\Do>git config --global user.name "n" E:\adb\Do>git config --global user.email "**gmail.com&q…...
GStreamer —— 2.15、Windows下Qt加载GStreamer库后运行 - “播放教程 1:Playbin 使用“(附:完整源码)
运行效果 介绍 我们已经使用了这个元素,它能够构建一个完整的播放管道,而无需做太多工作。 本教程介绍如何进一步自定义,以防其默认值不适合我们的特定需求。将学习: • 如何确定文件包含多少个流,以及如何切换 其中。…...
Python+DeepSeek:开启AI编程新次元——从自动化到智能创造的实战指南
文章核心价值 技术热点:结合全球最流行的编程语言与国产顶尖AI模型实用场景:覆盖代码开发/数据分析/办公自动化等高频需求流量密码:揭秘大模型在编程中的创造性应用目录结构 环境搭建:5分钟快速接入DeepSeek场景一:AI辅助代码开发(智能补全+调试)场景二:数据分析超级助…...
使用OpenCV和MediaPipe库——驼背检测(姿态监控)
目录 驼背检测的运用 1. 驾驶姿态与疲劳关联分析 2. 行业应用案例 1. 教育场景痛点分析 2. 智能教室系统架构 代码实现思路 1. 初始化与配置 2. MediaPipe和摄像头设置 3. 主循环 4. 资源释放 RGB与BGR的区别 一、本质区别 二、OpenCV的特殊性 内存结构示意图&…...