UWA发布 | Unity手游性能年度蓝皮书

UWA本次发布的《2023-2024年度Unity手游性能蓝皮书》将汇总游戏行业使用Unity引擎进行手游开发过程中及游戏上线后的性能表现,从测试机型分布、引擎各模块开销、内存占用等方面剖析定位Unity手游性能瓶颈和趋势,反映了Unity手游行业的现状,帮助游戏开发商寻找合适的性能定位和提升方案。

这是侑虎科技原创文章,欢迎转发分享,未经官方授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。


报告目录:
1)Unity手游测试机型分布
2)Unity手游CPU模块性能开销分析
3)Unity手游内存模块性能开销分析
4)Unity手游GPU模块性能开销分析

本次发布我们针对不同档次的机型进行分档,分档的依据为UWA根据设备的算力。以下是每种档位的典型机型:

高端机:小米10、小米11、红米K40、小米9、小米13、小米12、HUAWEI P40、红米K50、Galaxy S21、HUAWEI P40 Pro、华为Mate 40 Pro

中端机:小米8、OPPO R17、荣耀9X、荣耀V20、华为P30、红米K30、红米note8、小米6、小米MIX2

◆◆◆◆

Unity手游测试机型分布

在本周期的游戏研发团队的测试中,我们统计了项目组在日常研发过程中使用的测试手机品牌和具体型号的占比,反映出游戏研发团队用于性能测试的移动设备的选择偏好。

各品牌的使用占比

游戏研发团队用于性能测试的机型主流品牌依次是华为(17%)、小米(15%)、红米(15%)、Vivo (11%)、三星(10%)和OPPO (10%);由于游戏出海的需求,三星手机的占比依然较高,且在出海的地区中三星的占比远高于小米和Vivo。

注:由于一个项目可以同时使用多个品牌的设备进行测试,统计中进行了规范化使占比总和为100% 。


Top 20 测试设备(按项目占比计算)

  • 小米品牌以绝对性优势在测试机型中拔得头筹,Top 3机型分别为小米10、小米8和小米11;
  • 华为品牌的Top 3机型分别是华为P30、华为P40和华为P40 Pro;
  • Top 20机型中没有低端机型。

Top 20 测试设备使用趋势(按项目占比计算)

以小米8、小米10和小米11作为测试机的数量明显提升;
上一年度的低端机代表红米 4X已退出Top 20排名。


通过UWA Pipeline完成自动化测试的占比趋势

我们发现最近一年来,大家在自动化测试方面有了长足的进步,截止到2024年Q1底,已经有23%的UWA性能测评报告通过自动化测试提交到UWA后台分析系统。这说明自动化测试在大量项目组里已经得到了很好地执行和落地,虽然自动化脚本的编写和维护依然有一定的门槛,但很多团队已经找到了突破口,一旦这种体系建立起来,研发的质量和效率都将得到大幅度提高。


FPS均值总体情况

不同档次设备的FPS均值表现

从已有的测试数据看,高达44%的项目帧率在20-30帧之间,24%的项目在45-60帧之间。说明大部分的项目还是趋于30帧的目标做优化,但同时也说明目前已经有较多项目开始以60帧为目标进行游戏开发,高端设备(非顶端)上已经有近25%的项目以60帧作为目标。

在中低端设备上:73%的项目未到达30帧,26%的项目未达到20帧;
在中端设备上:62%的项目未达到30帧;
在高端设备上:50%的项目未达到30帧;
在顶级设备上:37%的项目未达到30帧,3%的项目达到60帧。


不同档次设备的FPS均值走势

顶级设备的帧率(均值)在37帧左右;
高端设备的帧率(均值)在32帧左右;
中端设备的帧率(均值)在29帧左右;
中低端设备的帧率(均值)在24帧左右。


Jank均值总体情况

不同档次设备的Jank值走势

卡顿均值在2023年Q3的表现上仰,后续卡顿值维持在11次/分钟,建议研发团队多使用UWA GOT Online - Overview模式测试,并通过卡顿分析功能来进行检测和优化。


下面我们来具体分析Unity引擎的主流模块的开销情况。

为了能够更好地反映出各个性能参数的整体使用情况,我们统计了每种性能参数的主体使用范围,其范围区间是[5%~95%],以下数据中P5代表5%,P50代表中位值,P95代表95%。

