Unity UI个人总结
个人总结,太简单的直接跳过。
一、缩放模式
1.固定像素大小
就是设置一个100x100的方框,在1920x1080像素下在屏幕中长度占比1/19,在3840x2160,方框在屏幕中长度占比1/38。也就是像素长款不变,在屏幕中占比发生变化
2.根据比例缩放
在1920x1080p下是100x100,在3840x2160中,方框的长宽会变成200x200,也就是在屏幕中占比不变。
3.固定物理大小
就是无论在什么分辨率中,在现实世界中拿尺子去量,它的长度都是一样的,不过这取决于是否能正确获取设备的DPI信息,在编辑器模式本身就是不准的,实机才有这个效果。
二、Canvas模式
1.Screen Space-Overlay
显示在一切之上,使用SortOrder对同为ScreenSpace模式的Canvas进行排序。
2.Screen Space-Camera
用相机渲染画布,也就是画布渲染在世界空间中,可以被世界空间中的物体遮挡。
一般单独创建一个UiCamera用于渲染相机模式的画布,UICamera把Culling mask设置为UI层级就可以只渲染UI。
其中PlanetDistance表示画布距离相机的距离,在和3d物体混合显示时使用这个来排序,sorting layer表示排序层,order in layer表示同一层中的order。
同一sorting layer如果order in layer 相同就依靠hireraarchy的顺序排序,如果orderinLayer不同则依靠order in layer排序,数字越大就显示在前。不同sorting layer根据sorting layer的顺序进行排序。
注意Sprite是2D/3D物体,在overlay模式中Ui永远显示在Sprite之前。由于Sprite的Sortinglayer和order layer是2d/3d空间中使用的(其实2d模式也是3d空间),当canvas使用相机模式或者世界空间模式的时候UI 元素与 Sprite可以在同一渲染队列中比较,从而实现跨系统的排序。此使Sorting layer和Order in layer的设置优先于3D空间中的深度判定,比如A画布在Sprite之后,但是如果A画布的Sprite layer较高或者order in layer较高,则A画布会显示在Sprite之前,Sprite和Sprite对比也是同理。
3.World Space
画布直接被放置在世界空间中,默认使用深度排序,可以被遮挡,与其他相机模式的画布,世界空间的画布,Sprite进行排序时也可以使用sortingLayer和order in layer进行排序。
三、锚点,AnchroedPosition,Pivot
图中绿色为父物体Image,白色为当前选中Image。
中间的空心圆是pivot,表示枢轴点(轴心点),旋转和缩放基于这个。取值范围为0-1,表示在自身UI的长宽的百分比。
anchordPostion,当四个锚点在同一个点时表示pivot相对于这个点的偏移量。比如:
此时 anchordPosition=(x,y);
但是,当锚点设置为区域时情况就大不相同了。
如图,锚点设置为(0.25,0.25)和(0.75,0.75).在说明这种情况下需要先了解下锚点的作用:
锚点设置的左下角(min)和右上角(max),他是基于父物体的,相当于设置了当前Ui在父物体中的的基准区域,设置基准区域后再在inspector中设置相对位置。当左下角和右上角锚点在同一个位置时,相当于区域设置为0,它相对于父物体的大小就是0,所以父物体长宽变换时子物体的长宽不动,但是位置会跟着变化,因为锚点中的数值其实就代表在父物体中的百分比位置。而如果设置在不同的点就会构成一个区域,这个区域占有一定的面积并且四个角也设置好了位置,当父物体变换时,这个基准区域会保持和之前相同比例进行长宽变换,此时inspector面板就变成了left,top,right,bottom的设置了,这个表示Ui和基准区域的四条边的距离。
重点来了:区域模式的anchoredPostition的计算,这个我翻遍百度谷歌和各种ai没找到具体的计算公式,最后自己测试出来的。anchoredPosition=图形和基准区域左下角的相对距离+图形和基准区域的大小的插值*pivot.
具体什么意思呢?如图:

和基准区域相同位置和大小时,无论如何移动pivot,anchoredPosition都为(0,0),此时白色长宽为(100,100)

整体移动后,anchoredPosition为(50,50)

整体移动后再拉伸,anchoredPosition=(50,50)+(50,0)*(0.5,0.5)=(75,50),就是相对距离+长宽变换*pivot。

