OpenGL笔记十之Shader类的封装

OpenGL笔记十之Shader类的封装

—— 2024-07-10 晚上

bilibili赵新政老师的教程看后笔记

code review!

文章目录

  • OpenGL笔记十之Shader类的封装
    • 1.运行
    • 2.目录结构
    • 3.main.cpp
    • 4.application
      • 4.1.CMakeLists.txt
      • 4.2.Application.h
      • 4.3.Application.cpp
    • 5.assets
      • 5.1.shaders:vertex.glsl
      • 5.2.shaders:fragment.glsl
    • 6.glframework
      • 6.1.CMakeLists.txt
      • 6.2.core.h
      • 6.3.shader.h
      • 6.4.shader.cpp
    • 7.wrapper
      • 7.1.CMakeLists.txt
      • 7.2.checkError.h
      • 7.3.checkError.cpp
    • 8.glad.c:略
    • 9.主CMakeLists.txt
    • 10.thirdParty
      • 10.1.glad.h:略
      • 10.2.khrplatform.h:略
    • 11.CMake中的关键使用:拷贝assets文件夹到CMAKE_BINARY_DIR
      • 11.1.代码
      • 11.2.build中可以找到assets

1.运行

在这里插入图片描述

2.目录结构

.
└── 11_OpenGL_ShaderClass├── application│   ├── Application.cpp│   ├── Application.h│   └── CMakeLists.txt├── assets│   └── shaders│       ├── fragment.glsl│       └── vertex.glsl├── CMakeLists.txt├── glad.c├── glframework│   ├── CMakeLists.txt│   ├── core.h│   ├── shader.cpp│   └── shader.h├── main.cpp├── thirdParty│   └── include│       ├── glad│       │   └── glad.h│       └── KHR│           └── khrplatform.h└── wrapper├── checkError.cpp├── checkError.h└── CMakeLists.txt10 directories, 17 files

3.main.cpp

在这里插入图片描述

#include <iostream>#include "glframework/core.h"
#include "glframework/shader.h"
#include <string>
#include <assert.h>//断言
#include "wrapper/checkError.h"
#include "application/Application.h"/*
*┌────────────────────────────────────────────────┐
*│ 目	   标: Shader类编写
*│ 讲    师: 赵新政(Carma Zhao)
*│ 拆分目标:
*│			1 实现Shader文件的读取
*│			2 实现Shader内容的编译链接 
*│			3 实现Shader查错的函数
*└────────────────────────────────────────────────┘
*/GLuint vao;
Shader* shader = nullptr;void OnResize(int width, int height) {GL_CALL(glViewport(0, 0, width, height));std::cout << "OnResize" << std::endl;
}void OnKey(int key, int action, int mods) {std::cout << key << std::endl;
}void prepareVAO() {//1 准备positions colorsfloat positions[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f,};float colors[] = {1.0f, 0.0f,0.0f,0.0f, 1.0f,0.0f,0.0f, 0.0f,1.0f};unsigned int indices[] = {0, 1, 2};//2 VBO创建GLuint posVbo, colorVbo;glGenBuffers(1, &posVbo);glBindBuffer(GL_ARRAY_BUFFER, posVbo);glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);glGenBuffers(1, &colorVbo);glBindBuffer(GL_ARRAY_BUFFER, colorVbo);glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);//3 EBO创建GLuint ebo;glGenBuffers(1, &ebo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//4 VAO创建glGenVertexArrays(1, &vao);glBindVertexArray(vao);//5 绑定vbo ebo 加入属性描述信息//5.1 加入位置属性描述信息glBindBuffer(GL_ARRAY_BUFFER, posVbo);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);//5.2 加入颜色属性描述数据glBindBuffer(GL_ARRAY_BUFFER, colorVbo);glEnableVertexAttribArray(1);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);//5.3 加入ebo到当前的vaoglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBindVertexArray(0);
}void prepareShader() {shader = new Shader("assets/shaders/vertex.glsl","assets/shaders/fragment.glsl");
}void render() {//执行opengl画布清理操作GL_CALL(glClear(GL_COLOR_BUFFER_BIT));//1 绑定当前的programshader->begin();//2 绑定当前的vaoGL_CALL(glBindVertexArray(vao));//3 发出绘制指令glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);glBindVertexArray(0);shader->end();
}int main() {if (!app->init(800, 600)) {return -1;}app->setResizeCallback(OnResize);app->setKeyBoardCallback(OnKey);//设置opengl视口以及清理颜色GL_CALL(glViewport(0, 0, 800, 600));GL_CALL(glClearColor(0.2f, 0.3f, 0.3f, 1.0f));prepareShader();prepareVAO();while (app->update()) {render();}app->destroy();return 0;
}