◆◆◆◆

Unity手游CPU模块性能开销分析

一、渲染模块

DrawCall数量的主体范围均值

半透明渲染DrawCall主体范围均值

不透明渲染DrawCall主体范围均值

DrawCall Batches数量的主体范围均值

从上述的数据中可以看出,URP项目在通过合理的Batch之后,基本上都控制在了合理范围内,说明SRP Batch的合批效果非常突出,这也是UWA推荐研发团队要深入学习URP的原因。


Triangle数量的主体范围均值

同屏渲染面片数在不同档次的设备上画质分级效果已经并不突出,建议研发团队进一步加大场景、角色建模的复杂度,将模型的细节更加突出。


二、逻辑代码

GC调用频率(帧/次)

仅有32%的项目将GC调用频率控制在1000帧/次以上;51%左右的项目小于600帧/次,说明GC问题依然值得关注。

不同档次设备的GC调用频率

对于GC的优化,建议研发团队一方面继续优化自身逻辑代码的堆内存分配,一方面推荐大家使用Unity引擎的Incremental GC功能,来降低每帧GC的CPU耗时。


三、UI模块

目前我们主要统计了NGUI、UGUI和FGUI的占比情况。三种UI解决方案在这一年中,总体走势都较为平稳,UGUI依然是垄断地位,最高时可达86%;同时,依然有7%左右的用户在使用NGUI,FGUI的使用比例在7%左右。

UI 类型占比

UI 类型占比走势

接下来,我们以统计范围内最为主流的UGUI来进一步分析。

UGUI耗时均值分布

Canvas.SendWillRenderCanvases CPU耗时均值分布

UI模块的性能开销依然很高,但相较于去年,确实有进一步提升。这主要是在这一年多以来,各大研发团队对于UGUI的理解和掌握都在不断深入。当然,UGUI的使用也会有明显的性能问题,主要有以下四方面:

  1. DrawCall;
  2. 重建;
  3. Overdraw;
  4. 主线程阻塞。

针对以上问题,大家可以通过UWA学堂(https://edu.uwa4d.com)中UI相关的技术文章和视频进行学习和了解,相信对帮助大家快速提升UI方面的技术理解大有裨益。


四、动画模块

Animators.Update耗时主体范围均值

不同档次设备Animators.Update耗时均值走势

除了中低端设备,其他档次设备的动画性能的趋势表现都较为平稳,说明大家对于动画模块的使用较为合理的。除了中端设备,设备动画模块的性能耗时在2023年Q4均有所上涨。

同时,AnimationClipPlayable功能也非常值得研发团队后续研究和关注,它对于动画系统性能方面的提升有很大的潜力可以挖掘。


五、物理模块

Physics.Processing耗时均值的主体范围

物理模块耗时走势

物理模块的整体耗时相对比较平稳,这得益于越来越多的研发团队对于物理引擎开启的必要性做了更深入的了解。

同时,随着大家对于场景和角色物理模拟的逼真度要求越来越高,布料、布娃娃系统相关的插件开始逐步被广泛使用。特别是今年我们关注到不少团队开始使用Magica Cloth并取得了不错的性能效果,因此建议研发团队对其进行研究关注。


六、粒子模块

ParticleSystem.Update耗时的主体范围均值

粒子系统耗时均值走势

不同档次设备粒子系统耗时均值走势

提示研发团队注意两方面:
1)建议针对粒子系统根据不同设备的性能进行不同程度的调整,从而进一步降低粒子系统的CPU耗时和内存占用;
2)针对技能特效建议进行定期自动化地检测,可以参考深圳雷霆的特效自动化检测方案。

◆◆◆◆

Unity手游内存分布

一、总体内存

PSS内存占用峰值总体情况

不同内存设备的PSS内存占用峰值

PSS内存占用峰值走势

不同内存设备PSS内存占用峰值走势

4GB内存以下设备的内存占用(中位值)在800MB-1.2GB之间,4GB内存以上设备的内存占用在1.2GB-1.6GB(中位值)之间,且无论是低端、中端还是高端,整体都呈上升趋势。


二、总体堆内存

Mono内存占用峰值总体情况

不同内存设备的Mono内存占用峰值

Mono内存占用峰值走势

