2024-02-12 Unity 编辑器开发之编辑器拓展3 —— EditorGUI
文章目录
- 1 GUILayout
- 2 EditorGUI 介绍
- 3 文本、层级、标签、颜色拾取
- 3.1 LabelField
- 3.2 LayerField
- 3.3 TagField
- 3.4 ColorField
- 3.5 代码示例
- 4 枚举选择、整数选择、按下按钮
- 4.1 EnumPopup / EnumFlagsField
- 4.2 IntPopup
- 4.3 DropdownButton
- 4.4 代码示例
- 5 对象关联、各类型输入
- 5.1 ObjectField
- 5.2 各类型输入
- 5.3 代码示例
- 6 折叠、折叠组
- 6.1 Foldout
- 6.2 BeginFoldoutHeaderGroup / EndFoldoutHeaderGroup
- 6.3 代码示例
- 7 开关、开关组
- 7.1 Toggle / ToggleLeft
- 7.2 BeginToggleGroup / EndToggleGroup
- 7.3 代码示例
- 8 滑动条、双滑块滑动条
- 8.1 Slider / IntSlider
- 8.2 MinMaxSlider
- 8.3 代码示例
- 9 帮助框、间隔
- 9.1 HelpBox
- 9.2 Space
- 9.3 代码示例
- 10 动画曲线、布局
- 10.1 CurveField
- 10.2 布局相关 API
- 10.3 代码示例
1 GUILayout
GUILayout 是 GUI 自动布局的公共类,其中的方法和 GUI 基本类似,均用来绘制、响应各种 UI 控件,不同之处在于 GUILayout 在 GUI 的基础上加入了自动布局功能,无需过多关心 UI 控件的位置和大小。
GUILayoutOption 布局选项
- 控件的固定宽高
GUILayout.Width(300);GUILayout.Height(200);
- 允许控件的最小宽高
GUILayout.MinWidth(50);GUILayout.MinHeight(50);
- 允许控件的最大宽高
GUILayout.MaxWidth(100);GUILayout.MaxHeight(100);
- 允许或禁止水平拓展
GUILayout.ExpandWidth(true); //允许GUILayout.ExpandHeight(false); //禁止GUILayout.ExpandHeight(true); //允许GUILayout.ExpandHeight(false); //禁止
2 EditorGUI 介绍
EditorGUI 类似 GUI,是用于绘制编辑器拓展 UI 的工具类,提供 GUI 中没有的 API(主要是编辑器功能中会用到的一些特殊控件)。
EditorGUILayout 类似于 GUILayout,是带有自动布局功能的 EditorGUI 绘制工具类。通常,会将 EditorGUI 和 GUI 混合使用来制作编辑器拓展功能。但由于用到自动布局功能,因此接下来着重介绍 EditorGUILayout 中的功能。EditorGUI 和它的区别仅仅是需要自己设置位置而已。
详细内容:https://docs.unity.cn/cn/2022.3/ScriptReference/EditorGUILayout.html。
3 文本、层级、标签、颜色拾取
3.1 LabelField
EditorGUILayout.LabelField("文本标题", "文本内容");
3.2 LayerField
int变量 = EditorGUILayout.LayerField("层级选择", int变量);
3.3 TagField
string变量 = EditorGUILayout.TagField("标签选择", string变量);
3.4 ColorField
color变量 = EditorGUILayout.ColorField(new GUIContent("标题"), color变量, 是否显示拾色器, 是否显示透明度通道, 是否支持HDR);
3.5 代码示例
public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}int layer;string tag;Color color;private void OnGUI() {// 窗口中的控件相关绘制 逻辑处理相关的内容// EditorGUI相关的控件 同样还是需要在OnGUI当中进行实现 才能被显示出来// 文本EditorGUILayout.LabelField("文本标题", "测试内容");EditorGUILayout.LabelField("文本内容");// 层级layer = EditorGUILayout.LayerField("层级选择", layer);// 标签tag = EditorGUILayout.TagField("标签选择", tag);// 颜色获取color = EditorGUILayout.ColorField(new GUIContent("自定义颜色获取"), color, true, false, false);}
}
4 枚举选择、整数选择、按下按钮
4.1 EnumPopup / EnumFlagsField
-
枚举选择
枚举变量 = (枚举类型)EditorGUILayout.EnumPopup("枚举选择", 枚举变量); -
多选枚举
注意:多选枚举进行的是或运算,声明枚举时一定注意其中的赋值,并且一定要有多种情况的搭配值。
枚举变量 = (枚举类型)EditorGUILayout.EnumFlagsField("枚举多选", 枚举变量);
4.2 IntPopup
int变量 = EditorGUILayout.IntPopup("整数单选框", int变量, 字符串数组, int数组);
4.3 DropdownButton
EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive)- FocusType:枚举时告诉 UI 系统能够获得键盘焦点,当用户按 Tab 键时在控件之间进行切换。
- Keyboard:该控件可接收键盘焦点。
- Passive:该控件不能接收键盘焦点。
4.4 代码示例
public enum E_TestType
{One = 1,Two = 2,Three = 4,One_and_Two = 1 | 2,
}public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}E_TestType type;E_TestType type2;string[] strs = { "选择123", "选择234", "选择345" };int[] ints = { 123, 234, 345 };int num = 0;private void OnGUI() {// 枚举选择type = (E_TestType)EditorGUILayout.EnumPopup("枚举选择", type);type2 = (E_TestType)EditorGUILayout.EnumFlagsField("枚举多选", type2);// 整数选择控件// 返回值是整数数组当中的某一个值num = EditorGUILayout.IntPopup("整数单选框", num, strs, ints);EditorGUILayout.LabelField(num.ToString());// 按下就响应的按钮if (EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive))Debug.Log("按下就响应");}
}
5 对象关联、各类型输入
5.1 ObjectField
对象变量 = EditorGUILayout.ObjectField(对象变量, typeof(对象类型), 是否允许关联场景上对象资源) as 对象类型;
5.2 各类型输入
-
int变量 = EditorGUILayout.IntField("Int输入框", int变量); -
long变量 = EditorGUILayout.LongField("long输入框", long变量); -
float变量 = EditorGUILayout.FloatField("Float 输入:", float变量); -
double变量 = EditorGUILayout.DoubleField("double 输入:", double变量); -
string变量 = EditorGUILayout.TextField("Text输入:", string变量); -
vector2变量 = EditorGUILayout.Vector2Field("Vec2输入: ", vector2变量); -
vector3变量 = EditorGUILayout.Vector3Field("Vec3输入: ", vector3变量); -
vector4变量 = EditorGUILayout.Vector4Field("Vec4输入: ", vector4变量); -
rect变量 = EditorGUILayout.RectField("rect输入: ", rect变量); -
bounds变量 = EditorGUILayout.BoundsField("Bounds输入: ", bounds变量); -
boundsInt变量 = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt变量);
注意:EditorGUILayout 中 Delayed 开头的输入控件和普通输入控件最主要的区别是:在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改。
5.3 代码示例
public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}GameObject obj;int i;int i2;float f;double d;long l;string str;Vector2 vec2;Vector3 vec3;Vector4 vec4;Rect rect;Bounds bounds;BoundsInt boundsInt;private void OnGUI() {// 对象关联obj = EditorGUILayout.ObjectField("关联资源对象", obj, typeof(GameObject), false) as GameObject;// 各类型输入i = EditorGUILayout.IntField("Int输入框", i);EditorGUILayout.LabelField(i.ToString());l = EditorGUILayout.LongField("long输入框", l);f = EditorGUILayout.FloatField("Float 输入:", f);d = EditorGUILayout.DoubleField("double 输入:", d);str = EditorGUILayout.TextField("Text输入:", str);vec2 = EditorGUILayout.Vector2Field("Vec2输入: ", vec2);vec3 = EditorGUILayout.Vector3Field("Vec3输入: ", vec3);vec4 = EditorGUILayout.Vector4Field("Vec4输入: ", vec4);rect = EditorGUILayout.RectField("rect输入: ", rect);bounds = EditorGUILayout.BoundsField("Bounds输入: ", bounds);boundsInt = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt);// 注意:EditorGUILayout 中 Delayed 开头的输入控件和普通输入控件最主要的区别是:// 在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改。i2 = EditorGUILayout.DelayedIntField("Int输入框", i2);EditorGUILayout.LabelField(i2.ToString());}
}
6 折叠、折叠组
6.1 Foldout
bool变量 = EditorGUILayout.Foldout(bool变量, "标题名");
6.2 BeginFoldoutHeaderGroup / EndFoldoutHeaderGroup
-
bool变量 = EditorGUILayout.BeginFoldoutHeaderGroup(bool变量, "标题名");...EditorGUILayout.EndFoldoutHeaderGroup();
折叠组会有高亮加粗的显示,而普通折叠没有。
6.3 代码示例
public enum E_TestType
{One = 1,Two = 2,Three = 4,One_and_Two = 1 | 2,
}public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}E_TestType type;E_TestType type2;string[] strs = { "选择123", "选择234", "选择345" };int[] ints = { 123, 234, 345 };int num = 0;GameObject obj;int i;int i2;float f;double d;long l;string str;Vector2 vec2;Vector3 vec3;Vector4 vec4;Rect rect;Bounds bounds;BoundsInt boundsInt;bool isHide;bool isHideGroup;private void OnGUI() {isHide = EditorGUILayout.Foldout(isHide, "折叠控件", false);if (isHide) {// 枚举选择type = (E_TestType)EditorGUILayout.EnumPopup("枚举选择", type);type2 = (E_TestType)EditorGUILayout.EnumFlagsField("枚举多选", type2);// 整数选择控件// 返回值是整数数组当中的某一个值num = EditorGUILayout.IntPopup("整数单选框", num, strs, ints);EditorGUILayout.LabelField(num.ToString());// 按下就响应的按钮if (EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive))Debug.Log("按下就响应");}isHideGroup = EditorGUILayout.BeginFoldoutHeaderGroup(isHideGroup, "折叠组控件");if (isHideGroup) {// 对象关联obj = EditorGUILayout.ObjectField("关联资源对象", obj, typeof(GameObject), false) as GameObject;// 各类型输入i = EditorGUILayout.IntField("Int输入框", i);EditorGUILayout.LabelField(i.ToString());l = EditorGUILayout.LongField("long输入框", l);f = EditorGUILayout.FloatField("Float 输入:", f);d = EditorGUILayout.DoubleField("double 输入:", d);str = EditorGUILayout.TextField("Text输入:", str);vec2 = EditorGUILayout.Vector2Field("Vec2输入: ", vec2);vec3 = EditorGUILayout.Vector3Field("Vec3输入: ", vec3);vec4 = EditorGUILayout.Vector4Field("Vec4输入: ", vec4);rect = EditorGUILayout.RectField("rect输入: ", rect);bounds = EditorGUILayout.BoundsField("Bounds输入: ", bounds);boundsInt = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt);// 注意:EditorGUILayout 中 Delayed 开头的输入控件和普通输入控件最主要的区别是:// 在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改。i2 = EditorGUILayout.DelayedIntField("Int输入框", i2);EditorGUILayout.LabelField(i2.ToString());}EditorGUILayout.EndFoldoutHeaderGroup();}
}
7 开关、开关组
7.1 Toggle / ToggleLeft
-
普通开关
bool变量 = EditorGUILayout.Toggle("普通开关", bool变量); -
左侧开关
bool变量 = EditorGUILayout.ToggleLeft("开关在左侧", bool变量);
7.2 BeginToggleGroup / EndToggleGroup
-
bool变量 = EditorGUILayout.BeginToggleGroup("开关组", bool变量);...EditorGUILayout.EndToggleGroup();
7.3 代码示例
public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}bool isTog;bool isTogLeft;bool isTogGroup;private void OnGUI() {// 开关组控件isTogGroup = EditorGUILayout.BeginToggleGroup("开关组控件", isTogGroup);// 开关控件isTog = EditorGUILayout.Toggle("开关控件", isTog);isTogLeft = EditorGUILayout.ToggleLeft("左侧开关", isTogLeft);EditorGUILayout.EndToggleGroup();}
}
8 滑动条、双滑块滑动条
8.1 Slider / IntSlider
float变量 = EditorGUILayout.Slider("滑动条", float变量, 最小值, 最大值);int变量 = EditorGUILayout.IntSlider("整数值滑动条", int变量, 最小值, 最大值);
8.2 MinMaxSlider
EditorGUILayout.MinMaxSlider("双块滑动条", ref 左侧值, ref 右侧值, 最小值, 最大值);
没有返回值,通过 ref 关键字修改数值。
8.3 代码示例
public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}float fSlider;int iSlider;float leftV;float rightV;private void OnGUI() {// 滑动条fSlider = EditorGUILayout.Slider("滑动条", fSlider, 0, 10);iSlider = EditorGUILayout.IntSlider("整形滑动条", iSlider, 0, 10);// 双块滑动条EditorGUILayout.MinMaxSlider("双块滑动条", ref leftV, ref rightV, 0, 10);EditorGUILayout.LabelField(leftV.ToString());EditorGUILayout.LabelField(rightV.ToString());}
}
9 帮助框、间隔
9.1 HelpBox
EditorGUILayout.HelpBox("一般提示", MessageType.None);EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);
9.2 Space
EditorGUILayout.Space(10); // 间隔 10 个单位
9.3 代码示例
public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}private void OnGUI() {EditorGUILayout.HelpBox("一般提示", MessageType.None);EditorGUILayout.Space(10);EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);EditorGUILayout.Space(50);EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);EditorGUILayout.Space(100);EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);}
}
10 动画曲线、布局
10.1 CurveField
AnimationCurve变量 = EditorGUILayout.CurveField("动画曲线:", AnimationCurve变量);
10.2 布局相关 API
-
水平布局
EditorGUILayout.BeginHorizontal(); // 开始水平布局...
EditorGUILayout.EndHorizontal(); // 结束水平布局 -
垂直布局
EditorGUILayout.BeginVertical(); // 开始垂直布局
...
EditorGUILayout.EndVertical(); // 结束垂直布局 -
滚动视图
Vector2布局 = EditorGUILayout.BeginScrollView(Vector2布局); // 开启滚动视图...
EditorGUILayout.EndScrollView(); // 结束滚动视图
10.3 代码示例
public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}bool isTog;bool isTogLeft;bool isTogGroup;float fSlider;int iSlider;float leftV;float rightV;AnimationCurve curve = new AnimationCurve();Vector2 vec2Pos;private void OnGUI() {vec2Pos = EditorGUILayout.BeginScrollView(vec2Pos); // 开启滚动视图// 开关组控件isTogGroup = EditorGUILayout.BeginToggleGroup("开关组控件", isTogGroup);// 开关控件isTog = EditorGUILayout.Toggle("开关控件", isTog);isTogLeft = EditorGUILayout.ToggleLeft("左侧开关", isTogLeft);EditorGUILayout.EndToggleGroup();// 滑动条fSlider = EditorGUILayout.Slider("滑动条", fSlider, 0, 10);iSlider = EditorGUILayout.IntSlider("整形滑动条", iSlider, 0, 10);// 双块滑动条EditorGUILayout.MinMaxSlider("双块滑动条", ref leftV, ref rightV, 0, 10);EditorGUILayout.LabelField(leftV.ToString());EditorGUILayout.LabelField(rightV.ToString());// 帮助框控件EditorGUILayout.HelpBox("一般提示", MessageType.None);EditorGUILayout.Space(10);EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);EditorGUILayout.Space(50);EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);EditorGUILayout.Space(100);EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);// 间隔控件EditorGUILayout.EndScrollView(); // 结束滚动视图// 动画曲线控件curve = EditorGUILayout.CurveField("曲线控件", curve);// 布局APIEditorGUILayout.BeginHorizontal(); // 开始水平布局EditorGUILayout.LabelField("123123");EditorGUILayout.LabelField("123123");EditorGUILayout.LabelField("123123");EditorGUILayout.EndHorizontal(); // 结束水平布局EditorGUILayout.BeginVertical(); // 开始垂直布局EditorGUILayout.LabelField("123123");EditorGUILayout.LabelField("123123");EditorGUILayout.LabelField("123123");EditorGUILayout.EndVertical(); // 结束垂直布局}
}