4.application

4.1.CMakeLists.txt

在这里插入图片描述

#递归将本文件夹下所有cpp放到FUNCS中
file(GLOB_RECURSE APP ./  *.cpp)#将FUNCS中所有cpp编译为funcs这个lib库
add_library(app ${APP} )target_include_directories(app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(app PRIVATE glfw)

4.2.Application.h

在这里插入图片描述

#pragma once /*
*┌────────────────────────────────────────────────┐
*│ 目	   标: 封装Application(表示了当前应用程序本身)
*│ 讲    师: 赵新政(Carma Zhao)
*│ 拆分目标:
*│
*│ 		1	单例类(全局唯一实例)
*│ 		2	成员变量 + 成员函数
*				2.1 成员函数-init(初始化)
*				2.2 成员函数-update(每一帧执行)
*				2.3 成员函数-destroy(结尾执行)
*│ 		3	响应回调函数(Resize)
*				3.1 声明一个函数指针ResizeCallback
*				3.2 声明一个ResizeCallback类型的成员变量
*				3.3 声明一个SetResizeCallback的函数 ,设置窗体变化响应回调函数
*				3.4 声明一个static的静态函数,用于响应glfw窗体变化
*				3.5 将静态函数设置到glfw的监听Resize监听当中
*				3.6 * 学会使用glfw的UserPointer
*│ 		4	响应键盘消息函数(KeyBoard)
*				3.1 声明一个static的静态函数,用于响应glfw的键盘事件
*				3.2 将静态函数设置到glfw的监听KeyCallback监听当中
*				3.3 声明一个函数指针KeyBoardCallback
*				3.4 声明一个KeyBoardCallback类型的成员变量
*				3.5 声明一个SetKeyBoardCallback的函数 ,设置键盘响应回调函数
*				3.6 * 学会使用glfw的UserPointer
*└────────────────────────────────────────────────┘
*/
#include <iostream>#define app Application::getInstance()class GLFWwindow;using ResizeCallback = void(*)(int width, int height);
using KeyBoardCallback = void(*)(int key, int action, int mods);class Application {
public:~Application();//用于访问实例的静态函数static Application* getInstance();bool init(const int& width = 800, const int& height = 600);bool update();void destroy();uint32_t getWidth()const { return mWidth; }uint32_t getHeight()const { return mHeight; }void setResizeCallback(ResizeCallback callback) { mResizeCallback = callback; }void setKeyBoardCallback(KeyBoardCallback callback) { mKeyBoardCallback = callback; }private://C++类内函数指针static void frameBufferSizeCallback(GLFWwindow* window, int width, int height);static void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);private://全局唯一的静态变量实例static Application* mInstance;uint32_t mWidth{ 0 };uint32_t mHeight{ 0 };GLFWwindow* mWindow{ nullptr };ResizeCallback mResizeCallback{ nullptr };KeyBoardCallback mKeyBoardCallback{ nullptr };Application();
};

4.3.Application.cpp

在这里插入图片描述

#include "Application.h"
#include<glad/glad.h>
#include<GLFW/glfw3.h>//初始化Application的静态变量
Application* Application::mInstance = nullptr;
Application* Application::getInstance() {//如果mInstance已经实例化了(new出来了),就直接返回//否则需要先new出来,再返回if (mInstance == nullptr) {mInstance = new Application();}return mInstance;
}Application::Application() {}Application::~Application() {}bool Application::init(const int& width, const int& height) {mWidth = width;mHeight = height;//1 初始化GLFW基本环境glfwInit();//1.1 设置OpenGL主版本号、次版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//1.2 设置OpenGL启用核心模式(非立即渲染模式)glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//2 创建窗体对象mWindow = glfwCreateWindow(mWidth, mHeight, "OpenGLStudy", NULL, NULL);if (mWindow == NULL) {return false;}//**设置当前窗体对象为OpenGL的绘制舞台glfwMakeContextCurrent(mWindow);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {std::cout << "Failed to initialize GLAD" << std::endl;return false;}glfwSetFramebufferSizeCallback(mWindow, frameBufferSizeCallback);//this就是当前全局唯一的Application对象glfwSetWindowUserPointer(mWindow, this);//键盘响应glfwSetKeyCallback(mWindow, keyCallback);return true;
}bool Application::update() {if (glfwWindowShouldClose(mWindow)) {return false;}//接收并分发窗体消息//检查消息队列是否有需要处理的鼠标、键盘等消息//如果有的话就将消息批量处理,清空队列glfwPollEvents();//切换双缓存glfwSwapBuffers(mWindow);return true;
}void Application::destroy() {//退出程序前做相关清理glfwTerminate();
}void Application::frameBufferSizeCallback(GLFWwindow* window, int width, int height) {std::cout << "Resize" << std::endl;Application* self = (Application*)glfwGetWindowUserPointer(window);if (self->mResizeCallback != nullptr) {self->mResizeCallback(width, height);}//if (Application::getInstance()->mResizeCallback != nullptr) {//	Application::getInstance()->mResizeCallback(width, height);//}
}void Application::keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) {Application* self = (Application*)glfwGetWindowUserPointer(window);if (self->mKeyBoardCallback != nullptr) {self->mKeyBoardCallback(key, action, mods);}
}