此时移动Pivot为(1,0.5),结果变为(50,50)+(50,0)*(1,0.5)=(100,50)
同理,如果把pivot改为(0,0.5)结果就是(50,50)
四、anchordPosition和localPosition,position的区别
anchoredPosition上面已经说了,而llocalPosition和position都是基于Transform的,只有当Pivot改变时数值才会改变,localPosition和position使用的数值和分辨率是相对应的。要注意的是pivot位置并不是只会主动改变,当修改长宽的时候pivot也会跟着被动改变,注意这里说的是pivot的位置改变,不是pivot的值改变,要注意区分。
五、使用代码设置位置
1.rectTransform.anchoredPosition = targetAnchoredPos;
和获得anchoredPosition不同,设置的时候无论锚点是固定点还是自定义区域都是直接设置轴心点到锚点的相对位置。
2.sizeDelta和SetSizeWithCurrentAnchors
在 Unity UI
中,sizeDelta
和 SetSizeWithCurrentAnchors
都用于设置 RectTransform
的尺寸,但它们的工作方式有所不同。
rectTransform.sizeDelta=sizeDelta;
sizeDelta直接设置RectTransform的宽度和高度,当锚点固定时,他直接设置尺寸。但是当锚点为自定义区域时,它代表的是额外的尺寸,如第三部分中的100x100的白色方框,sizeDelta设置为(10,0)的时候,白色方框的尺寸变为110x100。
SetSizeWithCurrentAnchors
也是设置 RectTransform
的尺寸,但它会把anchor
的影响考虑在内,计算最终的 sizeDelta
,以确保视觉上符合指定的尺寸。
当SetSizeWithCurrentAnchors的时候,无论锚点如何,都是把尺寸长度设置为目标值。
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal,sizeDelta.x);
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical,sizeDelta.y);
3.offsetMin / offsetMax
rectTransform中的OffsetMin/OffsetMax属性用于设置相对于Anchors的偏移量,就是自定义区域模式中的inspector面板上的left,bottom,right,up这些属性。这个对固定锚点也有效,因为固定锚点其实也是有anchormin和anchorMax构成的,只是他们的位置相同而已。
如果先设置SizeDelta(无论哪种方式)再设置offset的话offset会覆盖尺寸的设置。
4.rectTransform.Rect
rectTransform.rect
返回的是一个 本地空间(local space) 下的 矩形区域,它主要用于获取 UI 元素的实际大小和边界信息。
4.1.rect.size和rect.width,rect.height,他们就是表示实际的区域的长宽。
4.2.rect.xMin,rect.xMax,rectyMin,recct.yMax。
表示的是相距pivot的距离值,如100x100的方框中,pivot为0.5,0.5时,xMin=-50,yMin-=50,xMin=50,xMax=50。如果pivot为0,0那么xMin=0,yMin=0,xMax=100,yMax=100。如果要获取世界中边界位置,需要使用GetWorldCorners()方法获得世界空间下的边界。还有,x等效于xMin,y等效于yMin
5.rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left,50,200);
此方法表示的是贴边操作,选择Edge后,它会自动设置锚点到父物体对应边并设置和边的间距和ui的长宽,常用于制作侧边栏之类的效果。注意,他不是设置和锚点的间距,而是父物体的边的间距,因为它本身就会修改锚点到指定的边。等效于以下代码:
rectTransform.anchorMin = new Vector2(0, rectTransform.anchorMin.y);
rectTransform.anchorMax = new Vector2(0, rectTransform.anchorMax.y);
rectTransform.anchoredPosition = new Vector2(50 + 200 * rectTransform.pivot.x, rectTransform.anchoredPosition.y);
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 200);
六、UI特效
1.制作Ui特效的几种方式
粒子特效的大部分图片来自B站Up主@别看着我笑了,我自己懒得作图,直接截取的它的视频里的图,应该不算侵权吧,毕竟我这个基本只算是个笔记,写出来防止以后自己忘掉到处翻。别看着我笑了https://space.bilibili.com/457739566
1.1.修改UI网格
比如UGUI中常用的文字的outline效果和Shadow效果,Mask效果,图片的FillType效果等就是修改Ui网格实现的。

1.2.使用自定义Shader

unity的Image组件会自动把Sprite传递给shader的_MainTex参数,然后编辑shader就可以制作Ui的shader效果了,包括边框流动,反光,置灰等效果。
比如置灰的效果:
half4 frag (v2f i) : SV_Target{half4 color = tex2D(_MainTex, i.uv);float gray = dot(color.rgb, half3(0.299, 0.587, 0.114));return half4(gray, gray, gray, color.a);}
再比如边框流光的效果:
shader代码太长核心部分:
half4 frag (v2f i) : SV_Target
{half4 color = tex2D(_MainTex, i.uv)*_Color;half4 flowingColor=tex2D(_FlowingTex,i.uv1);if(color.a>0.1){return color+flowingColor;}return color;}



