《dx12 龙书》第四部分学习笔记——预备知识(下)

news2024/11/27 12:33:32

7、多重采样技术的原理

 由于屏幕中显示的像素不可能是无穷小的,所以并不是任意一条直线都能在显示器上“平滑”而完美地呈现出来。即为以像素矩阵 (matrix of pixels, 可以理解为“像素2D数组”)逼近直线的方法所产生的“阶梯” (aliasing, 锯齿状走样)效果。类似地,显示器中呈现的三角形之边也存在着不同程度的锯齿效应。
 通过提高显示器的分辨率就能够缩小像素的大小,继而使上述问题得到显著地改善,使阶梯效应在很大程度上不易被用户所察觉。
 在不能提升显示器分辨率,或在显示器分辨率受限的情况下,我们就可以运用各种反走样(antialiasing, 也有译作抗锯齿、反锯齿、反失真等)技术。有一种名为超级采样(supersampling, 可简记作SSAA,即Super Sample Anti-Aliasing)的反走样技术,它使用4倍于屏幕分辨率大小的后台缓冲区和深度缓冲区。3D场景将以这种更大的分辨率渲染到后台缓冲区中。当数据要从后台缓冲区调往屏幕显示的时候,会将后台缓冲区按4个像素一组进行解析(resolve, 或称降采样,downsample。把放大的采样点数降低回原采样点数):每组用求平均值的方法得到一组相对平滑的像素颜色。因此,超级采样实际上是通过软件的方式提升了画面的分辨率。
 超级采样是一种开销高昂的操作,因为它将像素的处理数量和占用的内存大小都增加到之前的4倍。
 对此,Direct3D还支持一种在性能于效果等方面都较为折中的反走样技术,叫做多重采样(multisampling, 可简记作MSAA,即MultiSample Anti-Aliasing)。这种技术通过跨子像素共享一些计算信息,从而使它比超级采样的开销更低。现假设采用4X多重采样(即每个像素都有4个子像素),并同样使用4倍于屏幕分辨率的后台缓冲区和深度缓冲区。值得注意的是,这种技术并不需要对每一个子像素都进行计算,而是仅计算一次像素中心处的颜色,再基于可视性(每个子像素经深度/模板测试的结果)和覆盖性(子像素的中心在多边形的里面还是外面?)将得到的颜色信息分享给其子像素。下图展示了一个多重采样的实例。
多重采样实例注意:
 超级采样和多重采样的关键区别是显而易见的。对于超级采样来说,图像颜色要根据每一个子像素来计算,因此每个子像素都可能各具不同的颜色。而以多重采样的方式来求取图像颜色时,每个像素只需计算一次,最后,再将得到的颜色数据复制到多边形覆盖的所有可见子像素之中。由于计算图像颜色是图形流水线中开销最大的步骤之一,所以用多重采样来代替超级采样对节省资源而言意义非凡。但是,超级采样的精准度确实更高一筹。
 上图所示的是一种将每个像素都以均匀栅格划分为4个子像素的反锯齿采样模式。实际上,每家硬件厂商所采用的模式(即选定的子像素位置,可以说决定了采样的位置)可能会各不相同,而Direct3D也并没有定义子像素的具体布局。在各种特定的情况下,不同的布局模式各有千秋。

8、利用Direct3D进行多重采样

typedef struct DXGI_SAMPLE_DESC
{
	UINT Count;
	 UINT Quality;
}DXGI_SAMPLE_DESC;

 Count成员指定了每个像素的采样次数,Quality成员则用于指示用户期望的图像质量级别。采样数量越多或质量级别越高,其渲染操作的代价也就会愈发高昂,所以需要在质量与速度之间做出利弊权衡。至于质量级别的范围,则要取决于纹理格式和每个像素的采样数量。
 根据给定的纹理格式和采样数量,我们就能用ID3D12Device::CheckFeatureSupport方法查询到对应的质量级别:

