GPU prompt

news2025/1/20 14:58:00

提问:

  1. GPU是如何与CPU协调工作的?

  2. GPU也有缓存机制吗?有几层?速度差异是多少?

  3. GPU渲染流程有哪些阶段?他们的功能分别是什么?

  4. Early-Z技术是什么?发生在哪个阶段?这个阶段还会发生什么?

  5. SIMD和SIMT是什么?他们的好处是什么?co-issue呢?

  6. GPU是并行处理的吗?硬件层是如何设计并实现的呢?

  7. GPC、TPC、SM是什么?Warp又是什么?它们和Core、Thread之间的关系如何?

  8. 顶点着色器和像素着色器可以是同一处理单元吗?为什么?

  9. 像素着色器最小处理单位是一像素吗?为什么?会带来什么影响?

  10. Shader中if、for会降低渲染效率吗?为什么?

  11. 渲染相同面积的图形,三角形的数量会影响效率吗?为什么?

  12. GPU Content是什么?有什么作用?

  13. 造成渲染瓶颈的问题可能有哪些?该如何避免或优化它们?

 

GPU是什么

GPU(Graphics Processing Unit)是图形处理单元,是专门用于绘制图像和处理单元数据的特定芯片。GPU不是显卡,是显卡上最核心的部件。

GPU物理架构

由于纳米工艺的引进,GPU可以将数以亿计的晶体管和电子器件集成于芯片内。当GPU与散热风扇、PCI插槽、HDMI等部件组成后,就成为了显卡。

显卡不能独立工作,需要装载在主板上,结合CPU、内存、显存、显示器等硬件设备,组合成完整的PC。

 

GPU微观物理结构

NVidiaTesia架构:

  • 拥有7组TPC(Texture/Processor Cluster,纹理处理簇)

  • 每个TPC有两SM(Streaming Multiprocessor,流多处理器)

  • 每个SM包含8个SP(StreamingProcessor,流处理器)

  • 2个SFU(Special Function Unit,特殊函数单元)

  • L1缓存、MT Issue(多线程指令获取)、C-Cache(常量缓存)、共享内存

  • 除了TPC核心单元,还有与显存、CPU、系统内存交互的各种部件。

8dc894c4dc6ad912807fa0b9ca261b0f9122a637.png@656w_518h_!web-article-pic.avif

 

NVidiaFermi架构:

  • 有16个SM(Streaming Multiprocessor,流多处理器)

  • 两个WarpScheduler(线程束)

  • 两组共32个Core

  • 16组加载存储单元(LD/ST)

  • 4个特殊函数单元(SFU)

  • 分发单元(Dispatch Unit)

  • 每个Core有一个FPC(浮点数单元)、一个ALU(逻辑运算单元)

 

NVidiaMaxwell架构

  • 采用了Maxwell的GM204,拥有4个GPC

  • 每个GPC有4个SM,对比Tesia架构来说在处理单元上有了很大提升

 

NVidiaTuring架构

  • 6个GPC(图形处理簇)

  • 36个TPC(纹理处理簇)

  • 72个SM(流多处理器)

  • 每个GPC上有6个TPC、每个TPC上有两个SM

  • 4608个CUDA核

  • 72个RT

  • 576个Tensor核

  • 288个纹理单元

  • 12x32位GDDR6内存控制器(共384位)

  • 每个SM包含64个CUDA核(CUDA是NVIDIA推出的统一计算架构)

  • 每个SM包含8个Tensor核(Tensor Core是专为执行张量或矩阵运算而设计的专用执行单元)

  • 每个SM包含256kb的寄存器文件

 

GPU架构的共性

纵观所有GPU架构,存在着很多相同概念的部件

  • GPC(图形处理簇)

  • TPC(纹理处理簇)

  • Thread(线程)

  • SM、SMX、SMM(StreamMultiprocesser,流多处理器)

  • Warp线程束、WarpScheduler(Warp编排器)

  • SP(StreamProcessor,流处理器)

  • Core(执行数学运算的核心)

  • ALU(逻辑运算符单元)

  • FPU(浮点数单元)

  • SFU(特殊处理单元)

  • ROP(RenderOutputUnit,渲染输入单元)

  • Load/StoreUnit(加载存储单元)

  • L1Cache(L1缓存)

  • L2Cache(L2缓存)

  • SharedMemory(共享内存)

  • RegisterFile(寄存器)

