在Visutal Studio 2022中完成D3D12初始化

在Visutal Studio 2022中完成DirectX设备初始化

  • 1 DirectX12
    • 1.1 DirectX 简介
    • 1.2 DirectX SDK安装
  • 2 D3D12初始化
    • 2.1 创建Windwos桌面项目
    • 2.2 修改符合模式
    • 2.3 下载d3dx12.h文件
    • 2.4 创建一个异常类D3DException,定义抛出异常实例的宏ThrowIfFailed
  • 3 D3D12的初始化步骤
    • 3.1 初始化前的准备
      • 3.1.1 增加头文件的引用:
      • 3.1.2 引用Direct3D库文件、IDXGI库文件
      • 3.1.5 增加InitDirect3D函数
      • 3.1.6 启用D3D12的调试层
    • 3.2 创建Direct3D设备
      • 3.2.1 增加IDXGIFactory和ID3D12Device两个全局的COM对象智能指针
      • 3.2.2 创建一个D3D12设备
      • 3.2.3 如果创建主显示适配器失败,使用WARP软件适配器
    • 3.3 创建围栏
      • 3.3.1 增加全局围栏和描述符变量
      • 3.3.2 创建D3D12围栏
      • 3.3.3 我们来了解下资源与描述符
    • 3.4 检测对4X MSAA 质量级别的支持
      • 3.4.1 增加全局资源数据格式和4X MASS质量级别变量
    • 3.5 检测支持的D3D最高版本
    • 3.6 创建命令队列和列表
      • 3.6.1 增加全局变量
      • 3.6.2 创建命令队列和命令列表
    • 3.7 描述并创建交换链
      • 3.7.1 创建全局变量
      • 3.7.2 描述并创建交换链
      • 3.7.3 处理CPU和GPU的同步
    • 3.8 创建描述符堆
      • 3.8.1 增加全局变量
      • 3.8.2 创建描述符堆
    • 3.9 创建渲染目标视图
      • 3.9.1 增加全局变量
      • 3.9.2 调整后台缓冲区的大小,并为它创建渲染目标视图 / 描述符
    • 3.9 创建深度/模板缓冲区及其视图
    • 3.10 设置视口和裁剪矩形
  • 4 完整代码
  • 错误:“&”要求左值
  • 错误:D3D12GetDebugInterface: This method requires the D3D12 SDK Layers for Windows 10, but they are not present on the system.。

1 DirectX12

1.1 DirectX 简介

DirectX 是 Windows 中的一组组件,允许游戏、软件直接与视频和音频硬件结合使用。 使用 DirectX的游戏可以更有效地使用内置于硬件的多媒体加速器功能,从而改善整体的多媒体体验。

1.2 DirectX SDK安装

  • 方法1,通过Windows 10 SDK安装,官网下载最新版本:Windows SDK
    在这里插入图片描述
  • 方法2,通过VS安装,做为一个开发人员,我更喜欢这种方式
    在这里插入图片描述
    安装完成后,我们可以了解下DirectX SDK头文件目录和库文件目录。
    头文件目录:
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um

库文件目录 :

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64

(注意:10.0.19041.0是我电脑上面的版本,大家的可能不一样)

2 D3D12初始化

有了开发环境,我们来完成D3D12初始化。

2.1 创建Windwos桌面项目

我们创建一个Windwos桌面项目,从头开始学习D3D11的初始化过程。
打开Visutal Studio 2022,选择菜单:文件->新建->项目,创建新项目。选择C++类型,输入 Windows桌面向导 进行筛选,在结果中选择“Windows桌面向导”,点击下一步。
在这里插入图片描述
配置项目名称和地址,点击创建
在这里插入图片描述
在弹出来的对话框中选择“桌面应用程序(.exe)”,勾选 “空项目”,点击确定建建一个空的Windwos桌面项目。
我这里没有勾选“空项目”,主要是偷懒不想写注册窗口和消息处理。
在这里插入图片描述

2.2 修改符合模式

创建项目后在项目属性找c/c++,找到语言,找到符合模式选否。不改碰到错误时再改也行。
在这里插入图片描述