不同内存设备的Mono内存占用峰值走势

总体堆内存一直是项目的内存瓶颈,虽然在过去一年有所起伏,整体堆内存都高达90MB以上,且超过1/3的项目高达120MB。这主要是游戏的重度化所致,但另一方面也是研发团队对于Mono堆内存分配疏于管理所致,例如配置文件的序列化库使用不当等,建议研发团队在项目中前期选择序列化库时尽可能做更多的调研或者实验,来制定更合适合于自身项目的序列化配表解决方案。

项目的内存占用很大一部分来自于资源的使用,下面我们将对项目中主流资源的使用情况进行分析。


三、纹理资源内存

纹理内存占用峰值总体情况

不同内存设备的纹理内存占用峰值

纹理内存占用峰值走势

不同内存设备的纹理内存占用峰值走势

虽然硬件设备和画质要求在不断提升,但大家在高内存设备上的画质分级的设计上还不够明显,效果差异尚未拉开。这说明大量项目在中高端设备上并未很好地利用设备的硬件优势,UWA认为,在当下的高端甚至旗舰设备上,大家的游戏品质依然有很大的可提升空间。


ASTC/ETC格式纹理覆盖率走势

ASTC/ETC格式纹理运行时数量占比走势

使用ASTC格式的项目越来越多,且自身资源的数量在项目中的占比也在快速升高。就目前我们观测到的项目而言,在国内,ASTC已经成为目前游戏市场的主流格式,基本上大家可以直接选择该格式成为项目纹理的解决方案。而如果考虑出海,则建议研发团队通过更多当地运营项目或渠道数据来谨慎选择ASTC或ETC2格式。


四、网格资源内存

网格内存占用峰值总体情况

不同内存设备的网格内存占用峰值

网格内存占用峰值走势

不同内存设备的网格内存占用峰值走势

网格峰值内存的中位数使用内存均在30MB以下,该值偏低,由于设备内存在不断增加,研发团队可以考虑进一步加大场景、角色建模的复杂度,将模型的细节更加突出。


五、动画资源内存

动画片段内存占用峰值总体情况

不同内存设备的动画片段内存占用峰值

动画片段内存占用峰值走势

不同内存设备的动画片段内存占用峰值走势

动画模块的内存使用趋势在2023年Q3有明显的上升,峰值内存的均值长期维持在20MB之内。


六、Shader资源内存

Shader内存占用峰值总体情况

不同内存设备的Shader内存占用峰值

Shader内存占用峰值走势

不同内存设备的Shader内存占用峰值走势

Shader资源内存峰值大幅上升的主要原因是不少项目进行了Unity版本的升级,属于正常现象。Unity 2019.4.21以后,Shader的内存统计发生了变化。原来统计在ShaderLab中的内存现在也被算在Shader资源本身了。

这里,UWA仍然需要提醒的是,Standard Shader在大家的项目中被经常误引入进来,建议大家在UWA性能简报中的“具体资源使用信息”中特别关注Standard Shader的使用情况。

同时,也建议研发团队结合本地资源检测服务,对Shader相关的规则做检测,尤其是变体数量。


七、RenderTexture资源内存

RenderTexture内存占用峰值总体情况

不同内存设备的RenderTexture内存占用峰值

不同内存设备的RenderTexture内存占用峰值分布

RenderTexture内存占用峰值走势

不同档次设备的RenderTexture内存占用峰值走势

不同档位机型上的RenderTexture内存占用都有波动,且在RT的效果分级上取得了一定的成效。


八、粒子系统资源内存

粒子系统内存占用峰值总体情况

不同内存设备的粒子系统内存分布占用峰值

不同内存设备的粒子系统内存分布占用峰值

粒子系统内存分布占用峰值走势

不同档次设备的粒子系统内存分布占用峰值走势

粒子系统的使用数量在逐步提升,并保持在10~25MB之间,说明游戏团队的特效品质在不断提升。UWA建议大家在不断提升特效品质的同时,切记要经常检测特效的制作质量和性能开销,因为美术人员如果不了解特效的制作特点,很可能会造成“做的越多、返工越多”的现象,这样就会造成大量的研发资源浪费,甚至导致项目上线的延期。

