当前位置: 首页 > news >正文

【Unity】RenderFeature笔记

【Unity】RenderFeature笔记

RenderFeature是在urp中添加的额外渲染pass,并可以将这个pass插入到渲染列队中的任意位置。内置渲染管线中Graphics 的功能需要在RenderFeature里实现,常见的如DrawMesh和Blit

​ 可以实现的效果包括但不限于

  1. 后处理,可以编写shader对整个渲染画面进行修改。比如一些全局特效包括:场景描边,地形扫描;

  2. 创建网格,通过DrawMesh绘制定义的网格;

  3. 渲染画面,将场景渲染到纹理;

一、RanderFeature简介

1. 创建RanderFeature

在project中Create→Rendering→URPRenderFeature

2.RanderFeature结构
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{class CustomRenderPass : ScriptableRenderPass{// 在执行渲染通道之前调用// 创建临时渲染目标纹理。//为Execute提前准备需要的RenderTexture或者其它变量public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData){}//核心方法,实现这个renderPass的逻辑public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){}//释放在OnCameraSetup里,声明的变量如TemporaryRenderTexturepublic override void OnCameraCleanup(CommandBuffer cmd) {}}CustomRenderPass m_ScriptablePass;/// <inheritdoc/>public override void Create(){m_ScriptablePass = new CustomRenderPass();//定义渲染的位置m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;}// 这里你可以在渲染器中注入一个或多个渲染通道。//每一帧都执行public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){//把实例化的CustomRenderPass插入渲染管线renderer.EnqueuePass(m_ScriptablePass);}
}
3.RenderFeatrue使用

在Universal Render Pipeline Asset_Renderer直接Add RenderFeatrue

二、后处理效果

关键词
1、CommandBuffer.Blit

Blit是很常用的后期效果方法,在Build_in中常常是在OnRenderImage里被调用,与urp不同的是,在build_in里是通过Graphics.Blit调用。

Graphics.Blit

常用的接口: Blit(RenderTexturesource, RenderTexture dest, Material mat);

即使用着色器将源纹理复制到目标渲染纹理。

CommandBuffer.Blit

常用的接口:public void Blit (Rendering.RenderTargetIdentifier source, Rendering.RenderTargetIdentifier dest, Material mat);

这与 Graphics.Blit相似 - 主要用于从一个(渲染)纹理复制到其他纹理,可能使用自定义着色器;

源纹理或渲染目标将作为“_MainTex”属性传递给材质。

在shader中,_MainTex对应的是source,最后retrun对应的是dest

2、RenderTargetIdentifier

渲染目标标识符,标识 CommandBuffer的 RenderTexture;

使用 CommandBuffer.GetTemporaryRT 创建的具有名称的临时渲染纹理;

ScriptableRenderPass中有colorAttachment和depthAttachment是可以直接使用;

RenderTargetHandle.CameraTarget.Identifier()可以得到当前的渲染标识符

renderingData.cameraData.renderer.cameraColorTarget 也可以得到当前的渲染标识符

简单实现

实现脚本

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{//结构说明class CustomRenderPass : ScriptableRenderPass{// 在执行渲染通道之前调用// 创建临时渲染目标纹理。//为Execute提前准备需要的RenderTexture或者其它变量public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) {}//核心方法,实现这个renderPass的逻辑public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){}//释放在OnCameraSetup里,声明的变量如TemporaryRenderTexturepublic override void OnCameraCleanup(CommandBuffer cmd){}}//后处理效果class CustomRenderShaderPostPass : ScriptableRenderPass{  //定义渲染材质,通过Create方法赋值public Material _Material;public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){//创建一个CommandBufferCommandBuffer cmd = CommandBufferPool.Get("ShowShader");//这里有一个疑问,渲染标识符不管怎么传都不影响结果cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);//执行CommandBuffercontext.ExecuteCommandBuffer(cmd);//回收CommandBufferCommandBufferPool.Release(cmd);}}CustomRenderShaderPostPass m_ScriptablePassPost;public Shader shader;/// <inheritdoc/>public override void Create(){m_ScriptablePassPost = new CustomRenderShaderPostPass();//通过创建一个渲染材质m_ScriptablePassPost._Material = new Material(shader);//定义渲染的位置m_ScriptablePassPost.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;}// 这里你可以在渲染器中注入一个或多个渲染通道。//每一帧都执行public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){//把实例化的CustomRenderPass插入渲染管线renderer.EnqueuePass(m_ScriptablePassPost);}
}
1.实现饱和度和对比度调整

用shaderGraph实现

用shader实现

Shader "Unlit/SaturationContrastShader"
{SubShader{Pass{ZTest Always ZWrite OffCGPROGRAM#pragma vertex vert_img  // 使用内置的vert_img顶点着色器#pragma fragment frag#include "UnityCG.cginc"sampler2D _CameraColorTexture; //饱和度fixed3   Saturation_float(float3 In, float Saturation){float luma = dot(In, float3(0.2126729, 0.7151522, 0.0721750));return luma.xxx + Saturation.xxx * (In - luma.xxx);}//对比度fixed3  Contrast_float(float3 In, float Contrast){float midpoint = pow(0.5, 2.2);return (In - midpoint) * Contrast + midpoint;}fixed4 frag (v2f_img i) : SV_Target{fixed4 col = tex2D(_CameraColorTexture, i.uv);fixed3  Saturation =  Saturation_float(col, 5);fixed3  Contrast = Saturation_float(Saturation, 5);return fixed4(Contrast.x, Contrast.y, Contrast.z,0.1);}ENDCG}}FallBack Off
}

使用前

使用后

三、创建网格

关键词
1、CommandBuffer.DrawMesh

常用的接口:DrawMesh(Mesh mesh, Matrix4x4 matrix, Material material);

这个接口相对简单,传入mesh,变换矩阵,和材质

简单实现

这里接着上一个CustomRenderPassFeatureTest写,同时实现后处理和网格创建


using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{//结构说明class CustomRenderPass : ScriptableRenderPass{// 在执行渲染通道之前调用// 创建临时渲染目标纹理。//为Execute提前准备需要的RenderTexture或者其它变量public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) {}//核心方法,实现这个renderPass的逻辑public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){}//释放在OnCameraSetup里,声明的变量如TemporaryRenderTexturepublic override void OnCameraCleanup(CommandBuffer cmd){}}//后处理效果class CustomRenderShaderPostPass : ScriptableRenderPass{  //定义渲染材质,通过Create方法赋值public Material _Material;public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){//创建一个CommandBufferCommandBuffer cmd = CommandBufferPool.Get("ShowShader");//这里有一个疑问,渲染标识符不管怎么传都不影响结果cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);//执行CommandBuffercontext.ExecuteCommandBuffer(cmd);//回收CommandBufferCommandBufferPool.Release(cmd);}}//绘制网格class CustomRenderPassCreateMesh : ScriptableRenderPass{public Material _Material;public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){CommandBuffer cmd = CommandBufferPool.Get("CreateMesh");cmd.DrawMesh(CreateMesh(), Matrix4x4.identity, _Material);//这里和后处理一样的操作context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}//创建网格Mesh CreateMesh(){Mesh mesh = new Mesh();mesh.vertices = new Vector3[4] { new Vector3(1, 1, 1), new Vector3(-1, 1, 1), new Vector3(-1, 1, -1), new Vector3(1, 1, -1) };int[] indices = new int[8] { 0, 1, 1, 2, 2, 3, 3, 0 };//创建简单的线网格mesh.SetIndices(indices, MeshTopology.Lines, 0);return mesh;}}CustomRenderShaderPostPass m_ScriptablePassPost;CustomRenderPassCreateMesh m_ScriptablePassCreateMesh;public Shader shaderPost;public Shader shaderMesh;/// <inheritdoc/>public override void Create(){m_ScriptablePassPost = new CustomRenderShaderPostPass();//通过创建一个渲染材质m_ScriptablePassPost._Material = new Material(shaderPost);//定义渲染的位置m_ScriptablePassPost.renderPassEvent = RenderPassEvent.AfterRendering;m_ScriptablePassCreateMesh = new CustomRenderPassCreateMesh();m_ScriptablePassCreateMesh._Material = new Material(shaderMesh);m_ScriptablePassCreateMesh.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;}// 这里你可以在渲染器中注入一个或多个渲染通道。//每一帧都执行public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){//把实例化的CustomRenderPass插入渲染管线renderer.EnqueuePass(m_ScriptablePassPost);renderer.EnqueuePass(m_ScriptablePassCreateMesh);}
}

实现效果

知识点:RenderPassEvent控制渲染的顺序,上图我们可以看到,创建的线是可以被模型遮挡和遮挡模型的。但是如果把m_ScriptablePassCreateMesh.renderPassEvent=RenderPassEvent.AfterRendering 就会发现线完全遮挡模型,即线最后渲染

四、渲染画面到图片

关键词
1、GetTemporaryRT

获取临时渲染纹理

可使用给定参数创建临时渲染纹理,并使用 nameID 将其设置为全局着色器属性。使用 Shader.PropertyToID创建整数名称。

2、Shader.PropertyToID

获取着色器属性名称的唯一标识符。

static string RtName = "_TestRT";
static int RT_ID = Shader.PropertyToID(RtName);

简单实现

同样接着上一个CustomRenderPassFeatureTest写,同时实现后处理和网格创建


using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{//结构说明class CustomRenderPass : ScriptableRenderPass{// 在执行渲染通道之前调用// 创建临时渲染目标纹理。//为Execute提前准备需要的RenderTexture或者其它变量public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) {}//核心方法,实现这个renderPass的逻辑public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){}//释放在OnCameraSetup里,声明的变量如TemporaryRenderTexturepublic override void OnCameraCleanup(CommandBuffer cmd){}}//后处理效果class CustomRenderShaderPostPass : ScriptableRenderPass{  //定义渲染材质,通过Create方法赋值public Material _Material;public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){//创建一个CommandBufferCommandBuffer cmd = CommandBufferPool.Get("ShowShader");//这里有一个疑问,渲染标识符不管怎么传都不影响结果cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);//执行CommandBuffercontext.ExecuteCommandBuffer(cmd);//回收CommandBufferCommandBufferPool.Release(cmd);}}//创建网格class CustomRenderPassCreateMesh : ScriptableRenderPass{public Material _Material;public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){CommandBuffer cmd = CommandBufferPool.Get("CreateMesh");cmd.DrawMesh(CreateMesh(), Matrix4x4.identity, _Material);context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}//创建网格Mesh CreateMesh(){Mesh mesh = new Mesh();mesh.vertices = new Vector3[4] { new Vector3(1, 1, 1), new Vector3(-1, 1, 1), new Vector3(-1, 1, -1), new Vector3(1, 1, -1) };int[] indices = new int[8] { 0, 1, 1, 2, 2, 3, 3, 0 };mesh.SetIndices(indices, MeshTopology.Lines, 0);return mesh;}}//渲染画面class CustomRenderPassRT : ScriptableRenderPass{static string RtName = "_TestRT";//获取着色器属性名称的唯一标识符。static int RT_ID = Shader.PropertyToID(RtName);public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData){//新建一个RenderTextureDescriptorRenderTextureDescriptor textureDescriptor = new RenderTextureDescriptor(1920, 1080, RenderTextureFormat.Default, 0);//获取临时渲染纹理cmd.GetTemporaryRT(RT_ID, textureDescriptor);}public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){CommandBuffer cmd = CommandBufferPool.Get("ShowRT");//下面三段实现效果一样cmd.Blit(renderingData.cameraData.renderer.cameraColorTarget, RT_ID);// cmd.Blit(RenderTargetHandle.CameraTarget.Identifier(), RT_ID);// cmd.Blit(colorAttachment, RT_ID);context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}public override void OnCameraCleanup(CommandBuffer cmd){cmd.ReleaseTemporaryRT(RT_ID);}}CustomRenderShaderPostPass m_ScriptablePassPost;CustomRenderPassCreateMesh m_ScriptablePassCreateMesh;CustomRenderPassRT m_ScriptablePassRenderTextrue;public Shader shaderPost;public Shader shaderMesh;/// <inheritdoc/>public override void Create(){#region 后处理效果m_ScriptablePassPost = new CustomRenderShaderPostPass();//通过创建一个渲染材质m_ScriptablePassPost._Material = new Material(shaderPost);//定义渲染的位置m_ScriptablePassPost.renderPassEvent = RenderPassEvent.AfterRendering;#endregion#region 创建网格m_ScriptablePassCreateMesh = new CustomRenderPassCreateMesh();m_ScriptablePassCreateMesh._Material = new Material(shaderMesh);m_ScriptablePassCreateMesh.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;#endregion#region 渲染画面m_ScriptablePassRenderTextrue = new CustomRenderPassRT();m_ScriptablePassRenderTextrue.renderPassEvent = RenderPassEvent.AfterRendering;#endregion}// 这里你可以在渲染器中注入一个或多个渲染通道。//每一帧都执行public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){//把实例化的CustomRenderPass插入渲染管线renderer.EnqueuePass(m_ScriptablePassRenderTextrue);renderer.EnqueuePass(m_ScriptablePassPost);renderer.EnqueuePass(m_ScriptablePassCreateMesh);}
}

五、RenderFeatrue参数赋值

1、VolumeComponent

在Volume中提供Render Feature读取参数数据,通过VolumeManager单列,拿到stack,可以直接取得Volume中的数据。

以修改上文后处理的饱和度和对比度为例

1)创建一个全局的Global Volume

右击Hierarchy面板空白处选择Volume→Global Volume

2)自定义一个VolumeComponent
using UnityEngine.Rendering;public class VolumeComponentTest : VolumeComponent
{public ClampedFloatParameter Saturation = new ClampedFloatParameter(1f, 0, 3);public ClampedFloatParameter Contrast = new ClampedFloatParameter(1f, 0, 3);
}

可以在Volume中添加VolumeComponentTest组件

3)在shader中添加控制的参数