2.3 下载d3dx12.h文件

打开官方github上面的d3dx12.h文件,把里面的代码拷贝下来。在工程解决方案里创建一个叫DXUtils的文件夹,在这个文件夹下新建一个d3dx12.h文件,把内容放在里面。
这个文件里面是官方写好的一些辅助结构体,不属于DirectX 12 SDK的核心部分,但是可以通过微软官方网站下载获得,方便我们后面开发。
以CD3DX12作为前缀的结构体全都定义在d3dx12.h头文件当中。

2.4 创建一个异常类D3DException,定义抛出异常实例的宏ThrowIfFailed

#pragma once

#include <windows.h>	// Windows 头文件
#include<string>        // 提供wsring类,在Windows平台上应该使用wstring和wchar_t

// 定义异常类
class D3DException
{
   
public:
    D3DException() = default;
    // 显示:异常函数的返回值、函数名、代码所处文件名,所处代码行数
    D3DException(HRESULT hr, const std::wstring& functionName, const std::wstring& filename, int lineNumber)
    {
   
        ErrorCode = hr;
        FunctionName = functionName;
        Filename = filename;
        LineNumber = lineNumber;
    }

    std::wstring ToString()const;

    HRESULT ErrorCode = S_OK;
    std::wstring FunctionName;
    std::wstring Filename;
    int LineNumber = -1;
};

// AnsiToWString函数(将字符串映射到 UTF-16 (宽字符) 字符串)
inline std::wstring AnsiToWString(const std::string& str)
{
   
    WCHAR buffer[512];
    MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, buffer, 512);
    return std::wstring(buffer);
}

// 如果发生异常,抛出一个异常实例
#ifndef ThrowIfFailed
#define ThrowIfFailed(x)                                              \
{
                                                                          \
    HRESULT hr__ = (x);                                               \
    std::wstring wfn = AnsiToWString(__FILE__);                       \
    if(FAILED(hr__)) {
      throw D3DException(hr__, L#x, wfn, __LINE__); } \
}
#endif

3 D3D12的初始化步骤

准备工作做发了,下面我们就来完成D3D12的初始化

要初始化D3D12,首先需要创建D3D12设备(ID3D12Device)。我们可以通过该ID3D12Device与硬件进行交互,命令硬件完成一些工作(比如:在显存中分配资源、清空后台缓冲区、将资源绑定到各种管线阶段、绘制几何体)。具体而言:

接口 说明
ID3D12Device 代表着一个显示适配器,显示适配器一般指3D图形硬件即显卡。显示适配器也可以用软件通过模拟硬件显卡的计算处理过程来代替,软件也可以作为适配器(如WARP适配器)。
  • Direct3D设备既可以检测系统环境对功能的支持情况,又能创建所有其他的Direct3D接口对象(如资源、视图和命令列表)。
  • 创建Direct3D设备使用函数D3D12CreateDevice。

现在我们开始在MyD3DApp.cpp中来增加设备的初始化。

3.1 初始化前的准备

3.1.1 增加头文件的引用:

#include<wrl.h>         // 提供了ComPtr类,它是COM对象的智能指针,使我们无需手动Release
#include<d3d12.h>       // Direct3D12头文件,ID3D12开头类型始于此
#include<dxgi1_4.h>     // DirectX图形基础设施头文件,IDXGI开头类型始于此
#include<string>        // 提供wsring类,在Windows平台上应该使用wstring和wchar_t
#include<assert.h>
#include "DXUtils/d3dx12.h"

3.1.2 引用Direct3D库文件、IDXGI库文件

// 引用Direct3D库文件
#pragma comment (lib, "d3d12.lib")
// 引用IDXGI库文件
#pragma comment (lib, "dxgi.lib")

增加使用Windows运行时库(Windows Runtime Library,WRL)为COM对象提供的COM对象的智能指针Microsoft::WRL::ComPtr类的命名空间。

using namespace Microsoft::WRL; // 方便使用Microsoft::WRL::ComPtr类   

3.1.5 增加InitDirect3D函数

// 初始化Direct3D
bool InitDirect3D()
{
   
}

除了全局变量,后面的代码都在InitDirect3D中增加

3.1.6 启用D3D12的调试层

#if defined(DEBUG) || defined(_DEBUG) 
    // 如果在Debug模式,启用D3D12的调试层,
    // 启用调试后,D3D会在错误发生时向VC++的输出窗口发送调试信息
    {
   
        ComPtr<ID3D12Debug> debugController;
        ThrowIfFailed(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)));
        debugController->EnableDebugLayer();
    }