对此,UWA推出的本地资源检测服务,针对项目工程中的静态资源(比如纹理、网格、音频、动画以及粒子系统、代码设置等等)可做检测,来检测美术资源是否有设置不合理,做到静态资源的及时问题反馈、及时修复。

◆◆◆◆

Unity手游GPU模块性能开销分析

GPU重要性能参数

从2023年的Q2开始,我们的GOT Online产品开始陆续推出GPU端的性能分析指标,我们希望通过提供更多有价值的性能指标,来为游戏项目在GPU方面提供更好的分析和优化方案。通过这一年来的摸索,我们在整个行业内积累了大量的GPU端相关性能数据,接下来,我们将针对较为重要的指标来进行分享,希望这些统计数据能够对大家理解和分析自己项目在GPU端的性能问题有所帮助。由于过去一年内,UWA的GPU性能指标陆续上线,且针对不同品牌的芯片,其性能指标也差异很多,所以接下来的数据展示主要来自于Mali和高通芯片,且对其对应的性能参数进行了归类,希望可以让这些性能指标更符合大家的理解。

1. GPU耗时均值走势
GPU耗时是每个项目都最为关注的GPU性能指标,我们在这个方面迭代了大量的计算版本来提升该数值的精准性。目前该数值可以针对不同的芯片来进行较为精准地反馈,下面是Mali芯片和Adreno芯片上该指标的性能趋势。

从上图可以看出,无论是何种芯片,GPU耗时均值均在15~25ms区间内,且有小幅上升的趋势。但是,当我们进一步按照设备档位来进一步细分GPU开销时,则会明显发现,当下游戏在中低端设备上的GPU性能压力较大,如下图所示,P95数值均大幅高于33ms。

2. GPU Clocks指标统计
为了更精准地让研发团队了解到自己项目的GPU压力,我们也统计了GPU Clocks指标的参数范围和变化趋势,具体如下图所示。

GPU Clocks均值走势

通过趋势图我们可以看出游戏项目依然再向精品化趋势过渡,但研发团队更需要关注的是该参数的主体,通过主体范围的相关数值,研发团队可以进一步针对自身项目来衡量和制定自身项目的研发标准。

GPU Clocks均值主体范围分布

GPU Clocks峰值走势

GPU Clocks峰值主体范围分布

3. GPU利用率(GPU Utilization)
以Mali芯片为例,我们统计了近一年来,大量项目的利用率均值和峰值分布情况,如下图所示:

GPU Usage均值主体范围分布

GPU Usage峰值主体范围分布

从上图可以看出,目前大部分游戏项目在中低端档次设备上,都存在不同程度的GPU利用率过大问题,这样和上面GPU耗时分析相吻合,因此,建议研发团队特别关注自身项目在中低端档次设备上的GPU性能压力,对设备分级和GPU性能选择进行更进一步的细致划分,从而提高中低端设备玩家的游戏体验。

4. Fragment Shaded参数统计
该参数统计每帧设备通过Fragment Shader来渲染的像素值,就目前移动游戏而言,其最大的GPU性能压力主要(80%+)来自于Fragment Shading。所以,在UWA GOT Online报告中,会非常详细地对其进行统计和分析。下图为不同芯片厂商中,Fragment Shaded参数的均值和峰值趋势走势。从图中可以看出,虽然均值走势相对比较平稳,但峰值走势却在近两个季度大幅上升。这也预示着未来GPU性能瓶颈依会在整个游戏行业进一步凸显。

Fragment Shaded参数均值趋势

Fragment Shaded参数峰值趋势

近一年来,该性能参数在不同芯片上的分布范围,我们将其重点罗列如下,研发团队可以根据自己项目的GOT Online报告来进行比对。

Fragment Shaded均值主体范围分布

Fragment Shaded峰值主体范围分布

5. 总体带宽均值走势
GPU带宽是GPU端非常重要的性能指标,特别是在当下的移动游戏上。因为带宽过高会直接影响设备发热,进而导致设备降频。设备一旦降频,无论是CPU还是GPU,其性能均会受到极大影响,所以,移动游戏研发团队需要不断关注自己项目的GPU带宽问题,及早发现、尽快解决。