这添加了Saturation和Contrast两个控制参数

Shader "Unlit/SaturationContrastShader"
{Properties{_Saturation("Saturation", Range(0, 3)) = 1.0_Contrast("Contrast", Range(0, 3)) = 1.0}SubShader{Pass{ZTest Always ZWrite OffCGPROGRAM#pragma vertex vert_img  // 使用内置的vert_img顶点着色器#pragma fragment frag#include "UnityCG.cginc"float _Saturation;float _Contrast;sampler2D _CameraColorTexture; //饱和度fixed3   Saturation_float(float3 In, float Saturation){float luma = dot(In, float3(0.2126729, 0.7151522, 0.0721750));return luma.xxx + Saturation.xxx * (In - luma.xxx);}//对比度fixed3  Contrast_float(float3 In, float Contrast){float midpoint = pow(0.5, 2.2);return (In - midpoint) * Contrast + midpoint;}fixed4 frag (v2f_img i) : SV_Target{fixed4 col = tex2D(_CameraColorTexture, i.uv);fixed3  Saturation =  Saturation_float(col, _Saturation);fixed3  Contrast = Saturation_float(Saturation, _Contrast);return fixed4(Contrast.x, Contrast.y, Contrast.z,0.1);}ENDCG}}FallBack Off
}

用shaderGraph实现的也是一样的添加两个参数

4)在RenderFeatrue中读取参数

对CustomRenderShaderPostPass修过如下

  class CustomRenderShaderPostPass : ScriptableRenderPass{  //定义渲染材质,通过Create方法赋值public Material _Material;//定义一个VolumeComponentTestVolumeComponentTest volumeComponentTest;public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){//读取VolumeManager的单列取得stackvar stack = VolumeManager.instance.stack;//为volumeComponentTest赋值volumeComponentTest = stack.GetComponent<VolumeComponentTest>();if (!volumeComponentTest) return;//直接从volumeComponentTest中读取数据_Material.SetFloat("_Saturation", volumeComponentTest.Saturation.value);_Material.SetFloat("_Contrast", volumeComponentTest.Contrast.value);//创建一个CommandBufferCommandBuffer cmd = CommandBufferPool.Get("ShowShader");//这里有一个疑问,渲染标识符不管怎么传都不影响结果cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);//执行CommandBuffercontext.ExecuteCommandBuffer(cmd);//回收CommandBufferCommandBufferPool.Release(cmd);}}

实现效果

2、代码直接赋值

在RenderFeatrue中开放参数,用代码直接赋值

以后处理的饱和度和对比度为例

1)开放参数

在CustomRenderPassFeatureTest和CustomRenderShaderPostPass下分别定义饱和度和对比度,并赋值

public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{//后处理效果class CustomRenderShaderPostPass : ScriptableRenderPass{  //定义渲染材质,通过Create方法赋值public Material _Material;public float _Contrast;public float _Saturation;public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){_Material.SetFloat("_Saturation", _Saturation);_Material.SetFloat("_Contrast", _Contrast);//创建一个CommandBufferCommandBuffer cmd = CommandBufferPool.Get("ShowShader");//这里有一个疑问,渲染标识符不管怎么传都不影响结果cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);//执行CommandBuffercontext.ExecuteCommandBuffer(cmd);//回收CommandBufferCommandBufferPool.Release(cmd);}}CustomRenderShaderPostPass m_ScriptablePassPost;public Shader shaderPost;public float Saturation;public float Contrast;/// <inheritdoc/>public override void Create(){#region 后处理效果m_ScriptablePassPost = new CustomRenderShaderPostPass();//通过创建一个渲染材质m_ScriptablePassPost._Material = new Material(shaderPost);//将饱和度和对比度赋值给CustomRenderShaderPostPassm_ScriptablePassPost._Contrast = Contrast;m_ScriptablePassPost._Saturation = Saturation;//定义渲染的位置m_ScriptablePassPost.renderPassEvent = RenderPassEvent.AfterRendering;#endregion}// 这里你可以在渲染器中注入一个或多个渲染通道。//每一帧都执行public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){//把实例化的CustomRenderPass插入渲染管线renderer.EnqueuePass(m_ScriptablePassPost);}
}

2)对参数进行修改