1.3.粒子特效
Ui和粒子特效有时候需要结合使用。粒子特效是3d空间的,在overlay的Canvas下建一个粒子特效是根本看不见的。所以需要Cmaera模式的Canvas来配合使用。这种情况下就需要一个单独的Ui相机,这个ui相机需要叠加到主相机上,所以需要设置模式为Depth Only,然后主相机就可以去除掉Ui的渲染,UI相机则用来渲染需要和3d空间排序的UI。

关于图中右上角的正常Ui,这是要表达无需和3d空间排序的Ui放在overlay模式的canvas中就可以了。图中右下角所说的"放所需背景“的含义是这种模式下UI主要是作为特效的背景进行使用。
camera模式常用的特效效果如下


上面这张图片就是用两种canvas制作的,首先是camera模式的Ui,上下两个横幅Ui充当商人的背景。
然后是正常Ui在最前面遮挡所有的
1.4.更复杂的粒子特效

上图看着有点复杂,其实简而言之,就是复杂的内容需要自己处理,就比如给粒子系统加上遮罩,那就获取到particle system然后在OnPopulateMesh方法中获得单个粒子的quad判断位置决定显隐就行了。不过一般用插件就行了,我倒是没用过,好像UIParticle不错,
1.5.动画/序列帧动画
上面的内容很多情况下都可以考虑使用动画系统,包括流光,闪光,这些其实都可以用动画系统控制相关的位置来达到相关效果,包括加载动画的粒子特效,遮罩等。
七、UI技巧
1.自适应
这个算是非常常见的需求了,比如文本自适应大小,提示框自适应大小。
首先是文本自适应大小,这个很简单,直接在Text上加ContentsizeFilter然后设置要扩展的方向为prefeeredSize就行了 。简单来说,ContentSizeFilter就是根据Text等能够提供期望宽高的提供的期望宽高来动态调整自身宽高的组件,所以可以自适应宽高。