下图为Mali芯片和Adreno芯片的平均带宽占用趋势,基本上都控制在60~80MB/帧,该范围较为合理。因为如果游戏以30帧/秒的帧率进行运行,那么每秒的GPU带宽将达到1.8~2.4GB,一般我们建议主流机型(比如小米10)的带宽量尽可能控制在3.0GB/秒以下较为合适,但如果您的游戏希望达到60帧,那么该流量则过大了,会很快导致设备发热进而降频,因此,UWA建议研发团队尽早通过量化指标来建立研发标准,否则越到研发后期,返工成本越高。

总体带宽均值主体范围分布

6. Overdraw分析
Overdraw对于GPU性能的重要程度不言而喻,Overdraw层数越高,意味着每帧GPU要渲染的像素越多,如果Shader的复杂程度也很高,那么GPU的性能压力将会十分巨大。因此,在GOT Online报告中就非常重视Overdraw层数的分析,下图则是这一年来现有测试游戏Overdraw的统计分析,我们将以均值和峰值来进行展示。

Overdraw层数均值走势
在最近一年的移动游戏测试中,无论是Mali芯片还是Adreno芯片,其Overdraw层数基本上都维持在6~8层左右,如下图所示。

Overdraw层数均值主体范围分布
下图则是两款芯片上Overdraw层数的细致分布情况。

Overdraw层数峰值走势
在峰值方面,Overdraw层数峰值逐季度上升,如下所示。一方面随着我们GPU模式的推出,最近一年的GPU测试游戏项目在不断增加;另一方面,也是移动游戏同样在朝着精品化不断发展。对此,UWA建议研发团队在研发过程中,特别注意Overdraw的峰值区域,查看其是否使用合理。一般情况下,造成Overdraw层数较高的原因主要如下:
(1) 技能特效、场景特效(烟、雾、云等)的不合理制作;
(2) UI界面的叠层过多,特别是不可见的UI界面需要特别注意,“不可见”不代表不渲染;
(3) 多个渲染相机同时工作,但玩家很可能只看到少数几个。这种情况本质与第(2)点相同,玩家没看到,但GPU确实实时渲染,造成不必要的资源计算浪费。

造成Overdraw层数过高的情况还有很多,在此我们无法一一列举,但我们建议研发团队在日常的研发工作中,尽可能将其作为性能测试的常备观察项,以便及时发现问题,及时解决问题。

Overdraw层数峰值主体范围分布

我们深信数据是会说话的,总有规律值得我们追溯求实、鉴往知来。同时我们也会不断细化评析的标准、分类等,让数据更具有代表性和说服力。

*本报告中的数据最终解释权归侑虎科技所有。

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

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

相关文章

【会议征稿,JPCS出版】第三届电力系统与能源技术国际学术会议(ICPSET 2024,7月5-7)

第三届电力系统与能源技术国际学术会议(ICPSET 2024)将于2024年7月5-7日在杭州举办。由浙江水利水电学院电机产业学院主办,AEIC学术交流中心承办,湖州市南浔创新研究院、南浔区科技局(科协)协办 。会议主要…

回溯算法练习题(2024/6/18)