//得到RenderFeatrue    
CustomRenderPassFeatureTest custom=renderData.rendererFeatures.OfType<CustomRenderPassFeatureTest>().FirstOrDefault();
//对值进行修改
custom.Saturation =0;
custom.Contrast =0;
//设置数据
custom.SetParam();

相关文章:

【Unity】RenderFeature笔记

【Unity】RenderFeature笔记 RenderFeature是在urp中添加的额外渲染pass&#xff0c;并可以将这个pass插入到渲染列队中的任意位置。内置渲染管线中Graphics 的功能需要在RenderFeature里实现,常见的如DrawMesh和Blit ​ 可以实现的效果包括但不限于 后处理&#xff0c;可以编写…...

golang gin——controller 模型绑定与参数校验

controller 模型绑定与参数校验 gin框架提供了多种方法可以将请求体的内容绑定到对应struct上&#xff0c;并且提供了一些预置的参数校验 绑定方法 根据数据源和类型的不同&#xff0c;gin提供了不同的绑定方法 Bind, shouldBind: 从form表单中去绑定对象BindJSON, shouldB…...

办公技巧:Excel日常高频使用技巧

目录 1. 快速求和&#xff1f;用 “Alt ” 2. 快速选定不连续的单元格 3. 改变数字格式 4. 一键展现所有公式 “CTRL ” 5. 双击实现快速应用函数 6. 快速增加或删除一列 7. 快速调整列宽 8. 双击格式刷 9. 在不同的工作表之间快速切换 10. 用F4锁定单元格 1. 快速求…...