typedef struct D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS{
	DXGI_FORMAT Format;
	UINT SampleCount;
	D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS Flags;
	UINT NumQualityLevels;
}D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS;

D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS msQualityLevels;
msQualityLevels.Format = mBackBufferFormat;
msQualityLevels.SampleCount = 4;
msQualityLevels.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE;
msQualityLevels.NumQualityLevels = 0;
ThrowIfFailed(md3dDevice->CheckFeatureSupport(
	D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS,
	&msQualityLevels,
	sizeof(msQualityLevels)));

 注意,此方法的第二个参数兼具输入和输出的属性。当它作为输入参数时,我们必须指定纹理格式、采样数量以及希望查询的多重采样所支持的标志。接着,待函数执行后便会填写图像质量级别作为输出。对于某种纹理格式和采样数量的组合来讲,其质量级别的有效范围为0至NumQualityLevels-1。
 每个像素的最大采样数量被定义为:
 #define D3D12_MAX_MULTISAMPLE_SAMPLE_COUNT(32)
 但是,考虑到多重采样会占用内存资源,又为了保证程序性能等原因,通常会把采样数量设定为4或8。如果不希望使用多重采样,则可将采样数量设置为1,并令质量级别为0。其实在所有支持Direct3D11的设备上,就已经可以对所有的渲染目标格式用用4X多重采样了。
注意:
 在创建交换链缓冲区和深度缓冲区时都需要填写DXGI_SAMPLE_DESC结构体。当创建后台缓冲区和深度缓冲区时,多重采样的有关设置一定要相同。

9、功能级别

 举例以下参数大致对应于Direct3D9到Direct3D11之间的各种版本:

enum D3D_FEATURE_LEVEL
{
	D3D_FEATURE_LEVEL_9_1	  = 0x9100,
	D3D_FEATURE_LEVEL_9_2	  = 0x9200,
	D3D_FEATURE_LEVEL_9_3	  = 0x9300,
	D3D_FEATURE_LEVEL_10_0	= 0xa000,
	D3D_FEATURE_LEVEL_10_1	= 0xa100,
	D3D_FEATURE_LEVEL_11_0	= 0xb000,
	D3D_FEATURE_LEVEL_11_1	= 0xb100,
}D3D_FEATURE_LEVEL;

 “功能级别”为不同级别所支持的功能进行了严格的界定(每个功能级别所支持的特定功能可参见SDK文档)。
 例,一款支持功能级别11的GPU,除了个别特例之外,必须支持完整的Direct3D11功能集。
 功能集使程序员的开发工作更加便捷——只要了解所支持的功能集,就能知道有哪些Direct3D功能可供使用。
 如果用户的硬件不支持某特定功能级别,应用程序理当回退至版本更低的功能级别。在现实的应用程序中,我们往往需要考虑支持稍旧的硬件,以获得更多的用户。

10、DirectX图形基础结构

 DirectX图形基础结构(DirectX Graphics Infrastructure,DXGI,也有译作DirectX图形基础设施)是一种与Direct3D配合使用的API设计DXGI的基本理念是使多种图形API中所共有的底层任务能借助一组通用API来进行处理。例如,为了保证动画的流畅性,2D渲染与3D渲染两组API都要用到交换链和页面翻转功能,这里所用的交换链接口IDXGISwapChain实际上就属于DXGI API。DXGI还用于处理一些其他常用的图形功能,如切换全屏模式,枚举显示适配器、显示设备及其支持的显示模式(分辨率、刷新率等)等这类图形系统信息。除此之外,它还定义了Direct3D支持的各种表面格式信息(DXGI_FORMAT)。
 我们刚刚简单地叙述了DXGI的概念,下面来介绍一些在Direct3D初始化时会用到的相关接口。IDXGIFactory是DXGI中的关键接口之一。通常来说,显示适配器(display adapter) 是一种硬件设备(如独立显卡),然而系统也可以用软件显示适配器来模拟硬件的图形处理功能。一个系统中可能会存在数个适配器(比如装有数块显卡)。适配器用接口IDXGIAdapter来表示。我们可以用下面的代码来枚举一个系统中的所有适配器:

void D3DApp::LogAdapters()
{
    UINT i = 0;
    IDXGIAdapter* adapter = nullptr;
    std::vector<IDXGIAdapter*> adapterList;
    while (mdxgiFactory->EnumAdapters(i, &adapter) !=
        DXGI_ERROR_NOT_FOUND)
    {
        DXGI_ADAPTER_DESC desc;
        adapter->GetDesc(&desc);
        std::wstring text = L"***Adapter: ";
        text += desc.Description;
        text += L”\n”;
        OutputDebugString(text.c_str());
        adapterList.push_back(adapter);
        ++i;
    }
    for (size_t i = 0; i < adapterList.size(); ++i)
    {
        LogAdapterOutputs(adapterList[i]);
        ReleaseCom(adapterList[i]);
    }
}

注: D3DAPP类后续会讲到,这里先写着,暂时不介绍
 另外,一个系统也可能装有数个显示设备。我们称每一台显示设备都是一个显示输出(display output, 有的文档也作adapter output, 适配器输出)实例,用IDXGIOutput接口来表示。每个适配器都与一组显示输出相关联。
 每种显示设备都有一系列它所支持的显示模式,可以用下列DXGI_MODE_DESC结构体中的数据成员来加以表示:

#include <minwindef.h>
#include <Dxgiformat.h>
typedef struct DXGI_MODE_DESC
{
	UINT Width;  //分辨率宽
	UINT Height;  //分辨率高度
	DXGI_RATIONAL RefreshRate;  //刷新率,单位为赫兹Hz
	DXGI_FORMAT Format;  //显示格式
	DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;  //逐行扫描vs.隔行扫描
	DXGI_MODE_SCALING Scaling;  //图像相对于屏幕的拉伸
} DXGI_MODE_DESC;

typedef struct DXGI_RATIONAL
{
	UINT Numerator;
	UINT Denominator;
} DXGI_RATIONAL;

typedef enum DXGI_MODE_SCANLINE_ORDER
{
	DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED = 0,
	DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE = 1,
	DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST = 2,
	DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST = 3
} DXGI_MODE_SCANLINE_ORDER;

typedef enum DXGI_MODE_SCALING
{
	DXGI_MODE_SCALING_UNSPECIFIED = 0,
	DXGI_MODE_SCALING_CENTERED = 1,//不做缩放,将图像显示在屏幕中
	DXGI_MODE_SCALING_STRETCHED = 2//根据屏幕分辨率对图像进行拉伸
} DXGI_MODE_SCALING;

 一旦确定了显示模式的具体格式(DXGI_FORMAT),我们就能通过下列代码,获得某个显示输出对此格式所支持的全部显示模式:

void D3DApp::LogOutputDisplayModes(IDXGIOutput*
    output, DXGI_FORMAT format)
{
    UINT count = 0;
    UINT flags = 0;
    // 以nullptr作为参数调用此函数来获取符合条件的显示模式个数
    output->GetDisplayModeList(format, flags, &count, nullptr);
    std::vector<DXGI_MODE_DESC> modeList(count);
    output->GetDisplayModeList(format, flags, &count,
        &modeList[0]);
    for (auto& x : modeList)
    {
        UINT n = x.RefreshRate.Numerator;
        UINT d = x.RefreshRate.Denominator;
        std::wstring text =
            L”Width =+ std::to_wstring(x.Width) + L” ” +
            L”Height =+ std::to_wstring(x.Height) + L” ”
            +
            L”Refresh =+ std::to_wstring(n) + L” /+
            std::to_wstring(d) +
            L”\n”;
        ::OutputDebugString(text.c_str());
    }
}