1全排列 II 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入:nums [1,2,3] 输出:[[1,…

rollup学习笔记

一直使用的webpack,最近突然想了解下rollup,就花点时间学习下. 一,什么是rollup? rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,比如我们的es6模块化代码,它就可以进行tree shaking,将无用代码进行清除,打包出精简可运行的代码包. 业…

【Java基础】

Java基础常见面试题总结(上) 基础概念与常识 Java 语言有哪些特点? 简单易学(语法简单,上手容易);面向对象(封装,继承,多态);平台无关性( Java 虚拟机实现平台无关性);支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程…

vue elementui table给表格中满足条件的每一条记录添加计时器

需求: 在前端给表格中给满足条件的每一条记录增加一个计时器,用于计算工作时长。 1.数据库中存储的有每条记录的作业开始时间,将当前时间和作业开始时间计算一个差值,作为作业时长的初始值; 2.把满足条件的每条记录绑…

Java中对象的比较

1. 对象的比较 在Java中,基本类型的对象可以直接比较大小,而自定义类型却不能 class Card {public int rank; // 数值public String suit; // 花色public Card(int rank, String suit) {this.rank rank;this.suit suit;}}public class TestPriori…

2008-2022年 全国31省-环境污染综合指数

环境污染综合指数是一个衡量环境污染程度或环境质量等级的抽象概括数值。它能够综合反映不同环境要素的污染情况,例如水污染指数和大气污染指数等。环境空气质量综合指数(Air Quality Index, AQI)是专门用来描述城市环境空气质量状况的一个指…

C++进阶之AVL树

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.前言 二.插入 三.旋转 3.1右旋 …

如何利用数据仓库进行业务分析:一名大数据工程师的视角

在大数据时代,数据的有效利用对企业的成功至关重要。 本文将基于上面的流程图,详细介绍如何利用数据仓库进行业务分析,并提供实际的例子和代码演示,以帮助读者更好地理解和应用相关技术。 数据仓库的基本流程 上图展示了一个典…

莱辅络Rebro BIM机电专业软件

莱辅洛(Rebro)是一款专业机电 BIM 软件。它具备专业人士所期待的各种专业功能,应用于建筑机电工程的三维设计,并且适用于建筑、结构、给排水、暖通、电气五大专业。 该软件具有以下特点: • 3D 模型:可以…

1.接口测试-postman学习

目录 1.接口相关概念2.接口测试流程3.postman基本使用-创建请求(1)环境(2)新建项目集合Collections(3)新建collection(4)新建模块(5)构建请求请求URLheader设…

常见的创建型设计模式( 一 )

设计模式( 一 ) 常见的创建型设计模式 1.单例模式 : 确保一个类只有一个实例 , 为整个程序提供一个全局的访问接口。getInstance 实现方式 饿汉式,在调用getInstance 创建实例的时候 ,实例已经存在了 ,不需要我们再次去 new创建。 优点&a…

修复 Android 手机卡在启动屏幕上的 7 种方法

Android 手机卡在启动屏幕上的情况并不常见。通常,问题出现在应用新更新或安装未知来源的应用程序后。幸运的是,您可以让您的 Android 手机跳过启动屏幕,而无需前往最近的服务中心。 当您的 Android 手机在启动屏幕上陷入无限循环时&#xf…

标准立项 | 《温室气体排放核算与报告要求 废油资源化企业》

《温室气体排放核算与报告要求 废油资源化企业》适用于废油资源化行业企业温室气体排放量的核算和报告。从事废油资源化生产的企业,均可参考该标准核算企业的温室气体排放量,并编制企业温室气体排放报告。 参编咨询:中华环保联合会水环境治理…

ECharts 蓝色系-荧光图标折线图01案例

ECharts 蓝色系-荧光图标折线图01案例 图表意义 本折线图案例展示了一周内不同路线的使用情况或数据统计。通过折线的上升和下降,可以直观地观察到每条路线的流量或数据变化趋势,从而进行分析和决策。 效果预览 效果图展示不同路线的数据统计和个性化…

<Rust><iced>在iced中显示gif动态图片的一种方法

前言 本文是在rust的GUI库iced中在窗口显示动态图片GIF格式图片的一种方法。 环境配置 系统:window 平台:visual studio code 语言:rust 库:iced、image 概述 在iced中,提供了image部件,从理论上说&…

链表中环的入口节点

链表中环的入口节点 描述 链表中环的入口节点 给一个长度为n链表&#xff0c;若其中包含环&#xff0c;请找出该链表的环的入口结点&#xff0c;否则&#xff0c;返回null。 数据范围&#xff1a; n≤10000&#xff0c; 1<结点值<10000 要求&#xff1a;空间复杂度 O(1)…

前后端交互的弯弯绕绕

前后端交互&#xff1a; &#x1f197;&#xff0c;收拾一下心情让我们来聊一聊AJax吧&#xff0c;随着前端的飞速发展&#xff0c;前后的交互也发生了天翻地覆的变化&#xff1a; 前后端交互的方式有很多&#xff1a; AJAX、表单提交、WebSocket、RESTful API、... 这对新入…

基于Java学生选课管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

NSSCTF-Web题目14

目录 [CISCN 2019华东南]Web11和[NISACTF 2022]midlevel 1、题目 2、知识点 3、思路 [HDCTF 2023]SearchMaster 1、题目 2、知识点 3、思路 [CISCN 2019华东南]Web11和[NISACTF 2022]midlevel 这两道题目一样 1、题目 2、知识点 SSTI&#xff08;服务端模板注入漏洞&…