【jvm--方法区】

文章目录 1. 栈、堆、方法区的交互关系2. 方法区的内部结构3. 运行时常量池4. 方法区的演进细节5. 方法区的垃圾回收 1. 栈、堆、方法区的交互关系 方法区的基本理解&#xff1a; 方法区&#xff08;Method Area&#xff09;与 Java 堆一样&#xff0c;是各个线程共享的内存区…...

智慧楼宇3D数据可视化大屏交互展示实现了楼宇能源的高效、智能、精细化管控

智慧园区是指将物联网、大数据、人工智能等技术应用于传统建筑和基础设施&#xff0c;以实现对园区的全面监控、管理和服务的一种建筑形态。通过将园区内设备、设施和系统联网&#xff0c;实现数据的传输、共享和响应&#xff0c;提高园区的管理效率和运营效益&#xff0c;为居…...

算法题:摆动序列(贪心算法解决序列问题)

这道题是一道贪心算法题&#xff0c;如果前两个数是递增&#xff0c;则后面要递减&#xff0c;如果不符合则往后遍历&#xff0c;直到找到符合的。&#xff08;完整题目附在了最后&#xff09; 代码如下&#xff1a; class Solution(object):def wiggleMaxLength(self, nums):…...

接口自动化测试yaml+requests+allure技术,你学会了吗?

