renderdoc resource manager说明

*写在前面

  1. 只针对renderdoc opengl es 场景进行说明, vukan的没有,不过其实应该也差不多啦,若有必要后面再考虑补上。
  2. 本文使用 文字+图+代码 的方式叙述,若只想了解原理过程,可忽略代码部分,
    由于renderdoc代码还算复杂和乱,代码部分主要是辅助有兴趣阅读源码的同学去抓住代码主要逻辑。
  3. renderdoc 相关名词
  4. 对一帧抓流时,
    1. 开始时机:前一帧swapbuffer时,具体逻辑做在StartFrameCapture()接口;
    2. 结束时机:当前这一帧swapbuffer时,具体逻辑做在EndFrameCapture()接口;
      即,前一帧的结束就是这一帧的开始嘛, 如图:*
      请添加图片描述

what

  1. resource manager, 顾名思义就是renderdoc 用来管理gl资源的,在opengles之上自己做了个状态机, 用来记录gl 资源的使用情况。
  2. gl资源在renderdoc resource manager里边主要由3个结构体来描述,
    GLResource:记录该资源 类型、在opengl es状态机里边的id,如glGenTextures生成的texture值;
    ResourceId:记录该资源在resource manager 里边的id,
    GLResourceRecord:以chunks形式,记录操作该资源的相关gl接口调用,尤其是创建、绑定、属性设置、数据upload,如glGenTextures,glGenBuffers等,一条glXXX用一块chunks记录。
  3. gl resource:
    以下这些在renderdoc都可以描述为资源,基本涵盖所有gl资源了,有点类似于 linux里一切皆文件思想哈哈哈,
enum GLNamespace
{
  eResUnknown = 0,
  eResSpecial,
  eResTexture,
  eResSampler,
  eResFramebuffer,
  eResRenderbuffer,
  eResBuffer,
  eResVertexArray,
  eResShader,
  eResProgram,
  eResProgramPipe,
  eResFeedback,
  eResQuery,
  eResSync,
  eResExternalMemory,
  eResExternalSemaphore,
};

why

  1. 在opengles 之上做了个状态机, 能起到如下作用,
    抓流场景:
    (1)性能、内存优化: BackgroundCapturing时 对于每一块gl resource,记录其数据更新时间(postpone机制)、当前帧是否使用(frame reference机制)、是否dirty(dirty机制),
    当进行真正的抓流ActiveCapturing时,就可以只序列化保存在当前帧使用的资源相关chunks;
    重放场景:
    (1)新旧资源映射: 对于来自opengl状态机的资源id, 抓流序列化时保存下来,
    重放是,需要去创建一个对应的资源,由于id不保证一次,所以需要做一个映射,
    即:origing GLResource <------> live GLResource
    (2) 性能优化:
    抓一帧时,有的资源是在该帧开始前就upload数据到gpu侧的,
    那么需要在每次重放帧开始前,先对该资源gpu侧显存进行初始化,若每次都从磁盘把数据找出来再disk–>cpu–>gpu,太耗性能,
    所以可以在resource manager里边做一个记录: live resource/origing resource <–> initialContents,
    initialContents放在cpu侧内存, 每次重放前做cpu—data—> gpu就ok了。

无论是resource manager本身,还是其里边实现的下面那些frame reference、dirty、persistent、postpone等各种机制,都不是必须的,是对性能和内存的优化,
抓流时也可以都不用,hook后简单粗暴记录下所有gl调用和资源,而随之带来的当然是无论BackgroundCapturing还是ActiveCapturing时的各种卡顿和内存占用过大。

frame reference 机制

  1. what
    标记一帧里边某个资源有被使用
  2. why
    优化内存与性能: 抓流时,该帧没被标记的资源,就不需要保存了。
  3. 相关接口
template <typename Configuration>
void ResourceManager<Configuration>::MarkResourceFrameReferenced(ResourceId id, FrameRefType refType)