注: D3DAPP类后续会讲到,这里先写着,暂时不介绍
 在进入全屏模式之时,枚举显示模式就显得尤为重要。为了获得最优的全屏性能,我们所指定的显示模式(包括刷新率)一定要与显示器支持的显示模式完全匹配。根据枚举出来的显示模式进行选定,便可以保证这一点。

11、功能支持的检测

 我们已经通过ID3D12Device::CheckFeatureSupport方法,检测了当前图形驱动对多重采样的支持。然而,这只是此函数对功能支持检测的冰山一角。这个方法的原型为:

#include <winError.h>
#include <minwindef.h>
#include <d3d12.h>

HRESULT ID3D12Device::CheckFeatureSupport(
	D3D12_FEATURE Feature,
	void *pFeatureSupportData,
	UINT fEATUREsUPPORTdATASize
);

 1.Feature:枚举类型D3D12_FEATURE中的成员之一,用于指定我们希望检测的功能支持类型。

D3D12_FEATURE_D3D12_OPTIONS  //检测当前图形驱动对Direct3D 12各种功能的支持情况
D3D12_FEATURE_ARCHITECTURE  //检测图形适配器中GPU的硬件体系架构特性
D3D12_FEATURE_FEATURE_LEVELS  //检测对功能级别的支持情况
D3D12_FEATURE_FORMAT_SUPPORT  //检测对给定纹理格式的支持情况(例,指定的格式能否用于渲染目标?或,指定的格式能否用于混合技术?)
D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS  //检测对多重采样功能的支持情况

 2.pFeatureSupportData:指向某种数据结构的指针,该结构中存有检索到的特定功能支持的信息。此结构体的具体类型取决于Feature参数。

Feature参数指定为D3D12_FEATURE_D3D12_OPTIONS
	传回的是一个D3D12_FEATURE_DATA_D3D12_OPTIONS实例。
Feature参数指定为D3D12_FEATURE_ARCHITECTURE
	传回的是一个D3D12_FEATURE_DATA_ARCHITECTURE实例。
Feature参数指定为D3D12_FEATURE_FEATURE_LEVELS
	传回的是一个D3D12_FEATURE_DATA_FEATURE_LEVELS实例。
Feature参数指定为D3D12_FEATURE_FORMAT_SUPPORT
	传回的是一个D3D12_FEATURE_DATA_FORMAT_SUPPORT实例。
Feature参数指定为D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS
	传回的是一个D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS实例。

 3.FeatureSupportDataSize:传回pFeatureSupportData参数中的数据结构的大小。
 举例,如何对功能级别的支持情况进行检测:

#include <d3d12.h>

typedef struct D3D12_FEATURE_DATA_FEATURE_LEVELS {
	UINT NumFeatureLevels;
	const D3D_FEATURE_LEVEL* pFeatureLevelsRequested;
	D3D_FEATURE_LEVEL MaxSupportedFeatureLevel;
} D3D12_FEATURE_DATA_FEATURE_LEVELS;

D3D_FEATURE_LEVEL featureLevels[3] =
{
	D3D_FEATURE_LEVEL_11_0,  // 首先检测是否支持D3D 11
	D3D_FEATURE_LEVEL_10_0,  // 其次检测是否支持D3D 10
	D3D_FEATURE_LEVEL_9_3    // 最后检测是否支持D3D 9.3
};

int main()
{
	D3D12_FEATURE_DATA_FEATURE_LEVELS featureLevelsInfo;
	featureLevelsInfo.NumFeatureLevels = 3;
	featureLevelsInfo.pFeatureLevelsRequested = featureLevels;
	md3dDevice->CheckFeatureSupport(
		D3D12_FEATURE_FEATURE_LEVELS,
		&featureLevelsInfo,
		sizeof(featureLevelsInfo));
}

注意:
 CheckFeatureSupport方法的第二个参数兼有输入和输出的属性。作为输入的时候,先要指定功能级别数组中元素的个数,再令指针指向功能级别数组,其中应包括我们希望检测的一系列硬件支持功能级别。最后,此函数将用MaxSupportedFeatureLevel字段返回当前硬件可支持的最高功能级别。