5.assets

5.1.shaders:vertex.glsl

在这里插入图片描述

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 color;
void main()
{gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);color = aColor;
}

5.2.shaders:fragment.glsl

在这里插入图片描述

#version 330 core
out vec4 FragColor;
in vec3 color;
void main()
{FragColor = vec4(color, 1.0f);
}

6.glframework

6.1.CMakeLists.txt

在这里插入图片描述

file(GLOB_RECURSE FW ./  *.cpp)add_library(fw ${FW} )

6.2.core.h

在这里插入图片描述

#pragma once//注意:glad头文件必须在glfw引用之前引用
#include <glad/glad.h>
#include <GLFW/glfw3.h>

6.3.shader.h

在这里插入图片描述

#pragma once#include "core.h"
#include<string>class Shader {
public:Shader(const char* vertexPath, const char* fragmentPath);~Shader();void begin();//开始使用当前Shadervoid end();//结束使用当前Shaderprivate://shader program//type:COMPILE LINKvoid checkShaderErrors(GLuint target,std::string type);private:GLuint mProgram{ 0 };
};

6.4.shader.cpp

在这里插入图片描述

#include"shader.h"
#include"../wrapper/checkError.h"#include<string>
#include<fstream>
#include<sstream>
#include<iostream>Shader::Shader(const char* vertexPath, const char* fragmentPath) {//声明装入shader代码字符串的两个stringstd::string vertexCode;std::string fragmentCode;//声明用于读取vs跟fs文件的inFileStreamstd::ifstream vShaderFile;std::ifstream fShaderFile;//保证ifstream遇到问题的时候可以抛出异常vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);try {//1 打开文件vShaderFile.open(vertexPath);fShaderFile.open(fragmentPath);//2 将文件输入流当中的字符串输入到stringStream里面std::stringstream vShaderStream, fShaderStream;vShaderStream << vShaderFile.rdbuf();fShaderStream << fShaderFile.rdbuf();//3 关闭文件vShaderFile.close();fShaderFile.close();//4 将字符串从stringStream当中读取出来,转化到code String当中vertexCode = vShaderStream.str();fragmentCode = fShaderStream.str();}catch (std::ifstream::failure& e) {std::cout << "ERROR: Shader File Error: " << e.what() << std::endl;}const char* vertexShaderSource = vertexCode.c_str();const char* fragmentShaderSource = fragmentCode.c_str();//1 创建Shader程序(vs、fs)GLuint vertex, fragment;vertex = glCreateShader(GL_VERTEX_SHADER);fragment = glCreateShader(GL_FRAGMENT_SHADER);//2 为shader程序输入shader代码glShaderSource(vertex, 1, &vertexShaderSource, NULL);glShaderSource(fragment, 1, &fragmentShaderSource, NULL);//3 执行shader代码编译 glCompileShader(vertex);//检查vertex编译结果checkShaderErrors(vertex, "COMPILE");glCompileShader(fragment);//检查fragment编译结果checkShaderErrors(fragment, "COMPILE");//4 创建一个Program壳子mProgram = glCreateProgram();//6 将vs与fs编译好的结果放到program这个壳子里glAttachShader(mProgram, vertex);glAttachShader(mProgram, fragment);//7 执行program的链接操作,形成最终可执行shader程序glLinkProgram(mProgram);//检查链接错误checkShaderErrors(mProgram, "LINK");//清理glDeleteShader(vertex);glDeleteShader(fragment);
}
Shader::~Shader() {}void Shader::begin() {GL_CALL(glUseProgram(mProgram));
}void Shader::end() {GL_CALL(glUseProgram(0));
}void Shader::checkShaderErrors(GLuint target, std::string type) {int success = 0;char infoLog[1024];if (type == "COMPILE") {glGetShaderiv(target, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(target, 1024, NULL, infoLog);std::cout << "Error: SHADER COMPILE ERROR" << "\n" << infoLog << std::endl;}}else if (type == "LINK") {glGetProgramiv(target, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(target, 1024, NULL, infoLog);std::cout << "Error: SHADER LINK ERROR " << "\n" << infoLog << std::endl;}}else {std::cout << "Error: Check shader errors Type is wrong" << std::endl;}
}