前言 接口自动化测试是在软件开发过程中常用的一种测试方式&#xff0c;通过对接口进行自动化测试&#xff0c;可以提高测试效率、降低测试成本。在接口自动化测试中&#xff0c;yaml、requests和allure三种技术经常被使用。 一、什么是接口自动化测试 接口自动化测试是指通…...

android 获取局域网其他设备ip

Android 通过读取本地Arp表获取当前局域网内其他设备信息_手机查看arp-CSDN博客...

angular中使用 ngModel 自定义组件

要创建一个自定义的 Angular 组件&#xff0c;并使用 ngModel 进行双向数据绑定&#xff0c;您可以按照以下步骤操作&#xff1a; 创建自定义组件&#xff1a;首先&#xff0c;使用 Angular CLI 或手动创建一个新的组件。在组件的模板中&#xff0c;添加一个输入元素或其他适合…...

kubernetes pod日志查看用户创建

目录 1.创建用户 1.1证书创建 1.2创建用户 1.3允许用户登陆 1.4切换用户 1.5删除用户 2.RBAC 1.创建用户 1.1证书创建 进入证书目录 # cd /etc/kubernetes/pki创建key # openssl genrsa -out user1.key 2048 Generating RSA private key, 2048 bit long modulus .....…...

HTML5+CSSday4综合案例二——banner效果