然后是对话框自适应大小 。
要制作对话框,首先创建一个Image把文本框包裹起来,文本框使用和上面文本自适应一样的设置。然后在Image上添加一个布局组件,gridLayoutGroup,verticalLayoutGroup,HorizontalGroupLayout都行,取决于你的文本框想要横向自适应大小还是竖向。添加布局组建后再添加一个ContentSizeFilter就可以并设置自适应方向为PreferredSize就行了。此时自适应对话框就制作完成了。简单来说,就是文本会自适应宽高,然后背景图片的layoutGroup组件可以获取子物体的宽高然后得到自己的期望宽高,背景图片上的ContentSizeFilter得到这个期望宽高再调整自己的宽高,就完成了自适应。
要制作多个子级的话原理也是一样,背景添加一个布局组和ContetntSIzeFilter就行,然后各个子物体添加contentsizeFilter就行。
如图,黑色背景添加VerticalLayoutGroup,contentSizeFilter,ContetntSizeFilter设置为纵向扩展,然后添加自定义文字区域(添加ContentSizeFilter),然后添加两张图片,图片不需要ContentSizeFilter,因为他的长度不是自适应变化的,然后再加一个文字区域(添加ContentSizeFilter)。
其实上面的方法不是特别标准,也会有上图中的警告,虽然能达到效果。这就需要引出layoutGroup的知识,这一块很复杂,懒得学的话也可以直接就用上面的方法制作自适应。
1.1.LayoutGroup控制
以下LayoutGroup相关内容来自B站UP主@Async_Officia的视频,我对其做了文字版总结。
Unity的Horizontal Layout Group 和Vertical Layout Group的作用
首先建立如图的UI结构,黑色背景,长宽为900x900,挂载HorizontalLayoutGroup,关闭ChildForceExpand,然后添加红绿蓝三个Image,它们都是正方形,长度分别为100,200,200。
1.1.1.Child Force Expand
ChildForceExpand是将剩余空间分配各个子物体,简单来说,有几个子物体就把剩余空间等分后分给子物体。当勾选childForceExpande的width,变为如下效果
然后上图中可以看到剩余空间均分后构成了三个区域,child Alignment就决定子物体在区域的哪一部分,childLayoutment中前面的Uppe,middle,lower等表示在父物体的上中下方,后面Left,center,right的表示子物体在分成的区域中的左中右
就比如这个例子中把upperLeft改为upperCenter就会发现子物体在区域的中间
1.1.2.ControlChildSize
先关闭Child Force Expand,单独打开ControlChildSize的Width,会发现子物体都看不见了
此时子物体的width都变成了0,因为没有宽高信息,如果Image的Sprite不为空的话其实就有宽高信息,就不会变成0,但是Sprite为空的时候就没有宽高信息,这个时候子物体的width就由布局组件来控制了,不再允许手动设置的大小。此时我们就需要LayoutElement来告诉它我们想要的宽度和高度。当然了,在Image有sprite可以正常显示的情况下LayoutElement也可以覆盖Sprite的宽高信息
如图,把期望宽度(preffered)设置为100就会显示了,还有一个MinWidth我没有设置,它是最小宽度,如果设置了,当布局组件发生长宽变化的时候如果父物体空间不够的话子物体的长度宽度就会缩小,缩小到MinWidth的时候就不会再继续缩小了,之后就会强行使用MinWidth来显示宽度。Height也是同理,只不过我们没有勾选Height,勾选ControlChildSize的Height后就可以用同样的方式来控制子物体的长宽。
1.1.2.1.flexible width
当父物体的空间大于所有子物体的期望空间之和的时候(这里是没有勾选Child Force Expand的情况),如果勾选Flexible width,子物体就会根据flexible width的比例来侵占剩余空间。比如都没有勾选,那就都是0,所以不会侵占空间,如果有一个勾选并设置大于0的值,那么那个就会侵占所有剩余空间。有两个勾选了并且设置的数值相等,那么就两个子物体每个占50%,如果他们设置的值不等,比如绿色设置1,蓝色设置3,那么绿色就获得剩余空间的25,蓝色获得剩余空间的75%。注意,这里的侵占是和Child Forece Expand不同,这里是直接更改子物体的长宽,因为勾选的就是Control child Size。
1.1.3.Control Child Size和Child Force Expand结合使用
首先要知道的是,ChilForceExpand会把多余区域分给子物体构成子物体区域,子物体可以在其中设置左中右位置。
然后Control Child Size使用Layout Element控制最小长宽(Min Width),期望长宽(Preferred Width)和可变长宽(Flexible Width),MinWdith决定最小宽度,Preferred Width决定期望宽度,当子物体剩余空间不足时会向最小宽度缩小,而当子物体剩余空间足够而又没有启用可变长宽,那么自子物体会保持期望长宽。当子物体剩余空间足够又启用了可变长宽,那么子物体会根据可变长宽比例瓜分剩余空间。
如果结合起来使用,勾选child Force Expand后会对子物体进行分区,此时勾选Control child size,那么就会强制所有Flexible为1以侵占剩余空间,此时修改每个子物体的FlexibleWidth也是有效的,但是只能设置大于等于1的值。这种情况和只勾选control child size然后把所有子物体的flexible设置为1的效果是一样的。因为child Force Expand分区的时候已经把剩余区域根据比例分给子物体了,所以这里认为子物体是侵占了分区的空间和按比例侵占了剩余的空间是等价的。
关于横向布局中的childForceExpand中的Height和Control childSize中的height。把childForceExpand理解成把剩余高度都分到一个区域内就行了,此时如果再勾选Control child Size的height,那就是填满整个区域。就算不勾选childForceExpand,只勾选Control childSize也会把高度自动铺满整个空间。
1.1.4.UseScale
这个就很简单了,勾选后再布局的时候把缩放也考虑在内而已,比如绿色是200长度。勾选后缩放改为2,计算的时候就把绿色当作400长度计算布局。
1.2.标准的的自适应Ui设置方法
在学习了上面的知识后就可以知道标准的自适应内容方法了。
之前说过,LayoutGroup组件是基于子物体的PreferedHeight或者PreferredWidth来计算布局的,没有Sprite的Image的Preferred宽高为0,所以要用LayoutElement来提供。但其实Text组件,InputField组件都会实时提供这些属性,所以layoutGroup可以直接根据这些属性来控制他们的宽高以实现自适应宽高,带有Sprite的Image组件没有明说会提供,但是应该也是提供的。对了,前提是开启了ControleChildSize
所以,LayoutGroup本身就可以让子物体自适应宽高而无需让子物体添加ContentSizeFilter,图片等要控制宽高的话就添加LayoutElment就可以设置期望宽高。
如图,分别为自适应高度文字区域1,两个图像,和自适应高度文字区域2,他们都没有添加ContentSIzeFilter和LayoutElement,如果觉得图片小了,添加LayoutElement设置就可以了。