7.wrapper

7.1.CMakeLists.txt

在这里插入图片描述

#递归将本文件夹下所有cpp放到FUNCS中
file(GLOB_RECURSE WRAPPER ./  *.cpp)#将FUNCS中所有cpp编译为funcs这个lib库
add_library(wrapper ${WRAPPER} )target_include_directories(wrapper PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(wrapper PRIVATE glfw)

7.2.checkError.h

在这里插入图片描述

#pragma once //预编译宏
#ifdef DEBUG
#define GL_CALL(func)  func;checkError();
#else
#define GL_CALL(func)  func;
#endif void checkError();

7.3.checkError.cpp

在这里插入图片描述

#include "checkError.h"
#include <glad/glad.h>
#include <string>
#include <iostream>
#include <assert.h>void checkError() {GLenum errorCode = glGetError();std::string error = "";if (errorCode != GL_NO_ERROR) {switch (errorCode){case GL_INVALID_ENUM: error = "INVALID_ENUM"; break;case GL_INVALID_VALUE:  error = "INVALID_VALUE"; break;case GL_INVALID_OPERATION: error = "INVALID_OPERATION"; break;case GL_OUT_OF_MEMORY: error = "OUT OF MEMORY"; break;default:error = "UNKNOWN";break;}std::cout << error << std::endl;//assert会根据传入的bool值,来决定程序是否停止//true:程序顺利运行//false:程序会断死assert(false);}
}

8.glad.c:略

9.主CMakeLists.txt

在这里插入图片描述

# 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.12)
add_definitions (-DDEBUG)# 项目名称
project(OpenGL_Lecture)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)file(GLOB ASSETS "./assets" )file(COPY ${ASSETS} DESTINATION ${CMAKE_BINARY_DIR})# 包含头文件目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/thirdParty/include/usr/include
)# 包含库文件目录
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/thirdParty/lib/usr/lib/x86_64-linux-gnu
)# 设置 CMAKE_PREFIX_PATH 以找到 GLFW
set(CMAKE_PREFIX_PATH "/usr/local/lib/cmake/glfw3")
set(GLFW_DIR "/usr/local/lib/cmake/glfw3")# 查找 GLFW3 库
find_package(glfw3 REQUIRED CONFIG)add_subdirectory(wrapper)
add_subdirectory(application)
add_subdirectory(glframework)# 添加可执行文件
add_executable(openglStudy "main.cpp" "glad.c")# 链接库
target_link_libraries(openglStudy glfw wrapper app fw)