bannerCSS展示图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wi…...

关于红包雨功能的探索

【高并发优化手段】基于Springboot项目 【红包雨功能的】环境部署&#xff08;弹性伸缩、负载均衡、Redis读写分离、云服务器部署&#xff09; jemeter压测【2万用户每秒5次请求在30秒内处理完请求】 【红包雨压测】提供2万用户30秒内5次请求的并发服务支持 使用工厂模式、策略…...

【已解决】Python打包文件执行报错:ModuleNotFoundError: No module named ‘pymssql‘

【已解决】Python打包文件执行报错&#xff1a;ModuleNotFoundError: No module named pymssql 1、问题2、原因3、解决 1、问题 今天打包一个 tkinter pymssql 的项目的时候&#xff0c;打包过程很顺利&#xff0c;但是打开软件的时候&#xff0c;报错 ModuleNotFoundError: …...

华为云云耀云服务器L实例评测|测试CentOS的网络配置和访问控制

目录 引言 1 理解几个基础概念 2 配置VPC、子网以及路由表 3 配置安全组策略和访问控制规则 3.1 安全组策略和访问控制简介 3.2 配置安全组策略 3.3 安全组的最佳实践 结论 引言 在云计算时代&#xff0c;网络配置和访问控制是确保您的CentOS虚拟机在云环境中安全运行的…...

CSP模拟51联测13 B.狗

CSP模拟51联测13 B.狗 文章目录 CSP模拟51联测13 B.狗题目大意题目描述输入格式输出格式样例样例 1inputoutput 思路 题目大意 题目描述 小G养了很多狗。 小G一共有 n n n\times n nn 条狗&#xff0c;在一个矩阵上。小G想让狗狗交朋友&#xff0c;一条狗狗最多只能交一个…...

GEO生信数据挖掘(七)差异基因分析

上节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。本节延续上个数据&#xff0c;进行了差异分析。 差异分析 计算差异指标step12 加载…...

JAVA-SpringBoot入门Demo用IDEA建立helloworld

使用编辑器IDEA做SpringBoot项目最近几年比较红红&#xff0c;作为JAVA语言翻身的技术&#xff0c;用户量激增。由于java平台原来的占有率&#xff0c;相比net core在某些方面更有优势。 我把本次我下载完成后Maven项目的过程记录下来了&#xff0c;仅供参考&#xff01; 安装J…...

Unity布料系统Cloth

Unity布料系统Cloth 介绍布料系统Cloth(Unity组件)组件上的一些属性布料系统的使用布料约束Select面板Paint面板Gradient Tool面板 布料碰撞布料碰撞碰撞适用 介绍 布料系统我第一次用是做人物的裙摆自然飘动&#xff0c;当时我用的是UnityChan这个unity官方自带的插件做的裙摆…...

漏电继电器 LLJ-630F φ100 导轨安装 分体式结构 LLJ-630H(S) AC

系列型号&#xff1a; LLJ-10F(S)漏电继电器LLJ-15F(S)漏电继电器LLJ-16F(S)漏电继电器 LLJ-25F(S)漏电继电器LLJ-30F(S)漏电继电器LLJ-32F(S)漏电继电器 LLJ-60F(S)漏电继电器LLJ-63F(S)漏电继电器LLJ-80F(S)漏电继电器 LLJ-100F(S)漏电继电器LLJ-120F(S)漏电继电器LLJ-125F(S…...

数据结构和算法(10):B-树

B-树&#xff1a;大数据 现代电子计算机发展速度空前&#xff0c;就存储能力而言&#xff0c;情况似乎也是如此&#xff1a;如今容量以TB计的硬盘也不过数百元&#xff0c;内存的常规容量也已达到GB量级。 然而从实际应用的需求来看&#xff0c;问题规模的膨胀却远远快于存储能…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...