12、资源驻留

 复杂的游戏会运用大量纹理和3D网格(3d mesh)等资源,但是其中的大多数并不需要总是置于显存中供GPU使用。
 在Direct3D 12中,应用程序通过控制资源在显存中的去留,主动管理资源的驻留情况。该技术的基本思路为使应用程序占用最小的显存空间。这是因为现存的空间有限,很可能不足以容下整个游戏的所有资源,或者用户还有运行中的程序也在同时使用显存。性能优化提示:程序应当避免在短时间内于显存中交换进出相同的资源,这会引起过高的开销。最理想的情况使,所清出的资源在短时间内不会再次使用。

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

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

相关文章

C# 使用 MailKit 接收邮件(附demo)

C# 使用 MailKit 接收邮件&#xff08;附demo&#xff09; 介绍安装包&#xff08;依赖&#xff09;案例简单代码 获取附件核心代码完整代码 介绍一下POP3 介绍 MailKit 是一个开源的 C# 邮件处理库&#xff0c;用于在应用程序中发送和接收电子邮件。它提供了一个强大且易于使…

linux实时调度

面对陌生的知识体系&#xff0c;应该从什么角度来 简介 一、进程管理基本概念 在单处理器系统上&#xff0c;在给定时刻只有一个程序可以运行&#xff0c;在多处理器系统上&#xff0c;可以真正并行运行的进程数据&#xff0c;取决于物理CPU的数目&#xff1b; 进程优先级 …

jss/css/html 相关的技术栈有哪些?

js 的技术组件有哪些&#xff1f;比如 jQuery vue 等 常见的JavaScript技术组件&#xff1a; jQuery&#xff1a; jQuery是一个快速、小巧且功能丰富的JavaScript库&#xff0c;用于简化DOM操作、事件处理、动画效果等任务。 React&#xff1a; React是由Facebook开发的用于构…

FPGA高端项目:IMX327 MIPI 视频解码 USB3.0 UVC 输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存UVC 时序USB3.0输出架构 6、vivado工程详解FPGA逻辑设计 7、工…

docker 网络模型

一、docker的网络模型分为四种 【1】Host(与宿主机共享一个网络)&#xff0c;宿主机的localhost 及 容器内的localhost 【2】Bridge(与宿主机共享一个局域网&#xff0c;有自己的网络&#xff1b;docker运行默认Bridge)&#xff1b;容器内localhost不是宿主机localhost 【3】…

PyTorch 2.2 中文官方教程(五)

对抗性示例生成 原文&#xff1a;pytorch.org/tutorials/beginner/fgsm_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整的示例代码 作者&#xff1a; Nathan Inkawhich 如果您正在阅读本文&#xff0c;希望您能欣赏一些机器学习…

MySQL | DDL 里 TEXT、JSON 类型字段不设置默认值

JSON、BLOB、TEXT 等类型字段的默认值需要设置为表达式&#xff0c;但在旧版本&#xff08;8.0.13&#xff09;前只支持设置字面量&#xff0c;参考官方文档&#xff1a;MySQL :: MySQL 8.0 Reference Manual :: 11.6 Data Type Default Values。 PS&#xff1a;还有说是考虑减…

【刷题题解】编辑距离

给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 这道题也是&#xff0c;一眼动态规划&#xff0c;乍一看感觉很复杂&#xff0c;仔细思考…

4.0 HDFS 配置与使用

之前提到过的 Hadoop 三种模式&#xff1a;单机模式、伪集群模式和集群模式。 单机模式&#xff1a;Hadoop 仅作为库存在&#xff0c;可以在单计算机上执行 MapReduce 任务&#xff0c;仅用于开发者搭建学习和试验环境。 伪集群模式&#xff1a;此模式 Hadoop 将以守护进程的…

2020年通信工程师初级专业实务真题