GPU是天然并行的,现代GPU的架构是以高度并行能力设计的

 

GPU微观物理结构

  • 包含关系:GPC==>TPC==>SM==>CORD

  • SM包含PolyMorphEngine(多边形引擎)、L1Cache(L1缓存)、SharedMemory(共享内存)、Core(执行数学运算的核心)等。

  • CORE又包含ALU、FPU、ExecutionContent(执行上下文)、Detch、解码(Decode)

 

GPU渲染总览

Fermi架构运行机制总览图:

从Fremi开始NVIDIA使用类似的原理架构,使用一个GigaThreadEngine来管理所有正在运行的工作,GPU被划分为多个GPCs(GraphicProcessingCluster),每个GPC拥有多个SM(SMX、SMM)和一个光栅化引擎(RasterEngine),它们其中有很多的连接,最显著的是Crossbar,他可以连接GPCs和其他功能性模块(例如ROP和其他子系统)

程序员编写的Shader是在SM上完成的,每个SM包含许多为线程执行数学运算的Core(核心)。例如:一个线程可以是顶点或像素着色器调用。这些Core和其他单元由WarpScheduler驱动,WarpScheduler管理一组32个线程作为Warp(线程束)并将要执行的指令移交给DispatchUnits

 

 

GPU逻辑管线

以Fermi家族的SM为例子,进行说明:

1-3

1、程序通过图形API(DirectX、Glsl、WebGL)发出drawcall指令,指令被推送到驱动程序,驱动程序检查指令合法性,然后将指令放到GPU可读的PushBuffer中。

2、经过一段时间或显示调用flush指令后,驱动程序把PushBuffer的内容发送给GPU,GPU通过主机接口(HostInterface)接受命令,并通过前端(FrontEnd)处理这些命令。

3、在图元分配器(PrimitiveDistributor)中开始工作分配,处理IndexBuffer中的顶点产生三角形分成批次(batches),然后发送给多个GPCs。这一步理解就是提交上来n个三角形,分配给这几个GPC同时处理。

4、在GPC中,每个SM中的PolyMorphEngine负责通过三角形索引(triangleIndices)取出三角形的数据(vertexData),即图中的VertexFetch模块。

5、取出数据后,在SM中以32个线程为1组的线程束(Warp)来调度,来开始处理顶点数据

6、SM的Warp调度器会按照顺序分发指令给整个Warp,单个Warp中的线程会锁步(lock-step)执行各自的指令,如果线程碰到不激活执行的情况也会被遮掩(be masked out)

7、Warp指令可一次完成,也可被多次调度,例如通常SM中的LD/ST(加载存取)单元数量明显少于基础数学操作单元

8、由于某些指令比其他指令需要更长时间来完成,特别是内存加载,warp调度器可能会简单的切换到另一个没有内存等待的Warp,这是GPU如何克服内存读取延迟的关键,只是简单的切换活动线程组。

9、一旦被Warp完成了Vertex-Shader的所有指令,运算结果会被ViewportTransform模块处理,三角形会被裁剪,然后准备栅格化,GPU会使用L1和L2缓存来进行Vertex-Shader和Pixel-Shader的数据通信。

10、接下来这些三角形将会被分割,再分配给多个GPC,三角形的范围决定了他将被分配到哪个光栅化引擎(rasterEngines),每个RasterEngines覆盖了多个屏幕上的Tile,这等于把三角形的渲染分配到了多个Tile上面。也就是像素阶段就把按三角形划分变成了按显示像素划分了。

11、SM上的AttributeSetup保证了从Vertex-Shader来的数据经过插值后是Pixel-Shader可读的。

12、GPC上的光栅引擎(RasterEngines)在他接收到的三角形上工作,来负责这些三角形的像素信息生成,同时会处理背面剔除和Early-Z剔除。

13、32个像素线程将被分为1组,或者说8个2x2的像素块,这是在像素着色器上面的最小工作单元,在这个像素线程内,如果没有被三角形覆盖就会被遮掩,SM的waro调度器会管理像素着色器的任务