#endif

3.2 创建Direct3D设备

3.2.1 增加IDXGIFactory和ID3D12Device两个全局的COM对象智能指针

// IDXGIFactory: DXGI中最关键的接口之一,可以枚举显示适配器
ComPtr<IDXGIFactory4> mdxgiFactory;

// ID3D12Device: 代表一个显示适配器(显卡)
ComPtr<ID3D12Device> md3dDevice;
  • D3D12Device 就是Direct3D中用于提供显卡控制接口的对象,它代表着当前系统中的显示适配器。一般来说,它是一个3D图形硬件(如显卡), 但是,操作系统在没有显卡的时候也能正常的显示图像,这时候使用的就是软件显示适配器,如(WARP适配器)
  • 获取显示适配器
    显示适配器是真正实现了图形处理能力的对象,上面的D3D12Device是对显示适配器的进一步封装。
    这是我系统中的显示适配器
    在这里插入图片描述
    那么在程序中我们怎么才能知道使用的是哪个适配器呢,毕竟游戏的使用性能较高的适配较好。
  • 我们了解下DXGI的概念。
    DXGI是一种与Direct3D配合使用的API,设计DXGI的基本理念是使得多种图形API中的底层任务能够使用通用的API,比如3D和2D的图形API在底层都可以使用相同的,比如Direct3D和Direct2D内部实现交换链时可以使用同一套接口。
    我们在获取系统的可用显示适配器时,会使用到 IDXGIFactory,主要用于创建SwapChain以及枚举显示适配器
    后面的代码会使用IDXGIFactory4来枚举系统中的显示适配器

3.2.2 创建一个D3D12设备

    // 创建可用于生成其他 DXGI 对象的 DXGI 1.0 Factory
    ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&mdxgiFactory)));

    // 创建一个D3D硬件适配器
    // D3D12CreateDevice参数为:(适配器指针,应用程序所需最低功能级别,所建ID3D12Device接口的COM ID)
    // 返回所创建的D3D12设备
    HRESULT hardwareResult = D3D12CreateDevice(
        nullptr,                   // 适配器指针,创建设备时用的显示适配器,适配器指针传入nullptr表示使用主显示适配器
        D3D_FEATURE_LEVEL_12_0,    // 应用程序需要硬件支持的最低功能级别
        IID_PPV_ARGS(&md3dDevice));// IID_PPV_ARGS是Direct3D为我们提供的一个工具宏,它为我们生成了接口中的后两个参数

IID_PPV_ARGS宏会展开为两项,第一项根据__uuidof获取了COM对象的ID(全局唯一标识符,GUID),IID_PPV_ARGS辅助函数本质是把指针强制转换为void类型

3.2.3 如果创建主显示适配器失败,使用WARP软件适配器

    // 创建主显示适配器失败,使用WARP软件适配器
    if (FAILED(hardwareResult))
    {
   
        ComPtr<IDXGIAdapter> pWarpAdapter;
        ThrowIfFailed(mdxgiFactory->EnumWarpAdapter(IID_PPV_ARGS(&pWarpAdapter)));

        // 不同windows版本的WARP最高支持的功能级别也不同
        // 再次创建D3D设备时,仅适配器指针参数不同,传入WARP适配器指针
        ThrowIfFailed(D3D12CreateDevice(
            pWarpAdapter.Get(),
            D3D_FEATURE_LEVEL_12_0,
            IID_PPV_ARGS(&md3dDevice)
        ));
    }