//EndFrameCapture 时,序列化frame reference 资源
template <typename Configuration>
void ResourceManager<Configuration>::InsertReferencedChunks(WriteSerialiser &ser)

dirty机制

  1. what
    用 MarkDirtyResource( )标记该资源脏了,用在该资源gpu侧内容被改变时;
    区别于frame reference resource, 用MarkResourceFrameReferenced()标记该帧有使用了该资源
  2. why
    BackgroundCapturing场景,应用每次对资源更新数据时,renderdoc不需要每次都保存,因为实际上抓帧时,只要在这一帧开始前资源的最后一次内容就行了。
    例如对于一块buffer:
//BackgroundCapturing
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffName);
//frame1
glBufferData(GL_ELEMENT_ARRAY_BUFFER, data_size_in_bytes, data1, GL_STATIC_DRAW);
//frame2
glBufferData(GL_ELEMENT_ARRAY_BUFFER, data_size_in_bytes, data2, GL_STATIC_DRAW);
//framen
glBufferData(GL_ELEMENT_ARRAY_BUFFER, data_size_in_bytes, dataN, GL_STATIC_DRAW);

//ActiveCapturing
//frame capture
//对于当前要抓的这一帧,若用到了buffName,那么我们需要保存的就只是dataN的内容, 
//所以对于BackgroundCapturing时更新的数据data1、data2等,只要每次更新数据时做个dirty标记就行,
//表示这块资源dirty,可是没有保存,咱们在抓帧时把他保存下来就行
  1. 相关接口
 void MarkDirtyResource(ResourceId id);
  void MarkDirtyResource(GLResource res)//reference和dirty一起标记了
  void MarkDirtyWithWriteReference(GLResource res)
  
 void MarkVAOReferenced(GLResource res, FrameRefType ref, bool allowFake0 = false);
 void MarkFBOReferenced(GLResource res, FrameRefType ref);
 void MarkFBODirtyWithWriteReference(GLResourceRecord *record);
  1. 使用流程
    1. BackgroundCapturing时,对资源MarkDirtyResource,
    2. 真正抓帧开始前,即StartFrameCapture()里边,做dirty资源的gpu侧拷贝,cpu侧映射(因为要通过cpu侧handle去访问gpu侧资源内容嘛)
    3. 抓帧结束时,即EndFrameCapture()里边,若这些资源在该帧有引用到,从gpu侧拷贝前面备份的资源到cpu,对dirty资源做序列化保存。

相关接口
ActiveCapturing

/*****************StartFrameCapture**********************/
//遍历所有标记为dirty的资源,创建map resource, 即origin resource <----> map resource, 
//gpu侧,origin resource ---data copy---> map resource
template <typename Configuration>
void ResourceManager<Configuration>::PrepareInitialContents()


/*****************EndFrameCapture**********************/
//对每块dirty resource , origin resource ---->取出 map resource,
//map resource ---gpu data----> cpu, 
//cpu 侧对数据序列化,写入rdc文件
template <typename Configuration>
void ResourceManager<Configuration>::InsertInitialContentsChunks(WriteSerialiser &ser)

//序列化保存所有需要初始化的dirty resource,frame reference resource
template <typename Configuration>
void ResourceManager<Configuration>::Serialise_InitialContentsNeeded(WriteSerialiser &ser)

重放

//创建map resource, origin resource <-----> map resource ,
//rdc ---data--> cpu---data---> gpu, gpu侧这边为map resource
//map resourece 在cpu侧以InitContents形式与 origin resource 建立映射
template <typename SerialiserType>
bool GLResourceManager::Serialise_InitialState(SerialiserType &ser, ResourceId id,
                                               GLResourceRecord *record,
                                               const GLInitialContents *initial)
 
 //读出所有需要初始化的resource id, 
 //若此时该origin resource 有对应的live resource, 且还没有创建初始化内容,
 //则做一遍类似上面的事情:
//创建map resource, origin resource <-----> map resource ,
// gpu侧 live resource --data copy---> gpu侧map resource
//map resourece 在cpu侧以InitContents形式与 origin resource 建立映射
template <typename Configuration>
void ResourceManager<Configuration>::CreateInitialContents(ReadSerialiser &ser)
template <typename Configuration>

//每次重放开始时,执行 gpu 侧map resource ---data copy ---> gpu侧 live resource
void ResourceManager<Configuration>::ApplyInitialContents()

共用

  //获取一块 resource的初始化内容
  InitialContentData GetInitialContents(ResourceId id);
  //保存一块resource 的初始化内容
  void SetInitialContents(ResourceId id, InitialContentData contents);

关于抓流的具体过程,欢迎通过 renderdoc抓流过程 讲一步了解~

  1. 判断机制
    有数据更新的gl接口,标记该资源dirty

  2. 数据保存时机与流程
    请添加图片描述
    StartFrameCapture时做了gpu侧数据拷贝;
    EndFramecapture时从gpu拷到cpu,并序列化保存;

  3. 恢复数据时机
    那么,重放时数据的恢复,当然是上面的过程反过来啦
    请添加图片描述

  4. 时序图
    哎,本来不想画这个图的,实在太费时间,可是renderdoc代码写的实在太乱太复杂,还是画下吧方便下次通个这图就能快速理解代码流程

抓流

重放

  1. 相关调用流
    抓流
StartFrameCapture()
-->
PrepareInitialContents();
-->
Prepare_InitialState(GLResource res)
-->
//当前上下文里边做资源在gpu侧的拷贝
ContextPrepare_InitialState()
-->
创建初始化资源存到这,还没有回读与序列化 
m_InitialContents[id].data = contents;