14、接下来的阶段就和Vertex_Shader中的逻辑步骤完全一致,但是变成了在像素着色器线程中执行。由于不耗费任何性能就能获取一个像素内的值,导致锁步执行非常便利,所有的线程可以保证所有的指令可以在同一点。

15、像素着色器已经完成了颜色的计算和深度值的计算,在这个点上,我们必须考虑三角形的原始API顺序,然后才将数据移交给ROP(RenderOutputUnit,渲染输入单元)一个ROP内部有很多ROP单元,在ROP单元中处理深度测试,和FrameBuffer的混合,深度和颜色的设置必须是原子操作,否则两个不同的三角形在同一个像素点就会有冲突和错误

 

 

Early-Z

早期GPU的渲染管线的深度测试是在像素着色器之后才执行,这样会造成很多本不可见的像素执行了耗性能的计算。后来,为了减少像素着色器的额外消耗,将深度测试提前到像素着色器之前,这就是Early-Z技术的由来。Early-Z技术可以将很多无效的像素提前剔除,避免它们进入耗时严重的像素着色器。

Early-Z剔除的最小单位不是1像素,而是像素块(2x2)

但是,以下情况会导致Early-Z失效:

1、开启AlphaTest:由于AlphaTest需要在像素着色器后面的AlphaTest阶段作比较(DirectX的discard,OpenGL的clip),所以无法在像素着色器之前决定该像素是否被剔除。

2、开启AlphaBlend:启用了Alpha混合的像素很多需要与FrameBuffer做混合,无法执行深度测试,也就无法利用Early-Z技术。

3、关闭深度测试:Early-Z是建立在深度测试开启的条件下,关闭深度测试,也就无法使用Early-Z技术

4、开启Multi-Samping:多采样会影响周边像素,而Early-Z阶段无法得知周边像素是否被裁剪,故无法提前剔除

5、其他任何导致需要混合后面颜色的操作。

 

 

SIMD和SIMT

SIMD(Single Instruction Multiple Data)是单指令多数据,在GPU的ALU单元内一条指令可以处理多维向量(一般是4D)的数据。比如,有以下shader指令:

float4 c = a + b;//ab都是float4类型

对于没有SIMD的处理单元,需要4条指令将4个float类型相加。

但有了SIMD技术,只需要一条指令便可完成。

SIMT(Single Instruction Multiple Threads,单指令多线程)是SIMD的升级版,可对GPU中单个SM中的多个Core同时处理同一指令,并且每个Core存取的数据可以是不同的。

SIMT_ADD c,a,b

上述指令会被同时送入在单个SM中被编组的所有Core中,同时执行运算,但a,b,c的值可以不一样。

 

 

co-issue

co-issue是为了解决SIMD运算单元无法充分利用的问题,由于float数量的不同,ALU的利用率从100依次下降到75、50、25。

为了解决着色器在低维向量利用率低的问题,可以通过合并1D与3D或2D与2D的指令。

但是,对于向量运算单元(VectorALU)如果其中一个变量既是操作数又是存储数的情况,无法启用co-issue技术

 

 

CPU与GPU对比

CPU是一个具有多种功能的优秀领导者。他的优点在于调度、管理、协调能力强,但是计算能力一般

GPU相当于一个接受CPU调度“拥有大量计算能力”的员工。

 

 

CPU-GPU异构系统

根据CPU与GPU是否共享内存,可分为两种类型的CPU-GPU架构

分离式架构:CPU和GPU各有独立缓存和内存,它们通过PCI-e等总线通讯。这种结构的缺点在于PCI-e相对于两者具有低带宽和高延迟,数据的传输成为了其中的性能瓶颈。使用广泛,如PC等。

耦合式架构:CPU和GPU共享内存和缓存。AMD的APU采用的就是这种结构,主要应用于游戏主机中,如PS4,智能手机等。

在存储管理方面,分离式结构中CPU和GPU各自拥有独立的内存,二者共享一套虚拟地址空间,必要时会进行内存拷贝。耦合式结构中,GPU没有独立内存,与CPU共享系统内存,由MMU进行存储管理。

 

 

GPU资源机制

内存架构:

GPU与CPU类似,也有多级缓存结构:寄存器、L1缓存、L2缓存、GPU显存、系统显存