10.thirdParty

10.1.glad.h:略

10.2.khrplatform.h:略

11.CMake中的关键使用:拷贝assets文件夹到CMAKE_BINARY_DIR

11.1.代码

file(GLOB ASSETS "./assets" )
file(COPY ${ASSETS} DESTINATION ${CMAKE_BINARY_DIR})

11.2.build中可以找到assets

在这里插入图片描述

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

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

相关文章

【吊打面试官系列-ZooKeeper面试题】简述 Zookeeper 文件系统?

大家好&#xff0c;我是锋哥。今天分享关于 【简述 Zookeeper 文件系统?】面试题&#xff0c;希望对大家有帮助&#xff1b; 简述 Zookeeper 文件系统? Zookeeper 提供一个多层级的节点命名空间&#xff08;节点称为 znode&#xff09;。与文件系统不同的是&#xff0c;这些节…

prometheus+grafana应用监控配置

配置Prometheus 官方地址&#xff1a;Download | Prometheus &#xff08;wegt下载压缩包&#xff0c;解压并重命名prometheus&#xff0c;文件放于/data/prometheus即可&#xff09; 配置 service方法(文件放于 /etc/systemd/system/prometheus.service)&#xff1a; [Unit…

博物馆地图导航系统:高精度地图引擎与AR/VR融合,实现博物馆数字化转型

在人民日益追求精神文化的时代下&#xff0c;博物馆作为传承与展示人类文明的璀璨殿堂&#xff0c;其重要性不言而喻。然而&#xff0c;随着博物馆规模的不断扩大和藏品种类的日益丰富&#xff0c;游客在享受知识盛宴的同时&#xff0c;也面临着“迷路”与“错过”的困扰。博物…

【CUDA】CUDA中缓存机制对计时的影响

笔者在阅读知乎上一个关于CUDA编程的专栏时&#xff0c;发现作者写的很多文章中都会附带计时的模块用于评估程序的运行效率&#xff0c;然而笔者发现&#xff0c;在运行这篇文章中的代码时时&#xff0c;得到的结果和作者的结果有较大差异&#xff0c;主要体现在&#xff1a;使…

前端调试技巧(npm Link,vscode调试,浏览器调试等)

Npm Link 功能&#xff1a; 在本地开发npm模块的时候&#xff0c;我们可以使用npm link命令&#xff0c;将npm 模块链接到对应的运行项目中去&#xff0c;方便地对模块进行调试和测试 断点调试 vscode调试 Debug Vue2 Project 目标&#xff1a;在VSCode中调试项目代码…

巧用 VScode 网页版 IDE 搭建个人笔记知识库!

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 巧用 VScode 网页版 IDE 搭建个人笔记知识库! 描述&#xff1a;最近自己在腾讯云轻量云服务器中部署了一个使用在线 VScode 搭建部署的个人Markdown在线笔记&#xff0c;考虑到在线 VScode 支持终…

[K8S]一、Flink on K8S

Kubernetes | Apache Flink 先编辑好这5个配置文件&#xff0c;然后再直接执行 kubectl create -f ./ kubectl get all kubectl get nodes kubectl get pods kubectl get pod -o wide kubectl get cm -- 获取所有的configmap 配置文件 kubectl logs pod_name -- 查看…

智能汽车域控制器FOTA升级方案探讨

1.概述 本文探讨的OTA升级仅针对运行linux系统的域控制器&#xff0c;升级方式为FOTA&#xff0c;探究升级文件从OTA服务器下载到域控中以后&#xff0c;如何将升级文件安装到存储系统。 为安全起见&#xff0c;支持FOTA升级的存储区域必须支持AB分区设计&#xff0c;每个分区…

浅学三次握手