3.3 创建围栏

CPU和GPU的同步需要使用到围栏,第一步中我们创建好设备,第二步就可以创建围栏了。
另外,如果使用描述符进行工作,需要获取描述符的大小。描述符在不同GPU平台上的大小不同,因此我们需要将获取的描述符大小信息缓存起来,方便需要时直接引用。

3.3.1 增加全局围栏和描述符变量

// ID3D12Fence: 表示围栏
ComPtr<ID3D12Fence> mFence;

// RTV描述符大小,RTV描述符: 渲染目标视图资源
UINT mRtvDescriptorSize = 0;
// DSV描述符大小,DSV描述符: 深度/模板视图资源
UINT mDsvDescriptorSize = 0;
// CbvSrvUav描述符大小,CBV描述符: 常量缓冲区视图资源...
UINT mCbvSrvUavDescriptorSize = 0;

3.3.2 创建D3D12围栏

bool CreateD3DFence()
{
   
    // 创建围栏
    ThrowIfFailed(md3dDevice->CreateFence(
        0,
        D3D12_FENCE_FLAG_NONE,
        IID_PPV_ARGS(&mFence)
    ));

    // 获取描述符大小
    mRtvDescriptorSize = md3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
    mDsvDescriptorSize = md3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV);
    mCbvSrvUavDescriptorSize = md3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
}

可以看到新出现的四个变量都是通过 md3dDevice 对象获取到的,这说明:
 1. Direct3D12 设备对象能创建所有其他的Direct3D接口对象。
 2. COM对象需要使用特定方法或通过其他COM对象的方法获取。

3.3.3 我们来了解下资源与描述符

  • 在渲染过程中,GPU需要对资源进行读和写。但是GPU和资源并不是直接绑定的,而是通过一个中间角色 “描述符”来进行绑定的。
  • 描述符是一种对送往GPU的资源进行描述的轻量级结构,它是一个中间层。当GPU需要对资源进行读或写时,GPU就会问描述符:资源在哪里,我应该按照哪种数据格式进行读写。
  • 描述符的作用有两点:
     1. 指定资源数据。
     2. 为GPU解释资源信息。
  • 创建资源时可用无类型格式,如DXGI_FORMAT_R8G8B8A8_TYPELESS类型,它是4个分量组成,每个分量占8个位。如果某个资源在创建时采用了无类型格式,那么在为它创建描述符时必须指明其具体类型。
  • 注意:视图和描述符的含义是等价的。
  • 每个描述符都有一种具体类型,用来明确资源的具体作用,常用的描述符如下:
描述符 说明
CBV 常量缓冲区视图
SRV 着色器资源视图
UAV 无序访问视图
sampler 采样器资源描述符
RTV 渲染目标视图资源
DSV 深度/模板视图资源
  • 描述符堆中存有一系列描述符,本质上是存放用户程序中某特定类型描述符的一块内存。我们需要为每一种类型的描述符创建出单独的描述符,当然同一种描述符也可以创建多个描述符堆。
  • 我们可以用不同的描述符来描述同一个资源,达到以不同的数据格式或内容部分去读写资源的目的。
  • 由于创建描述符的过程中需要执行一些类型的检测和验证工作,最好不要在运行时才创建描述符,创建描述符的最佳时机为初始化期间。
  • 当然有时确实需要使用无类型资源所带来的灵活性,此时在一定限度内,可以考虑在运行时创建描述符。

3.4 检测对4X MSAA 质量级别的支持

我们要使用4X MSAA,之所以选择4X,是因为借助此采样数量就可以获取开销不高但性能非凡的效果。而使用4X MSAA之前,我们要先检查设备是否支持4X MSAA 质量级别的图像。

3.4.1 增加全局资源数据格式和4X MASS质量级别变量