他们的存取速度从寄存器到系统内存依次变慢。

由此可见,shader直接访问寄存器,L1L2缓存还是比较快的,但访问纹理、常量缓存和全局内存非常慢,会造成很高的延迟。

 

 

GPU内存分布在Ram存储芯片或者GPU芯片上,它们物理上所在的位置,决定了他们的速度、大小以及访问规则。

全局内存(Global memory)位于片外存储体中,容量大、访问延迟高、传输速度较慢、使用二级缓存(L2 cache)做缓冲

本地内存(Local memory)一般位于片内存储体中,变量、数组、结构体等都存放在此处,但是有大数组、大结构体以至于寄存器区放不下它们,编译器在编译阶段就会将它们放到片外的DDR芯片中(最好的情况也是放于L2 cache),且将它们标记为Local。

共享内存(Shared memory)位于每个流处理器组中(SM)中,访问速度仅次于寄存器

寄存器内存(Register memory)位于每个流处理器组中(SM)中,访问速度最快的存储体,用于存放线程执行时所需要的变量。

常量内存(Constant memory)位于每个流处理器组中(SM)中和片外的RAM存储器中。

纹理内存(Constant memory)位于每个流处理器组中(SM)中和片外的RAM存储器中。

 

 

GPU资源管理模型

 

 

 

CPU-GPU数据流

  1. 将主存的处理数据复制到显存中

  2. CPU指令驱动GPU

  3. GPU中每个运算单元并行处理,此步会从显存存取数据

  4. GPU将显存结果传回主存

 

 

Shader运行机制

在执行阶段,CPU将Shader二进制指令经由PCI-e推送到GPU端。GPU在执行代码时,会用Content将指令分成若干Channel推送到各个Core的存储空间。

 

 

对于SIMT架构的GPU,汇编指令有所不同,变成了SIMT特定指令代码

并且Context以Core为单位组成共享的结构,同一个Core的多个ALU共享一组Context

如果有多个Core,就会有更多的ALU同时参与Shader计算, 每个Core执行的数据是不一样的,可能是顶点、图元、像素等任何数据。

 

 

 

GPU Content和延迟

由于SIMT技术的引入,导致很多同一个SM内的很多Core并不是独立的,当它们当中有部分Core需要访问到纹理、常量缓存和全局内存时,就会导致非常大的卡顿(Stall)

如图:有四种上下文(Content)它们共用一组运算单元ALU

假设第一组Context需要访问缓存或内存,会导致2-3周期的延迟,此时调度器会激活第二组Content以利用ALU

当第二组卡住又会依次激活3-4组Content了,直到第一组Content恢复运行或所有都被激活。

延迟的后果是每组Content总体执行时间被拉长了

越多Content可用就越可以提升运算单元吞吐量。

 

 

总结:

顶点着色器和像素着色器都是在同一单元中执行的(在原来的架构中vs和ps的确是分开的,后来nv把这个统一了)vs是按照三角形来处理的,ps是按照像素来并行处理的

vs和ps中数据是通过L1和L2缓存传递的

warp和thread都是逻辑上的概念,sm和sp都是物理上的概念,线程数 != 流处理器数

 

 

  1. 尽量使用自己拓展的几何实例化替代Unity提供的静态合批、动态合批、前者将合并mesh增加vbo的内存占用,后者则会增加cpu端的耗时开销

  2. 尽量减少顶点数与三角面数,前者减少顶点着色器的运算,减少GPU显存中FrameData的内存存储,后者减少片元着色器的消耗

  3. 避免每帧提交Buffer数据,比如Unity的CPU版本的粒子系统,可以使用GPU版本的粒子系统,将修改数据移动到GPU,避免大片的透明粒子特效,会造成严重的Overdraw

  4. 减少渲染状态的设置与获取,如在Update获取设置Shader的属性或者公共变量。CPU是通过MMIO获取寄存器数据,这将耗费更多的时间周期

  5. 3D物体尽量使用LOD处理顶点与面数的消耗,开启Mipmap减少贴图缓存命中的丢失

  6. 避免AlphaTest的使用,会造成Early-Z失效

  7. 避免三角面过小,会加剧过度绘制的情况,也就是前面提到的三角形只占3个像素点,却使用了12个线程去计算像素值然后屏蔽其余9个计算结果

  8. 在寄存器数量与变体中寻找平衡,使用if变量达成静态分支,取代变体。一方面可以减少变体数量,另一方面也可以使URP中的SRP Batch更高效合批

  9. 尽量避免动态判断分支也就是Shader中的if true和false都会走的情况

  10. 减少复杂函数的调用,从硬件架构上就可以看出特殊函数处理单元是远远小于正常计算的单元的

 

 

 