但是还有个问题就是,背景没有随着所有子物体所占区域进行自适应。之前也说了GroupLayout本身会提供所有子物体所占的PreferredSize,所以再给LayoutGroup组件添加一个ContentSizeFilter,并设置verticalFit为prefferedSize就行了。
1.2.1.更新不及时导致的bug
Unity 的 Layout Group
组件默认不会在每一帧都刷新布局,它通常会等到 End of Frame
或 LateUpdate
之后才会刷新。因此,你可以在文本变动后手动强制刷新 Layout。
解决方法: 在修改 Text
内容后,手动调用
LayoutRebuilder.ForceRebuildLayoutImmediate(targetPanel);
具体例子:
void Update(){if (Input.GetKeyDown(KeyCode.Space)) // 模拟文本变化{textComponent.text += " 新增文本"; ForceRefresh();}}void ForceRefresh(){//targetPanel 需要是 GridLayoutGroup 所在的 RectTransform(或者更高一级的 Layout Group)LayoutRebuilder.ForceRebuildLayoutImmediate(targetPanel);}
1.3.安全区
安全区是指现在手机有许多异性屏,某些地方不应该显示Ui,不然就被手机的刘海或者前置摄像头挡住了,因此要修改画布的锚点来避开显示。
Unity提供了Scrren.safeArea来获取当前设备的安全区域,用它来动态调整UI布局。
using UnityEngine;public class SafeAreaHandler : MonoBehaviour
{private RectTransform rectTransform;private Rect lastSafeArea = new Rect(0, 0, 0, 0);void Start(){rectTransform = GetComponent<RectTransform>();ApplySafeArea();}void ApplySafeArea(){Rect safeArea = Screen.safeArea;if (safeArea != lastSafeArea) // 只有在区域变更时更新{lastSafeArea = safeArea;// 转换 SafeArea 到 UI 坐标系Vector2 anchorMin = new Vector2(safeArea.x / Screen.width, safeArea.y / Screen.height);Vector2 anchorMax = new Vector2((safeArea.x + safeArea.width) / Screen.width, (safeArea.y + safeArea.height) / Screen.height);rectTransform.anchorMin = anchorMin;rectTransform.anchorMax = anchorMax;}}void Update(){// 处理屏幕旋转,避免适配失效if (Screen.safeArea != lastSafeArea){ApplySafeArea();}}
}
七、UI优化
待续,说实话个人感觉Ui没必要优化,能耗多少性能?
相关文章:
Unity UI个人总结
个人总结,太简单的直接跳过。 一、缩放模式 1.固定像素大小 就是设置一个100x100的方框,在1920x1080像素下在屏幕中长度占比1/19,在3840x2160,方框在屏幕中长度占比1/38。也就是像素长款不变,在屏幕中占比发生变化 2.…...
开发基础(8):鸿蒙图表开发
mpchart mpchart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI,mpchart主要包括线形图、柱状图、饼状图、蜡烛图、气泡图、雷达图、瀑布图等自定义图表库。 柱状图 导入import {BarChart, …...
Vue的简单入门 一
声明:本版块根据B站学习,创建的是vue3项目,用的是vue2语法风格,仅供初学者学习。 目录 一、Vue项目的创建 1.已安装15.0或更高版本的Node.js 2.创建项目 二、 简单认识目录结构 三、模块语法中的指令 1.v-html 1.文本插值…...
vs2022支持.netframework4.0
下载nuget包 .netframework4.0 解压nuget 复制到C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework 参考 https://www.cnblogs.com/bdqczhl/p/18670152 https://blog.csdn.net/xiaomeng1998_/article/details/135979884...
[前端] axios网络请求二次封装
一、场景描述 为什么要对axios网络请求进行二次封装? 解决代码的复用,提高可维护性。 —这个有两个方案:一个是二次封装一个是实例化。(设置一些公共的参数,然后进行请求) 为什么可以解决代码的复用: 这是…...
前端包管理器的发展以及Npm、Yarn和Pnpm对比
在现代前端开发中,包管理器是不可或缺的核心工具。随着 JavaScript 生态的快速发展,开发者经历了从 npm 一统天下到 Yarn 挑战格局,再到 pnpm 创新突破的技术演进。这里将对三种主流包管理器(npm/Yarn/pnpm)进行全方位…...
城电科技| 光伏太阳花:让绿色能源随处绽放
在追求绿色可持续发展的今天,清洁能源设备不断涌现,城电科技的光伏太阳花便是其中的佼佼者。它不仅造型独特美观,更凭借出色的性能,在多个场景中都能发挥重要作用。那么,这款神奇的光伏太阳花究竟适合安装在哪里呢&…...
LVS集群(DR/NAT)
特性NAT 模式DR 模式工作原理Director 修改请求/响应的 IP 地址和端口,流量双向经过 DirectorDirector 仅修改请求的 MAC 地址,响应由 Real Server 直接返回客户端性能较低(需处理双向流量,易成瓶颈)高(仅处…...
保姆级GitHub大文件(100mb-2gb)上传教程
GLF(Git Large File Storage)安装使用 使用GitHub desktop上传大于100mb的文件时报错 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…...
【Jenkins流水线搭建】
Jenkins流水线搭建 01、SpringBoot项目 - Jenkins基于Jar持续集成搭建文档基于手动方式发布项目基于dockerfile基于jenkins + dockerfile + jenkinsfile +pieline基于jenkins + jar方式的发布01、环境说明01、准备项目02、准备服务器03、安装git04、安装jdk1.805、安装maven依赖…...
linux 安装ftp
1、安装vsftpd sudo yum install -y vsftpd 2、运行以下命令,启动FTP服务,并设置开机自启动。 sudo systemctl start vsftpdsudo systemctl enable vsftpd 3、运行以下命令,查看FTP服务监听的端口。 sudo netstat -antup | grep ftp 出现…...
DDoS技术解析
这里是Themberfue 今天我们不聊别的,我们聊聊著名的网络攻击手段之一的 DDoS,看看其背后的技术细节。 DoS 了解 DDoS 前,先来讲讲 DoS 是什么,此 DoS 而不是 DOS 操作系统啊。1996年9月6日,世界第三古老的网络服务提供…...
移远通信边缘计算模组成功运行DeepSeek模型,以领先的工程能力加速端侧AI落地
近日,国产大模型DeepSeek凭借其“开源开放、高效推理、端侧友好”的核心优势,迅速风靡全球。移远通信基于边缘计算模组SG885G,已成功实现DeepSeek模型的稳定运行,并完成了针对性微调。 目前,该模型正在多款智能终端上进…...
Linux | 进程相关概念(进程、进程状态、进程优先级、环境变量、进程地址空间)
文章目录 进程概念1、冯诺依曼体系结构2、进程2.1基本概念2.2描述进程-PCB2.3组织进程2.4查看进程2.5通过系统调用获取进程标识符2.6通过系统调用创建进程-fork初识fork の 头文件与返回值fork函数的调用逻辑和底层逻辑 3、进程状态3.1状态3.2进程状态查看命令3.2.1 ps命令3.2.…...
站群服务器和普通服务器有哪些不同之处?
站群服务器是一个集中管理工具,可以允许网站管理员同时管理多个网站,但是不要管理员登录每一个网站的后台,在站群模式下,网站管理员通过一个或者多个服务器来托管大量的子站点,可以支持大规模网站的集中管理和优化。 普…...
百度千帆平台对接DeepSeek官方文档
目录 第一步:注册账号,开通千帆服务 第二步:创建应用,获取调用秘钥 第三步:调用模型,开启AI对话 方式一:通过API直接调用 方式二:使用SDK快速调用 方式三:在千帆大模…...
DeepSeek帮助解决Oracle死锁问题
最近在生产上遇到一个死锁问题,Oracle 抛出了 ORA-000060 异常。 业务场景:程序按行读取一个上游系统送的文件数据(大概有几万行),读取到数据后,每 500 行分配给一个线程去批量更新数据库(使用…...
MySQL无法连接到本地localhost的解决办法2024.11.8
问题描述:我的MySQL可以远程连接服务器,但无法连接自己的localhost。 错误提示: 2003 - Cant connet to MySQL server on localhost(10061 "Unknown error")查找问题原因: 1. 检查环境变量是否正确:发现没…...
Nginx之rewrite重写功能
目录 一、rewrite概述 1、rewrite功能 2、跳转场景 二、标准配置指令 1、rewrite日志记录指令 2、未初始化变量告警日志记录指令 3、rewrite 指令 3.1 正则表达式 三、rewrite模块使用实例 1.基于域名的跳转 2.基于客户端 IP 访问跳转 3.?基于旧域名跳转到新域名后…...
Selenium WebDriver自动化测试(扩展篇)--Jenkins持续集成
文章目录 一、引言二、Jenkins简介三、安装部署Jenkins安装部署四、集成Git与Maven安装必要的插件配置Git配置Maven五、创建Job创建自由风格的项目配置源码管理配置构建触发器配置构建环境配置构建步骤配置Post-build Actions六、触发构建示例:GitHub Webhook触发构建七、封装…...
MyBatis拦截器终极指南:从原理到企业级实战
在本篇文章中,我们将深入了解如何编写一个 MyBatis 拦截器,并通过一个示例来展示如何在执行数据库操作(如插入或更新)时,自动填充某些字段(例如 createdBy 和 updatedBy)信息。本文将详细讲解拦…...
DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏
DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器,可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API,开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…...
linux 板子的wifi模块连上路由器后,用udhcpc给板子wifi分配ip,udhcpc获取到ip,但没有写入wlan0网卡上
linux 板子的wifi模块连上路由器后,用udhcpc给板子wifi分配ip,udhcpc获取到ip,但没有写入wlan0网卡上 这里的问题是 /usr/share/udhcpc/default.script脚本有问题 用下面正确脚本,即可写进去 #!/bin/sh# udhcpc script for busybox # Copyr…...
【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞
文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1:代码分析 4.2:流量分析 5.poc代码: 1.漏洞描述 漏洞编号:CVE-2022-35555 漏洞名称:Tenda W6 命令注入 威胁等级:高危 漏洞详情࿱…...
twisted实现MMORPG 游戏数据库操作封装设计与实现
在设计 MMORPG(大规模多人在线角色扮演游戏)时,数据库系统是游戏架构中至关重要的一部分。数据库不仅承担了游戏中各种数据(如玩家数据、物品数据、游戏世界状态等)的存储和管理任务,还必须高效地支持并发访…...
【MySQL】基础篇
1. MySQL中的NULL值是怎么存放的? MySQL的compact行格式中会用【NULL值列表】来标记值为NULL的列,NULL值不会存储在行格式中的真实数据部分。 NULL值列表会占用1字节空间,当表中所有字段都被定义成NOT NULL,行格式中就不会有NULL值…...
【自学笔记】机器学习基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 机器学习重点知识点总览一、机器学习基础概念二、机器学习理论基础三、机器学习算法1. 监督学习2. 无监督学习3. 强化学习 四、机器学习处理流程五、机器学习常见问…...
记录阿里云CDN配置
网站接入CDN全流程,共4步!-阿里云开发者社区 1、开通阿里云CDN服务 2、添加加速域名 3、验证域名归属权 4、域名添加CDN生成的CNAME解析 按照官网描述增加。细节点: 1. 域名和泛域名区别 2.开启https,要用nginx的证书,和项…...
同为科技智能PDU助力Deepseek人工智能和数据交互的快速发展
1 2025开年,人工智能领域迎来了一场前所未有的变革。Deepseek成为代表“东方力量”的开年王炸,不仅在国内掀起了技术热潮,并且在全球范围内引起了高度关注。Deepseek以颠覆性技术突破和现象级应用场景席卷全球,这不仅重塑了产业格…...
聚铭网络入围2025年度江苏省政府采购信息安全设备协议供货名单
近日,2025年度江苏省党政机关、事业单位及团体组织信息安全设备框架协议采购项目入围结果公布。聚铭网络凭借自身专业实力和技术优势脱颖而出,成功入围22个分包。 此次采购项目是江苏省政府采购领域级别最高、覆盖面最广的项目之一。从资格评选到后期材料…...
【Linux】--- 基础开发工具之yum/apt、vim、gcc/g++的使用
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Linux网络编程 本篇博客我们来认识一下Linux中的一些基础开发工具 --- yum,vim,gcc/g。 🏠 yum 🎸 什么是yum 当用户想下载软…...
leetcode 297. 二叉树的序列化与反序列化
题目如下 我们常常说单独先序遍历不能完整的表示一棵树是有前提条件的。 为什么?先序遍历是按 根节点 左子树 右子树的方向遍历树且遇到空子树直接返回,这样会造成我们并不知道某个节点的左右子树存在与否,故我们无法确定树的形状。但是如果…...
OpenAI 放王炸,将发布整合多项技术的 GPT-5,并免费无限使用,该模型有哪些技术亮点
对于 ChatGPT 的免费用户,将可以无限制地访问 GPT-5,但仅限于标准的智能级别。该级别会设定滥用限制,以防止不当使用(意思就是你得付费嘛)。 OpenAI CEO Sam Altman 今天在 X 上透露了 GPT-4.5 和 GPT-5 的最新发展计划。 OpenAI 将发布代…...
Ubuntu22.04 使用useradd 创建用户时,没有创建家目录时,如何手动创建家目录
测试案例: 使用useradd不加参数创建test目录 如下可以看出使用 useradd 创建用户的时候默认不会创建家目录 rootlocal:~# useradd test rootlocal:~# id test uid1001(test) gid1001(test) groups1001(test) rootlocal:~# cat /etc/passwd | grep test test:x:1001:…...
浅聊Docker使用、部署
在Java面试中,当被问到关于Docker中间件的使用、部署及在实际项目中的考虑时,可以按照以下结构和内容来详细回答: 一、Docker中间件的使用 1. Docker是什么? Docker是一个开源平台,允许开发者将应用程序及其依赖项打…...
Java面试第一山!《集合》!
一、引言 在 Java 编程的世界里,数据的存储和处理是非常重要的环节。Java 集合框架就像是一个功能强大的工具箱,为我们提供了各种各样的数据结构来高效地存储和操作数据。今天,跟随小编一起来深入了解 Java 集合框架,这不仅有助于…...
力扣-二叉树-257 二叉树的所有路径
思路 除去根节点,每一层添加->val,然后使用前序遍历的顺序 代码 class Solution { public:vector<string> res;void getTreePaths(string s, TreeNode* root){s "->";s to_string(root->val);if(root->left nullptr &…...
异构计算架构助力智能座舱实现高效低耗体验
摘要: 随着智能汽车的飞速发展,智能座舱作为人车交互的核心区域,对算力、功耗及延迟等性能指标提出了严苛要求。异构计算架构凭借在硬件、软件与系统层面的深度优化,能显著提升智能座舱的算力利用率,降低功耗与延迟,为用户打造高效、低能耗的智能座舱体验。本文深入剖析…...
【vscode】VScode Remote SSH配置
VScode使用remote ssh 到服务器上的Docker容器中 1. 配置远程服务器docker容器的端口映射,例如将服务器的2222端口映射到container的22端口(默认) 1.1 在容器系统的sshd_config文件中配置参数 #配置文件 vim /etc/ssh/sshd_config #打开端口号 Port 221.2 建立容…...
急停信号的含义
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#的运动控制程序的时候,一个必要的步骤就是确认设备按钮的急停…...
【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (10) – UC 使用 前言 由于ADB 的更新速度很快,在几个月之后重新搭建ADB 时发现UC 已经更新了很多,为了后续做ADB 的功…...
MYSQL批量UPDATE的两种方式
工作中遇到批量更新的场景其实是比较常见的。 但是该如何正确的进行批量UPDATE,很多时候往往有点头大。 这里列2种可用的方式,供选择(请选择方式一,手动狗头。)。 如果使用了MyBatis增强组件MyBatisPlus 如果使用了MyBatisPlus,…...
百度宣布:免费!
2月13日,百度大模型文心一言在官网宣布,随着文心大模型的迭代升级和成本不断下降,文心一言将于4月1日起全面免费,所有PC端和APP端用户均可体验文心系列最新模型。 同时,文心一言将上线深度搜索功能,具备更…...
计算机毕业设计SpringBoot+Vue.js医院住院管理系统(源码+lw文档+PPT+讲解视频)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Anaconda +Jupyter Notebook安装(2025最新版)
Anaconda安装(2025最新版) Anaconda简介安装1:下载anaconda安装包2: 安装anaconda3:配置环境变量4:检查是否安装成功5:更改镜像源6:更新包7:检查 Jupyter Notebook一.Jup…...
人工智能任务21-飞蛾火焰优化算法(MFO)在深度学习中的应用
大家好,我是微学AI,今天给大家介绍一下人工智能任务21-飞蛾火焰优化算法(MFO)在深度学习中的应用。飞蛾火焰优化算法(Moth-Flame Optimization, MFO)是一种受自然界中飞蛾向光源趋近行为启发的新型群体智能优化算法。在自然界中&a…...
渗透测试工具:SQLmap安装教程及使用
在渗透测试的世界里,SQL注入攻击无疑是最常见且最具威胁的安全漏洞之一。幸运的是,SQLmap 这个强大的自动化工具,能够帮助我们快速识别和利用这些漏洞。如果你也想了解如何用 SQLmap 进行渗透测试,那么这篇文章就是为你准备的&…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十四节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(CommunicationControl_0x28服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x28服务、通信控制、ISO 14229-1:2023、ECU测试 一、服务功能概述…...
WEB安全--SQL注入--INTO OUTFILE
一、INTO OUTFILE 函数语法: SELECT column1, column2, INTO OUTFILE file_path FROM your_table WHERE your_conditions; 使用此方式在SQL注入的过程中可以: 1、上传shell得到数据库的后端的操作权限 2、爆出数据库的信息 二、使用该函数的条件&#…...
【C语言 】C语言 桌游开发数字竞拍(源码)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【C语言 】C语言 桌游开发数字竞拍(源码…...