相关文章:
2024-02-12 Unity 编辑器开发之编辑器拓展3 —— EditorGUI
文章目录 1 GUILayout2 EditorGUI 介绍3 文本、层级、标签、颜色拾取3.1 LabelField3.2 LayerField3.3 TagField3.4 ColorField3.5 代码示例 4 枚举选择、整数选择、按下按钮4.1 EnumPopup / EnumFlagsField4.2 IntPopup4.3 DropdownButton4.4 代码示例 5 对象关联、各类型输入…...
shell脚本编译与解析
文章目录 shell变量全局变量(环境变量)局部变量设置PATH 环境变量修改变量属性 启动文件环境变量持久化 ./和. 的区别脚本编写判断 和循环命令行参数传入参数循环读取命令行参数获取用户输入 处理选项处理简单选项处理带值选项 重定向显示并且同时输出到…...
第64讲个人中心用户操作菜单实现
静态页面 <!-- 用户操作菜单开始 --><view class"user_menu"><!-- 订单管理开始 --><view class"order_wrap"><view class"order_title">我的订单</view><view class"order_content"><n…...
线性代数的本质——1 向量
向量是线性代数中最为基础的概念。 何为向量? 从物理上看, 向量就是既有大小又有方向的量,只要这两者一定,就可以在空间中随便移动。 从计算机应用的角度看,向量和列表很接近,可以用来描述某对象的几个不同…...
工业以太网交换机引领现代工厂自动化新潮流
随着科技的飞速发展,现代工厂正迎来一场前所未有的自动化变革,而工业以太网交换机的崭新角色正是这场变革的关键组成部分。本文将深入探讨工业以太网交换机与现代工厂自动化的紧密集成,探讨这一集成如何推动工业生产的智能化、效率提升以及未…...
Linux第46步_通过“添加自定义菜单”来学习menuconfig图形化配置原理
通过“添加自定义菜单”来学习menuconfig图形化配置原理,将来移植linux要用到。 自定义菜单要求如下: ①、在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。 ②、配置项为“MY TESTCONFIG”,此配置项处于菜单“My test m…...
推荐高端资源素材图库下载平台整站源码
推荐高端图库素材下载站的响应式模板和完整的整站源码,适用于娱乐网资源网。该模板支持移动端,并集成了支付宝接口。 演示地 址 : runruncode.com/tupiao/19692.html 页面设计精美,不亚于大型网站的美工水准,并且用户…...
Redis实现:每个进程每30秒执行一次任务
前言 项目中要实现每一进程每30秒执行一次 代码实现: public class DistributedScheduler {private final RRedisClient redisson;private final String processKeyPrefix; // 例如 "process_"public DistributedScheduler(RRedisClient redisson) {this.redisson…...
【AI之路】使用RWKV-Runner启动大模型,彻底实现大模型自由
文章目录 前言一、RWKV-Runner是什么?RWKV-Runner是一个大语言模型的启动平台RWKV-Runner官方功能介绍 二、使用步骤1. 下载文件 总结 前言 提示:这里可以添加本文要记录的大概内容: ChatGPT的横空出世,打开了AI的大门ÿ…...
Dockerfile和.gitlab-ci.yml文件模板
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
Linux--基础开发工具篇(2)(vim)(配置白名单sudo)
目录 前言 1. vim 1.1vim的基本概念 1.2vim的基本操作 1.3vim命令模式命令集 1.4vim底行命令 1.5 异常问题 1.6 批量注释和批量去注释 1.7解决普通用户无法sudo的问题 1.8简单vim配置 前言 在前面我们学习了yum,也就是Linux系统的应用商店 Linux--基础开…...
Learn LaTeX 017 - LaTex Multicolumn 分栏
在科学排版中进行分栏操作,能够有效的利用页面中的空间,避免空白位置的浪费。 好的分栏设计能对你的排版增色不少! https://www.ixigua.com/7298100920137548288?id7307237715659981346&logTag949adb699806392430bb...
Android 9.0 禁用adb install 安装app功能
1.前言 在9.0的系统产品定制化开发中,在进行一些定制开发中,对于一些app需要通过属性来控制禁止安装,比如adb install也不允许安装,所以就需要 熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程 2.禁用adb install 安装app功能的…...
华为第二批难题五:AI技术提升六面体网格生成自动化问题
有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实,OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码,还没有仔细去学习。 “HybridOctree_Hex”的开发者说:六面体网格主要是用在数值模拟领域的,比如汽车…...
【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )
文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…...
vscode开发FPGA(0)--windows平台搭建
一、从官网下载安装VScode Download Visual Studio Code - Mac, Linux, Windows 二、安装配置插件 1. 安装Chinese(simplified)中文汉化包 2.安装Verilog-HDL/systemVerilog插件(支持verilog语法) 3.配置CTags Support插件(支持代码跳转) 1)在github下…...
Java String源码剖析+面试题整理
由于字符串操作是计算机程序中最常见的操作之一,在面试中也是经常出现。本文从基本用法出发逐步深入剖析String的结构和性质,并结合面试题来帮助理解。 String基本用法 在Java中String的创建可以直接像基本类型一样定义,也可以new一个 Str…...
探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战
开篇部分:人工智能、深度神经网络与内存计算的交汇 在当今数字化时代,人工智能(AI)已经成为科技领域的一股强大力量,而深度神经网络(DNN)则是AI的核心引擎之一。DNN是一种模仿人类神经系统运作…...
[C/C++] -- CMake使用
CMake(Cross-platform Make)是一个开源的跨平台构建工具,用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程,使得开发人员能够更方便地管理代码、依赖项和构建设置。 CMake 使用一个名为 CMakeLists.tx…...
笔记本选购配置参数详解
笔记本电脑的选购是一个技术活,涉及到众多的配置参数。本文将为您详细解析笔记本电脑的主要配置参数,帮助您在选购时做出明智的决策。 1. 处理器(CPU) 处理器是笔记本电脑的核心组件,负责执行计算任务…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