Gefore RTX 2060验证

 

本文禁止转载或摘编

  • 2
  • 5
  • 分享

热门评论(0)

noface.gif

请先登录后发表评论 (・ω・)

表情发布

看看下面~来发评论吧

h5-download-logo@3x.png

打开客户端阅读

支持点赞、投币、收藏

立即体验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1667593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL表死锁查询语句

步骤1:查询表死锁的sql语句: SELECT * FROM information_schema.PROCESSLIST where length(info) >0 ; 或 SELECT * FROM information_schema.INNODB_TRX; 步骤2:删除 kill "对应的线程id"

hadoop克隆虚拟机

克隆虚拟机 小白的Hadoop学习笔记 2024/5/11 9:42 文章目录 克隆虚拟机准备好模板机克隆* 记得先将模板机关机 配置ipifcfg-ens33hostnamehosts重启 测试是否成功ifconfigping xshell 准备好模板机 克隆 * 记得先将模板机关机 下一页>>下一页 选择创建完整克隆 起名字…

【大模型赋能开发者】海云安入选数世咨询LLM驱动数字安全2024——AI安全系列报告

近日,国内知名数字产业领域第三方调研咨询机构数世咨询发布了LLM驱动数字安全2024——AI安全系列报告。报告通过调研、公开信息收集等方式对目前十余家已具备LLM相关的应用能力安全厂商对比分析出了这一领域当前的产业现状并进行了各厂商的能力展示。 海云安凭借近…

Linux:文件系统

Linux:文件系统 磁盘物理结构存储结构逻辑结构 文件系统inode分区 & 分组分区管理inode Bitmap & inode TableBlock Bitmap & Data BlocksGDT & Super Block & Boot Block 重新理解目录 软硬链接软链接硬链接软硬链接的使用场景 磁盘 计算机需…

C++中vector的简单实现

文章目录 一、主要任务1. 查看文档的网站的链接2.内部模拟的函数 二、本人的模拟实现过程1. 所需模拟实现的函数a.构造、拷贝构造b. reverse()扩容c.insert()、push_back()插入数据d. erase()、pop_back()删除数据e. swap()交换f. begin()、end()非const与const迭代器g. 完善构…

什么是$t?$t的介绍及使用

目录 $t介绍&#xff1a; 作用&#xff1a; 安装国际化插件&#xff1a; 创建国际化资源文件 配置 vue-i18n &#xff1a; 切换语言&#xff1a; 下面为中文和英文状态下的效果&#xff1a; 如下面所示&#xff0c;这是一段前端代码&#xff1a; <el-form-item :label…

如何在 Linux / Ubuntu 上下载和安装 JMeter?

Apache JMeter 是一个开源的负载测试工具&#xff0c;可以用于测试静态和动态资源&#xff0c;确定服务器的性能和稳定性。在本文中&#xff0c;我们将讨论如何下载和安装 JMeter。 安装 Java&#xff08;已安装 Java 的此步骤可跳过&#xff09; 安装 Java 要下载 Java&…

序列到序列模型在语言识别Speech Applications中的应用 Transformer应用于TTS Transformer应用于ASR 端到端RNN

序列到序列模型在语言识别Speech Applications中的应用 A Comparative Study on Transformer vs RNN in Speech Applications 序列到序列(Seq2Seq)模型在语音识别(Speech Applications)中有重要的应用。虽然Seq2Seq模型最初是为了解决自然语言处理中的序列生成问题而设计的…

访客管理系统对于校园安全的重要性

校园访客办理计划是针对校园安全需求规划的安全办理体系&#xff0c;主要用于对校园外来人员的科学办理。要做好校园安全作业&#xff0c;把风险分子拒之门外尤为要害。校园访客办理计划实现访客实名制&#xff0c;并结合公安网、黑名单功用&#xff0c;对风险人员进行提前预警…