===========================================
EndFrameCapture()
-->
InsertInitialContentsChunks()
-->
Serialise_InitialState()
-->
template <typename SerialiserType>
bool GLResourceManager::Serialise_InitialState(SerialiserType &ser, 
将数据从gpu侧回读并做序列化保存

重放

//数据加载到gpu侧,创建InitialContents
Serialise_InitialState()
-->
//若有live resource,且没有创建InitialContents
//gpu侧拷贝live resource 数据
CreateInitialContents()
-->
    //执行gpu侧数据拷贝
    Create_InitialState()
-->
//每次重放开始时,gpu侧,map resource --data copy--> live resource
ApplyInitialContents()
--> 
    //执行gpu侧数据拷贝
    Apply_InitialState()

persistent 机制

  1. persistent 资源
    创建后就一直常驻的资源,对于gles,为创建后,对其更新了内容,过了3s后还未被销毁的texture、buffer资源;
    即:对于texture、buffer资源,若超过3s,资源才再次更新,也表明资源在此期间没有被销毁,就认为是postpone资源,即非帧内创建的常驻资源;

  2. persistent 规则
    距离上次更新(写)时间操作3s。

  3. 相关接口与数据结构

//texture、buffer资源,更新速度没那么快(大于PERSISTENT_RESOURCE_AGE,即3s外),或者前面没有被引用 
bool HasPersistentAge(ResourceId id);
//texture、buffer资源
virtual bool IsResourceTrackedForPersistency(const WrappedResourceType &res) { return false; }
   
//StartFrameCapture时,对于persistent resource,不需要在prepareInitialContents()时
//先拷贝一份资源出来, 而是可以延迟到写rdc时,
//原因: 因为read only资源?反正内容不会被改变?
//场景:texture、buffer资源,更新速度没那么快(大于PERSISTENT_RESOURCE_AGE,即3s外),或者前面没有被引用 
std::unordered_set<ResourceId> m_PostponedResourceIDs;
  
//资源被引用(写)的时间,只记录最后那次
rdcarray<ResourceRefTimes>  m_ResourceRefTimes;

postpone 机制

  1. why
    为啥要有这个机制?是必须项还是优化项?
    ans: 优化项,减少PrepareInitialContents的资源数目,
    因为这些资源,在当前要抓的这一帧,不一定会用到;
    优化了啥?
    ans:性能,内存

  2. postpone 资源
    针对persistent resources 而言

// During initial resources preparation, persistent resources are
// postponed until serializing to RDC file.
std::unordered_set m_PostponedResourceIDs;

  1. postpone 规则
    若是persistent resource,则postpone处理,等到markFrameRef时才做PrepareInitialContents,
    而不是在StartFrameCapture时做,

  2. 使用场景
    StartFrameCapture时,对于buffer、texture 资源,若距离上次更新时间超过3s了,则也是认为对于一般开发流程来将,当前帧不会再去更新它了,
    认为是postpone资源,则延后到EndFrameCapture处理,
    抓帧过程会不会去处理它

  3. 相关接口与数据结构

bool IsResourcePostponed(ResourceId id);

//返回true情况:
// texture、buffer资源,更新速度没那么快(大于PERSISTENT_RESOURCE_AGE,即3s外),或者前面没有被引用 ,即 对于texture、buffer资源,若超过3s,资源还在,就认为是postpone资源
bool ShouldPostpone(ResourceId id);
template <typename Configuration>

//EndFrameCapture()时, 处理postpone 资源,前面PrepareInitialContents没有处理嘛
//所以需要留到这才处理
void Prepare_InitialStateIfPostponed(ResourceId id, bool midframe);

//gles里边没啥逻辑,应该没有skiped资源,vulkan才有,先忽略
void SkipOrPostponeOrPrepare_InitialState(ResourceId id, FrameRefType refType);

std::unordered_set<ResourceId> m_PostponedResourceIDs;
  
  1. 资源序列化
    与正常序列化流程没啥区别
EndFrameCapture()
-->
    InsertInitialContentsChunks()
--> 
        Prepare_InitialStateIfPostponed()
-->
            Prepare_InitialState()
-->
        Serialise_InitialState()

  1. 资源的恢复
    与正常恢复流程无区别
Serialise_InitialState()
-->
    //从rdc读出数据,创建副本,数据加载到gpu侧副本
    Serialise_InitialState()
-->
    //gpu侧从副本拷贝
    ApplyInitialContents();
  1. why
    性能优化,对于buffer、texture,一些可以不处理的情况,则不处理,
    opengl 目前来说应该是没有一个资源能被skip,因为没有一个eFrameRef_CompleteWriteAndDiscard场景
    vulkan才有,这个可以先不管,
  2. 相关接口
//opengl 目前来说应该是没有一个资源能被skip,因为没有一个eFrameRef_CompleteWriteAndDiscard场景
//vulkan才有,这个可以先不管
template <typename Configuration>
inline bool ResourceManager<Configuration>::ShouldSkip(ResourceId id)

template <typename Configuration>
inline bool ResourceManager<Configuration>::HasSkippableAge(ResourceId id)

//应该是一直为空
// During initial resources preparation, resources that are completely written
// over are skipped
std::unordered_set<ResourceId> m_SkippedResourceIDs;

  1. skip规则
  2. 使用场景

replacement 机制

//TODO

  1. why
  2. 规则
  3. 使用场景
  4. 相关接口

相关数据结构

  1. FrameRefType
    用来对资源的使用做标记
enum FrameRefType
{
  // Initial state, no reads or writes
  eFrameRef_None = 0,

  //标记有对资源做了写操作
  eFrameRef_PartialWrite = 1,

  //标记有对资源做了写操作, 并且后面没有读操作了
  eFrameRef_CompleteWrite = 2,

  //标记对资源做了写操作
  eFrameRef_Read = 3,
  

  //每次重放前都需要重置该资源, 
  //因为使用顺序是read-->write, 可能后面write后又回到前面了嘛
  //先对资源进行了读,又对它进行了写
  eFrameRef_ReadBeforeWrite = 4,

  //使用顺序是write --> read
  //先对资源进行了写,又对他进行了读
  eFrameRef_WriteBeforeRead = 5,

  //目前没用
  eFrameRef_CompleteWriteAndDiscard = 6,

  eFrameRef_Unknown = 1000000000,
};
//用来算新状态的,即老状态+新状态 结果
FrameRefType ComposeFrameRefs(FrameRefType first, FrameRefType second)

以上的资源read、write状态记录, 主要用在开始抓帧时,具体为StartFrameCapture()–>ClearReferencedResources(),判断是否要对被标记的资源做拷贝处理 , StartFrameCapture()细节参考renderdoc 抓流过程

template <typename Configuration>
void ResourceManager<Configuration>::ClearReferencedResources()
{
  SCOPED_LOCK_OPTIONAL(m_Lock, m_Capturing);

  for(auto it = m_FrameReferencedResources.begin(); it != m_FrameReferencedResources.end(); ++it)
  {
    RecordType *record = GetResourceRecord(it->first);

    if(record)
    {
      //这块资源在前面是有被写过的,要标记为dirty,保留
      //可能在后面的帧中有用到时,
      //需要在重放的一开始就去初始化它
      if(IncludesWrite(it->second))
        MarkDirtyResource(it->first);
      record->Delete(this);
    }
  }

  m_FrameReferencedResources.clear();
}
  1. ResourceId
    顾名思义, 标记一块资源的ID

  2. ResourceRecord 、GLResourceRecord
    存用到该资源的相关chunk,关于chunk,参考renderdoc抓流过程;
    以contex为界(可能不同context会共享资源), 对于一块资源,需要记录其被使用的过程,
    ques: 啥样的资源操作接口需要记录到资源自己的record里?
    ans: 资源初始化过程,如texture的创建、绑定、cpu侧upload数据到gup侧、gpu侧数据拷贝、资源属性配置、等,这些都通过chunks存在ResourceRecord里边。
    目的是为了在重放场景,重放开始时,方便取出这些初始化接口,对资源进行初始化。

  3. GLResourceManager
    顾名思义,用来管理资源的,本文章的男主角,所有资源操作管理逻辑都在这里边;
    抓流: 记录当前有哪些资源,有哪些是标记为dirty的,
    重放:管理original resource Id 与 live resource Id的映射,
    主要对资源的标记操作为dirty、frameReflence,
    抓流时,主要需要处理的也是这2类资源

  4. GLInitialContents
    存一块resource的初始化数据

  5. InitialContentDataOrChunk

  6. ResourceRefTimes
    标记该资源最后一次被frame reference的时间,
    capture frame时若距离上次被标记超过3s,则认为是persistent 资源

  7. TextureData
    用来在renderdoc里边描述一块texture的

  8. ResourceDescription
    描述这块资源的初始化需要的chunks id

  9. FBOCache
    记录一块fbo,到底有多少资源attach到其上面

  10. GLNamespace
    标记资源类型,如buffer、texture、shader,program等

  11. GLContextTLSData
    gl context thread share data? 还不太清楚

TIPS

  1. VERBOSE_DIRTY_RESOURCES
    顾名思义,用来debug dirty 机制的开关,打开后可以打印该机制的相关debug log
  2. GLResource 和GLResourceRecord关系
    GLResource描述资源,
    GLResourceRecord记录使用到该资源的相关gl接口,即chunks

FAQ

  1. 对一块texture mark dirty,一条drawcall结束后,把texture删除了,renderdoc怎么处理?
    ANS: 目前看来是没法处理,WrappedOpenGL::glDeleteTextures 把resource record给删了
    不过感觉一般开发代码不会这么写,要么初始化时统一创建,后面统一销毁,
    要么帧内创建与销毁。

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

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

相关文章

文章生成器-免费的文章生成器

随着信息爆炸的时代&#xff0c;自媒体人员不仅需要创造性的策略&#xff0c;还需要快速产生具有高质量文章的能力&#xff0c;这样才能快速响应趋势并保持优势。文章生成器&#xff0c;一款基于人工智能和自然语言处理技术的文本生成软件&#xff0c;可在没有任何人工干预的情…

企业搭建帮助中心的额方式有哪些?

帮助中心对于企业价值的重要性在于提高客户满意度和忠诚度&#xff0c;增强企业品牌形象&#xff0c;促进业务增长和提高利润率。通过提供详细的帮助文档和客户支持&#xff0c;企业可以向客户传达其专业知识和技能&#xff0c;并帮助客户更好地使用其产品或服务。这将提高客户…

C++(Qt)软件调试---使用任务管理器导出Dump(6)

C(Qt)软件调试—使用任务管理器导出Dump&#xff08;6&#xff09; 文章目录C(Qt)软件调试---使用任务管理器导出Dump&#xff08;6&#xff09;1、前言2、软件下载3、使用三款软件导出Dump4、软件下载地址更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f44…

『.NET Tools』在.NET中实现汉字转拼音,只要一个方法就够了!

&#x1f4e3;读完这篇文章里你能收获到 傻瓜式扩展方法直接使用可实现汉字转拼音及汉字转拼音首字母功能感谢点赞收藏&#xff0c;避免下次找不到~ 文章目录一、代码引用Step 1 : 安装包&#xff0c;通过Nuget安装包Step 2 : 代码通过扩展方法/帮助类实现实现汉字转拼音实现汉…

谷粒商城-redis分布式锁系列

1.压力测试出的内存泄漏及解决&#xff08;可跳过&#xff09; 使用jmeter对查询产品分类列表接口进行压力测试&#xff0c;出现了堆外内存溢出异常。 我们设置的虚拟机堆内存100m&#xff0c;并不是堆外内存100m 产生堆外内存溢出&#xff1a;OutOfDirectMemoryError 原因是…

2023.4.3

ctrlf:全局替换 alt鼠标左键&#xff1a;整列编辑 ctrlaltl&#xff1a;格式化 AJAX 简介 概念&#xff1a;AJAX&#xff1a;异步&#xff08;客户端不用等待服务端的反应&#xff09;的Javascript和XML AJAX的作用&#xff1a; 与服务器进行数据交互&#xff1a;通过AJA…

Adaptive AUTOSAR——Execution Management(VRTE 3.0 R21-11)

ChatGPT回答&#xff1a; Adaptive AUTOSAR Execution Management 模块是用于管理软件执行的模块&#xff0c;其主要功能包括&#xff1a; 任务调度&#xff1a;支持对任务进行调度和执行&#xff0c;以实现系统中各个功能的协调运行&#xff1b;软件组件管理&#xff1a;支持对…

python 读取xml从入门到精通

XML &#xff08;Extensible Markup Language&#xff09;&#xff0c;可扩展标记语言&#xff0c;是一种被广泛应用于网络上的文件格式。在互联网上&#xff0c;网页里的信息都以 XML格式存储&#xff0c;例如 HTML、 CSV、 JSON等。随着电子商务的发展&#xff0c;人们需要在…

【面试】Java异常面试题

文章目录Java异常架构与异常关键字Java异常简介Java异常架构1. Throwable2. Error&#xff08;错误&#xff09;3. Exception&#xff08;异常&#xff09;4. 受检异常与非受检异常Java异常关键字Java异常处理声明异常抛出异常捕获异常如何选择异常类型常见异常处理方式直接抛出…

35岁,失业6个月终于接到降薪offer:有面就面,薪酬不限,随机应变说瞎话,对奇葩面试官保持礼貌克制,为拿offer什么都能忍...

被裁后为了生存&#xff0c;人需要做出什么改变&#xff1f;一位35岁网友在失业6个月后终于拿到offer&#xff0c;虽然降薪到四年前的水平&#xff0c;但能继续养家糊口&#xff0c;楼主已经很满意了&#xff0c;并分享了自己的个人经验&#xff1a;1.挖掘历史项目经验&#xf…

为什么ClassPathResource可以读取到流?- 第465篇

历史文章&#xff08;文章累计460&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 S…

68-信号量

文章目录信号量一.什么是信号量二.信号量的接口三.信号量的使用1.思路2.代码3.编译及结果四.ipcs命令信号量 信号量就是控制某个进程能够对某个资源进行访问;保证同一时刻只能由一个进程对 某个资源进程访问; 打印机 一.什么是信号量 信号量是一个特殊的变量&#xff0c;一…

全网最详细的UI自动化测试元素定位方法总结

目录 前言 元素定位概述 常用的元素定位器 元素定位方法 元素定位技巧 总结 前言 UI自动化测试是软件测试中的一个重要环节&#xff0c;它可以通过模拟用户的实际操作&#xff0c;自动化执行UI界面上的测试用例&#xff0c;以提高测试效率和准确性。元素定位是UI自动化测…

卡尔曼滤波浅析

文章目录前言任务状态预测外部影响因素外部不确定性状态更新利用测量进一步修正状态合并两个高斯分布公式汇总图形化解释总结&#xff08;readme&#xff09;references前言 Kalman Filter算法&#xff0c;是一种递推预测滤波算法&#xff0c;算法中涉及到滤波&#xff0c;也涉…

数据更新 | CnOpenData法拍房数据

法拍房数据 一、数据简介 法拍房&#xff0c;即“法院拍卖房产”&#xff0c;是被法院强制执行拍卖的房屋 。当债务人&#xff08;业主&#xff09;无力履行借款合约或无法清偿债务时&#xff0c;而被债权人经司法程序向法院申请强制执行&#xff0c;将债务人名下房屋拍卖&…

sql注入靶场练习

文章目录Less-1Less-2Less-3Less-4Less-5Less-6Less-7Less-8Less-9Less-10Less-11Less-12Less-13Less-14Less-15Less-16Less-17less-18Less-19Less-20Less-1 union没有被过滤&#xff0c;先试出来长度。 ?id1orderby3%23 ?id1orderby4%23到4时&#xff0c;发现 然后再试出来…

JVM与Java体系

JVM体系跟着尚硅谷的康师傅学习 JVM内存与垃圾回收概述 除了大部分的Java开发 人员&#xff0c;除了会在项目中使用到与Java平台相关的框架&#xff0c;与API&#xff0c;对于Java的虚拟机了解甚少。但是也需要我们知道如何处理OOM&#xff0c;SOF异常&#xff0c;除了…

Java实现一个简单的东南西北中的面板

目录 一、前言 二、代码部分 1.代码 三、程序运行结果&#xff08;面板弹出&#xff09; 四、涉及到的知识点代码 一、前言 1.本代码是我在上学时写的&#xff0c;有一些地方没能完美实现&#xff0c;请包涵也请多赐教&#xff01; 2.本弹窗界面可以根据简单的要求进行…

字节跳动CVPR 2023论文精选来啦(内含一批图像生成新研究)

计算机视觉领域三大顶会之一的 CVPR 今年已经开奖啦。 今年的 CVPR 将于六月在加拿大温哥华举办&#xff0c;和往年一样&#xff0c;字节跳动技术团队的同学们收获了不少中选论文&#xff0c;覆盖文本生成图像、语义分割、目标检测、自监督学习等多个领域&#xff0c;其中不少…

Linux 中yum获取的的详细步骤

**1.yum的作用 可以帮我们管理RPM包 可以帮我们安装软件&#xff0c; 如果软件有其他依赖&#xff0c;会帮我们安装依赖后在安装软件 类似于Maven 2.yum命令 search 查询命令或者软件 info 查看包的信息 list / list jdk 查询安装的rpm包&#xff0c;或者只查询某一周 3.更换yu…