文章目录 一、第1章 现代通信网概述&#xff1a;信令网、同步网、管理网。第10章 通信业务&#xff1a;通信产业链&#xff0c;通信终端的分类&#xff0c;通信业务的定义及分类二、第3章 接入网&#xff1a;无线接入网的优点&#xff0c;接入网的接口&#xff08;UNI&#xff…

tar包部署nginx

理论部分 1.基本概念​ Nginx&#xff08;engine x&#xff09;是一个高性能的HTTP和反向代理Web服务器&#xff0c;同时也提供了IMAP、POP3、SMTP服务。中国大陆使用Nginx网站用户有百度、京东、新浪、网易、腾讯、淘宝等。 2.主要用途​ 在连接高并发的情况下&#xff0c;N…

JavaWeb之HTML-CSS --黑马笔记

什么是HTML ? 标记语言&#xff1a;由标签构成的语言。 注意&#xff1a;HTML标签都是预定义好的&#xff0c;HTML代码直接在浏览器中运行&#xff0c;HTML标签由浏览器解析。 什么是CSS ? 开发工具 VS Code --安装文档和安装包都在网盘中 链接&#xff1a;https://p…

全新 鸿蒙系统

一&#xff0c; 开发框架 基础 二&#xff0c; 官网地址 文档开发&#xff1a;华为HarmonyOS智能终端操作系统官网 | 应用设备分布式开发者生态 三&#xff0c;基础了解 鸿蒙系统是基于 js 和 ts 衍生出来的一个东西 要学 arkts 就要学习 js 和 ts 语法 四&#xff0c…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(二)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第三章&#xff1a;分类 在第一章中&#xff0c;我提到最常见的监督学习任务是回归&#xff08;预测值&#xff09;和分类&#…

仓储物流系统架构平台的设计与实践

随着电子商务和供应链管理的迅速发展&#xff0c;仓储物流系统在现代商业中扮演着至关重要的角色。一个高效、稳定的仓储物流系统能够极大地提升企业的运营效率和客户满意度。本篇博客将探讨仓储物流系统架构平台的设计与实践&#xff0c;介绍其核心组成和关键考虑因素。 ### …

[技术杂谈]如何下载vscode历史版本

网站模板&#xff1a; https://code.visualstudio.com/updates/v1_85 如果你想下载1.84系列可以访问https://code.visualstudio.com/updates/v1_84​​​​​​ 然后看到&#xff1a; 选择对应版本下载即可&#xff0c;我是windows x64系统选择x64即可开始下载

开源节点框架STNodeEditor使用

节点&#xff0c;一般都为树形Tree结构&#xff0c;如TreeNode&#xff0c;XmlNode。 树形结构有其关键属性Parent【父节点】&#xff0c;Children【子节点】 LinkedListNode为链表线性结构&#xff0c;有其关键属性Next【下一个】&#xff0c;Previous【上一个】&#xff0c…

零信任实施:计划,执行,一步一步

去年&#xff0c;82% 的网络安全专业人员一直致力于实施零信任&#xff0c;到今年年底&#xff0c;应有 16% 的网络安全专业人员开始实施零信任。 零信任实施的挑战 您可能以前听说过&#xff1a;零信任不是单一产品&#xff0c;而是遵循“从不信任&#xff0c;始终验证”原则…

【Linux】进程间通信 --管道通信

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 0. 进程间通信原理1. 匿名管道1.1 通信原理1.2 接口介绍 2. 命名管道2.1 接口介绍 3. 共享内存3.1 通信原理3.2 接口介绍 0. 进…

Java GC-常见垃圾回收器

目录 前言一、垃圾回收器分类二、垃圾回收器介绍1、Serial 收集器2、ParNew 收集器3、Parallel Scavenge 收集器4、Serial Old 收集器5、Parallel Old 收集器6、CMS 收集器&#xff08;多线程标记清除算法&#xff09;7、G1 收集器 三、项目中垃圾收集器选型 前言 Java的垃圾回…