指针的奥秘(四):回调函数+qsort使用+qsort模拟实现冒泡排序

指针 一.回调函数是什么&#xff1f;二.qsort函数使用1.qsort介绍2.qsort排序整型数据3.qsort排序结构体数据1.通过结构体中的整形成员排序2.通过结构体中的字符串成员排序 三.qsort模拟实现冒泡排序 一.回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数。 …

机器人系统ros2-开发实践07-将机器人的状态广播到 tf2(Python)

上个教程将静态坐标系广播到 tf2&#xff0c;基于这个基础原理这个教程将演示机器人的点位状态发布到tf2 1. 写入广播节点 我们首先创建源文件。转到learning_tf2_py我们在上一教程中创建的包。在src/learning_tf2_py/learning_tf2_py目录中输入以下命令来下载示例广播示例代码…

显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等概念的区别与联系

在科技日新月异的今天&#xff0c;显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等术语已经成为了科技领域的重要组成部分。本文旨在阐述这些术语之间的区别与联系&#xff0c;帮助您更好地理解它们在技术生态系统中的作用。 一、显卡 显卡&#xff0c;也称为…

利用PS在不伤背景的前提下根据颜色去除图像上不想要的内容

下面为一个例子&#xff0c;去除图像上红色的虚线 Step1.用套索工具框选带有颜色的部分 Step2.切换到魔术棒工具&#xff0c;上端选项中&#xff0c;点击与选区交叉&#xff0c;连续这一项不要勾选 Step3.在需要去除的部分点击一下即可在框选范围内选中所有同颜色的区域&#x…

“二代”接班进行时:达利食品许阳阳揭秘“零食大王”成长密钥

“二代接班”早已不是一个新鲜话题。近年来&#xff0c;随着时间的推移&#xff0c;那些伴随改革开放和中国制造崛起的民营企业&#xff0c;更多的正在经历或已完成“二代接班”。 “毛巾王子”家的洁丽雅&#xff0c;最近因大手笔签约多位代言人而引起讨论的九牧王&#xff0…

用python写算法——队列笔记

1.队列定义 队列是一种特殊的线性表&#xff0c;它只允许在表的前端进行删除操作&#xff0c;在表的后端进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。进行插入操作的端称为队尾&#xff0c;进行删除操作的端称为队头。队列中没有元素时&#…

MATLAB的Bar3函数调节渐变色(内附渐变色库.mat及.m文件免费下载链接)

一. colormap函数 可以使用colormap函数&#xff1a; t1[281.1,584.6, 884.3,1182.9,1485.2; 291.6,592.6,896,1197.75,1497.33; 293.8,596.4,898.6,1204.4,1506.4; 295.8,598,904.4,1209.0,1514.6];bar3(t1,1) set(gca,XTickLabel,{300,600,900,1200,1500},FontSize,10) set…

机器学习周记(第三十八周:语义分割)2024.5.6~2024.5.12

目录 摘要 ABSTRACT 1 DeeplabV3实现思路 预测部分 ①主干网络介绍​编辑 ② 加强特征提取结构 ③ 利用特征获得预测结果 摘要 本周继续了语义分割的学习&#xff0c;主要学习了DeepLabV3的部分实现思路&#xff0c;即DeepLabV3的整个模型的预测过程&#xff0c;并通过代…

HCIP(BGP综合实验)--8

一&#xff1a;实验要求 二&#xff1a;实现过程 &#xff08;一&#xff09;配置IP地址&#xff1a; AR1: [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [AR1-GigabitEthernet0/0/0]int l0 [AR1-LoopBack0]ip add 172.16.0.1 32 [AR1-LoopBack0]int l1 […

vscode怎么设置背景图片?

vscode背景图片是可以自己设置的&#xff0c;软件安装后默认背景的颜色是黑色的&#xff0c;这是默认的设计&#xff0c;如果要修改背景为指定的图片&#xff0c;那么我们需要安装插件&#xff0c;然后再通过代码来设置背景图片的样式&#xff0c;下面我们就来看看详细的教程。…

【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努…