数据要完成传输&#xff0c;必须要建立连接。由于建立TCP连接的过程需要来回3次&#xff0c;所以&#xff0c;将这个过程形象的叫做三次握手。 结合上面的图来看更清楚。 先说三次握手吧&#xff0c;连接是后续数据传输的基础。就像我们打电话一样&#xff0c;必须保证我和对方…

c++习题10-骑士得到的金币数

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 二&#xff0c;思路 阅读题目之后可以列出如下的数字&#x1f447; 观察上图有如下思路&#xff08;主要是找到规律&#xff09; 给个for循环包裹住需要处理的语句&#xff0c;循环…

k8s快速部署一个网站

1&#xff09;使用Deployment控制器部署镜像&#xff1a; kubectl create deployment web-demo --imagelizhenliang/web-demo:v1 kubectl get deployment,pods[rootk8s-matser ~]# kubectl get pods NAME READY STATUS RESTARTS A…

The Web3 社区 Web3 产品经理课程

概述 / 深耕区块链行业 11 年&#xff0c;和很多产品经理都打过交道&#xff1b;遇到过优秀的产品经理&#xff0c;也遇到过比较拉垮的产品经理。多年工作中&#xff0c;曾在某些团队&#xff0c;承载技术兼产品经理的角色&#xff1b;也参与过很多 Web3 外包项目&#xff0c;包…

【研路导航】成功保研面试:避免迷惑发言,掌握关键表达技巧

更多保研&#xff0c;夏令营&#xff0c;预推免与信息时间节点资讯可以在文章末尾领取&#xff01; 写在前面 在保研面试的过程中&#xff0c;准备充分是成功的关键。每年的夏令营都是竞争激烈的时刻&#xff0c;而如何在面试中展现出最佳的自我&#xff0c;不仅是一场考验&a…

java实战项目-学生管理系统(附带全套源代码及其登录注册功能的实现)--《进阶篇》

一、前言 新增了登录注册的功能&#xff0c;代码量可能会有点大&#xff0c;所有代码加起来差不多560行。这个项目对于小白来说肯定是一大难关了。文章中的每张图都是作者亲手绘制的&#xff0c;简单明了&#xff0c;如果大家认同作者&#xff0c;希望可以支持一下作者。全套源…

elasticsearch 查询超10000的解决方案

前言 默认情况下&#xff0c;Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。 但是我们 在实际工作过程中时常会遇到 需要深度分页&#xff0c;以及查询批量数据更新的情况 问题&#xff1a;当请求form size >10000 时&#xff0c…

【从0到1进阶Redis】主从复制 — 主从机宕机测试

上一篇&#xff1a;【从0到1进阶Redis】主从复制 测试&#xff1a;主机断开连接&#xff0c;从机依旧连接到主机的&#xff0c;但是没有写操作&#xff0c;这个时候&#xff0c;主机如果回来了&#xff0c;从机依旧可以直接获取到主机写的信息。 如果是使用命令行&#xff0c;来…

制作显卡版docker并配置TensorTR环境

感谢阅读 相关概念docker准备下载一个自己电脑cuda匹配的docker镜像拉取以及启动镜像安装cudaTensorRT部署教程 相关概念 TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个模型推理框架&#xff0c;支持C和Python推理。即我们利用Pytorch&#xff0c;Tensorflow或者其它框架…

电影购票小程序论文(设计)开题报告

一、课题的背景和意义 随着互联网技术的不断发展&#xff0c;人们对于购票的需求也越来越高。传统的购票方式存在着排队时间长、购票流程繁琐等问题&#xff0c;而网上购票则能够有效地解决这些问题。电影购票小程序是网上购票的一种新型应用&#xff0c;它能够让用户随时随地…

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…

自适应大气简约健康实木地板生产企业网站模板源码 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;企业的在线形象直接关联到其市场竞争力。对于专注于生产高品质、健康环保实木地板的企业而言&#xff0c;一个专业、大气且能完美展示产品特色的官方网站尤为重要。为了满足这一需求&#xff0c;我们精心打造了一款“自适应大气简约健康…