void Check4XMSAA()
{
   
    // DXGI_FORMAT: 资源数据的格式,一种枚举类型 
    DXGI_FORMAT mBackBufferFormat = DXGI_FORMAT_R8G8B8A8_UNORM;

    // 检测对4X MASS质量级别的支持
    D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS msQualityLevels;

    msQualityLevels.Format = mBackBufferFormat;                         // 纹理格式
    msQualityLevels.SampleCount = 4;                                    // 采样次数
    msQualityLevels.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE; // 默认选项
    msQualityLevels.NumQualityLevels = 0;                               // 质量级别

    // 使用ID3D12Device::CheckFeatureSupport函数,查询我们设置的这种图像质量的级别
    ThrowIfFailed(md3dDevice->CheckFeatureSupport(
        D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊中小企业如何开展持续交付

持续交付的定义&#xff1a; 持续交付&#xff08;Continuous Delivery&#xff0c;简称CD&#xff09;是一种软件工程实践&#xff0c;旨在让软件产品的产出过程在一个短周期内完成&#xff0c;以保证软件可以稳定、持续地保持在随时可以发布的状况。它的核心目标在于加快软件…

C++函数调用运算符、函数调用对象和包装器详细介绍与总结

函数调用运算符 A.What&#xff08;函数对象&#xff09; 如果类定义了函数调用运算符&#xff0c;则该类的对象称为函数对象 B.Which&#xff08;有哪些可调用函数对象&#xff09; 函数 函数指针 lambd函数对象 bind创建的对象 重载了函数调用符的类对象 C.函数对象lambda l…

NVIDIA良心给显卡免费升级,只为挨更多的骂

起猛了&#xff0c;还真的以为 NVIDIA 良心发现了。 众所周知&#xff0c;英伟达对于咱们普通游戏玩家向来不屑一顾。只因为游戏业务在 NVIDIA 收入中占比较少。 在最新的 40 系显卡 RTX 4070 Ti Super 显卡中&#xff0c;NVIDIA悄悄给它来了一次核心「升级」&#xff0c;将原…

PLC数据采集网关的具体使用说明-天拓四方

PLC数据采集网关通过以太网、串口等通信接口与PLC设备连接&#xff0c;实现数据的实时采集。网关内置数据处理模块&#xff0c;可以对采集到的数据进行清洗、转换和存储&#xff0c;以满足不同应用场景的需求。同时&#xff0c;PLC数据采集网关支持多种通信协议&#xff0c;如M…

伦敦银看盘一般看什么 这3样东西不能缺少

伦敦银看盘&#xff0c;是指伦敦银市场开市之后&#xff0c;投资者打开走势图表&#xff0c;观察盘面行情和盘口信息的过程。一般来说&#xff0c;懂得看盘的人可能会被贴上专业的标签&#xff0c;我们在各种影视作品中看到&#xff0c;那些华尔街的交易员坐在电脑面前&#xf…

【密码学】大整数分解问题和离散对数问题

公钥密码体制的主要思想是通过一种非对称性&#xff0c;即正向计算简单&#xff0c;逆向计算复杂的加密算法设计&#xff0c;来解决安全通信。本文介绍两种在密码学领域内最为人所熟知、应用最为广泛的数学难题——大整数分解问题与离散对数问题 一、大整数分解问题 &#xf…

《算法笔记》总结No.6——贪心

一.简单贪心 贪心法是求解一类最优化问题的方法&#xff0c;它总是考虑在当前状态下局部最优(或较优)之后&#xff0c;来使全局的结果达到最优(或较优)的策略。显然&#xff0c;如果采取较优而非最优的策略(最优策略可能不存在或是不易想到)&#xff0c;得到的全局结果也无法是…

体验完这款售价29999元起苹果新品,我大受震撼

讲道理&#xff0c;数码圈已经很久没有出现过让人耳目一新的产品了。 整个圈子近些年各家新品逻辑给我的一种感觉是普遍主打循规循距&#xff0c;用高情商话来说那叫稳扎稳打不易出错&#xff0c;而低情商嘛&#xff0c;说白了叫创新精神严重缺失。 「科技最后以换皮为准」这…

客户案例|某大型证券公司数据库运维场景数据安全实践

证券行业涉及股票、债券、基金等金融产品的发行、交易和监管&#xff0c;业务具有数据规模大、数据价值高、数据应用场景复杂的显著特点&#xff0c;其中高速流转的业务系统中含有海量的客户个人信息、交易、行情、咨询等高敏感高价值信息。由于证券期货业务场景所具有的特殊性…

光伏仿真系统:智能踏勘与专业设计

在当今全球能源转型的大背景下&#xff0c;光伏行业作为绿色能源的重要组成部分&#xff0c;其智能化、数字化的发展显得尤为关键。鹧鸪云智能光伏业务管理系统&#xff0c;以其强大的智能踏勘与专业设计功能&#xff0c;为光伏项目的开发与管理提供了全面的解决方案&#xff0…

1.10编程基础之简单排序--02:奇数单增序列

OpenJudge - 02:奇数单增序列http://noi.openjudge.cn/ch0110/02/ 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。 输入 共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。 输出 增序输出的奇数序列,数据之间以逗号间隔。数…

Spring Cloud LoadBalancer 入门与实战

一、什么是 LoadBalancer? LoadBalancer(负载均衡器) 是一种网络设备或软件机制&#xff0c;用于分发传入的网络流量负载&#xff08;请求&#xff09;到多个后端目标服务器上&#xff0c;从而实现系统资源的均衡利用和提高系统的可用性和新能。 1.1 负载均衡分类 负载均衡…

解决打印PDF文本不清楚的处理办法

之前打印PDF格式的电子书&#xff0c;不清晰&#xff0c;影响看书的心情&#xff0c;有时看到打印的书的质量&#xff0c;根本不想看&#xff0c;今天在打印一本页数不多&#xff0c;但PDF格式的书感觉也不太清楚&#xff0c;我想应该有办法解决&#xff0c;我使用的是解决福昕…

FPGA程序设计

在设计FPGA时&#xff0c;多运用模块化的思想取设计模块&#xff0c;将某一功能设计成module。 设计之前要先画一下模块设计图&#xff0c;列出输入输出接口&#xff0c;再进一步设计内部功能。 状态机要画图&#xff0c;确定每个状态和状态之间怎么切换。状态用localparam定…

东方通Tongweb发布vue前端

一、前端包中添加文件 1、解压vue打包文件 以dist.zip为例&#xff0c;解压之后得到dist文件夹&#xff0c;进入dist文件夹&#xff0c;新建WEB-INF文件夹&#xff0c;进入WEB-INF文件夹&#xff0c;新建web.xml文件&#xff0c; 打开web.xml文件&#xff0c;输入以下内容 …

开启HIVE中分区表支持中文字段

进入hive表&#xff1a; use hive; #修改hive database编码 alter database hive default character set utf8; #修改table编码 alter table PARTITIONS default character set utf8; alter table PARTITION_KEY_VALS default character set utf8; alter table SDS default cha…

泛型

背景 优点 类型绝对安全避免强制类型转换 泛型类 定义 使用 举例 泛型类 // 泛型类 T就是类型参数 public class Generic<T>{// key这个成员变量的类型为T,T的类型由外部指定private T t;public void set(T t){this.t t;}public T get(){return t;} }使用 // 创建一个泛…

前端JS特效第28集:JQuery电影选座插件

JQuery电影选座插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">&l…

ch552g中使用SPI进行主从机通信时发现的问题

参考 基本硬件准备 两块独立的ch552g的板子&#xff0c;开始连接时数据传输出现数据错误&#xff0c;本来猜想是通信线连接问题&#xff0c;后来用了较短的连接线依然没有改善。 SPI通信的认知 SPI一般都是全双工实时通信&#xff0c;所以在发送数据时一般有短暂的停留使得…

【测试开发】--安全渗透测试

1. 安全渗透 1.1 分类 web数据库安全web应用服务器安全&#xff08;文件上传漏洞、文件包含漏洞&#xff09;web客户端安全&#xff08;XSS跨站攻击&#xff09; 2. sql注入 2.1 sql注入介绍 sql注入在安全问题中排行榜首sql注入攻击是输入参数未经过滤&#xff0c;然后直…