深入解析C++游戏开发:从基础到高级应用

目录

深入解析C++游戏开发:从基础到高级应用

目录

为何选择C++进行游戏开发

高性能与高效率

强大的内存管理

广泛的库和框架支持

丰富的社区资源

C++游戏开发基础

C++基础知识

面向对象编程

常用设计模式

游戏开发流程

设计与规划

选择引擎和工具

架构设计

图形与物理引擎集成

性能优化与调试

测试与发布

关键技术详解

图形渲染

物理引擎

人工智能

网络编程

常用C++游戏开发库与引擎

引擎选择建议

实战示例:创建一个简单的C++游戏

环境准备

示例代码

代码说明

编译与运行

学习资源与社区支持

在线教程与课程

开发者社区

论坛与讨论组

开源项目

结语

参考资料


深入解析C++游戏开发:从基础到高级应用

在游戏产业飞速发展的今天,C++凭借其卓越的性能和强大的控制能力,成为众多游戏开发者的首选语言。无论是大型3A游戏,还是独立小游戏,C++都发挥着不可替代的作用。本文将全面探讨C++在游戏开发中的应用,从基础知识到高级技巧,辅以代码示例和表格,帮助您深入了解并掌握C++游戏开发。

为何选择C++进行游戏开发

高性能与高效率

C++以其接近硬件的操作能力和高效的执行速度著称。在游戏开发中,性能往往是决定用户体验的关键因素。C++的高效性使其能够处理复杂的图形渲染、大量的物理计算以及实时的游戏逻辑,确保游戏运行流畅。

强大的内存管理

游戏开发需要精细的内存管理,以优化资源的使用和提升性能。C++提供了手动内存管理的能力,允许开发者根据需求分配和释放内存,避免不必要的开销。此外,智能指针等现代C++特性进一步简化了内存管理,减少了内存泄漏和其他相关问题的风险。

广泛的库和框架支持

C++拥有丰富的游戏开发库和框架,如Unreal Engine、Cocos2d-x、SDL等。这些工具不仅提供了强大的功能支持,还拥有活跃的社区和丰富的文档资源,帮助开发者快速上手并解决开发中的问题。

丰富的社区资源

C++作为一种成熟的编程语言,拥有庞大的开发者社区。无论是遇到技术难题还是寻找最佳实践,开发者都能在社区中找到帮助和支持。

C++游戏开发基础

C++基础知识

在开始游戏开发之前,掌握C++的基础知识是必不可少的。以下是一些关键概念:

  • 变量与数据类型:了解基本的数据类型(如int, float, double, char)以及如何声明和使用变量。
  • 控制结构:掌握条件语句(if, switch)和循环结构(for, while, do-while)。
  • 函数:理解函数的定义、调用以及参数传递。
  • 指针与引用:熟悉指针的使用及其在内存管理中的应用。
  • 类与对象:掌握面向对象编程的基本概念,包括类的定义、继承、多态等。

面向对象编程

面向对象编程(OOP)是C++的重要特性,通过类和对象的概念,实现代码的模块化和复用性。在游戏开发中,OOP有助于管理复杂的游戏对象和逻辑,如角色、道具、关卡等。

// 示例:定义一个游戏角色类
class Character {
public:// 构造函数Character(std::string name, int health): name(name), health(health) {}// 成员函数void takeDamage(int damage) {health -= damage;if (health < 0) health = 0;}void displayStatus() const {std::cout << "Character: " << name << ", Health: " << health << std::endl;}private:std::string name;int health;
};int main() {Character hero("Hero", 100);hero.displayStatus();hero.takeDamage(25);hero.displayStatus();return 0;
}

常用设计模式

设计模式是解决特定问题的通用方案。在游戏开发中,常用的设计模式包括:

设计模式描述适用场景
单例模式(Singleton)确保类只有一个实例,并提供全局访问点游戏管理器、资源管理器
工厂模式(Factory)定义一个创建对象的接口,让子类决定实例化哪一个类生成不同类型的游戏对象
观察者模式(Observer)定义对象之间的一对多依赖关系,状态变化时通知所有依赖者事件系统、UI更新
状态模式(State)允许对象在内部状态改变时改变其行为AI状态管理、游戏状态管理

单例模式示例:

 
class GameManager {
public:static GameManager& getInstance() {static GameManager instance;return instance;}void startGame() {std::cout << "Game Started!" << std::endl;}private:// 构造函数私有化GameManager() {}// 禁止拷贝GameManager(const GameManager&) = delete;GameManager& operator=(const GameManager&) = delete;
};int main() {GameManager::getInstance().startGame();return 0;
}

游戏开发流程

设计与规划

在编写代码之前,明确游戏的核心玩法、故事情节、角色设定和美术风格是至关重要的。详细的设计文档能够指导开发过程,确保团队成员之间的协作高效且有序。

选择引擎和工具

根据游戏的需求和团队的技术水平,选择合适的游戏引擎和开发工具。例如,Unreal Engine以其强大的图形表现和丰富的功能受到大型游戏开发团队的青睐,而Cocos2d-x则更适合2D游戏和移动平台开发。

架构设计

良好的架构设计是游戏开发成功的基础。以下是常见的游戏架构组件:

组件描述
渲染引擎负责图形的绘制和显示
物理引擎处理碰撞检测和物理模拟
音频系统管理游戏中的音效和音乐
输入系统处理用户输入(键盘、鼠标、手柄等)
AI系统管理游戏中的人工智能行为
网络模块实现多人游戏的网络通信

图形与物理引擎集成

C++在图形渲染和物理计算方面表现出色。利用OpenGL、DirectX等图形API进行渲染,结合物理引擎如Bullet或PhysX,实现逼真的游戏效果和互动体验。

OpenGL渲染示例:

 
#include <GL/glut.h>void display() {glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);glVertex2f(-0.5f, -0.5f);glVertex2f(0.5f, -0.5f);glVertex2f(0.0f,  0.5f);glEnd();glFlush();
}int main(int argc, char** argv) {glutInit(&argc, argv);glutCreateWindow("OpenGL Triangle");glutDisplayFunc(display);glutMainLoop();return 0;
}

性能优化与调试

游戏开发过程中,性能优化是不可或缺的一环。通过分析工具(如Valgrind、gprof)识别性能瓶颈,优化算法和数据结构,提升游戏的运行效率。同时,利用调试工具(如GDB、Visual Studio Debugger)排查和修复代码中的错误,确保游戏的稳定性。

优化示例:减少不必要的计算

 
// 不优化前
for(int i = 0; i < 1000000; ++i) {float temp = sin(i * 0.001f);// 其他计算
}// 优化后:预计算常用值
std::vector<float> sinValues(1000000);
for(int i = 0; i < 1000000; ++i) {sinValues[i] = sin(i * 0.001f);
}
for(int i = 0; i < 1000000; ++i) {float temp = sinValues[i];// 其他计算
}

测试与发布

全面的测试包括功能测试、性能测试和用户体验测试,确保游戏在各种环境下都能顺利运行。完成测试后,进行打包和发布,选择合适的平台(如Steam、App Store、Google Play)进行推广和分发。

关键技术详解

图形渲染

图形渲染是游戏开发中最重要的部分之一。C++常用的图形API包括OpenGL、DirectX和Vulkan。选择合适的渲染API和优化渲染管线,可以显著提升游戏的视觉效果和性能。

OpenGL渲染管线示意图

阶段描述
顶点着色器处理顶点数据,如位置、颜色、纹理坐标
几何着色器处理图元,如三角形、线条
片段着色器处理像素数据,进行颜色计算
光栅化将图元转换为片段
输出合并将片段最终输出到屏幕

物理引擎

物理引擎负责模拟真实世界中的物理现象,如重力、碰撞和弹性。在C++中,常用的物理引擎包括Bullet和PhysX。

Bullet物理引擎示例

 
#include <btBulletDynamicsCommon.h>int main() {// 初始化物理世界btBroadphaseInterface* broadphase = new btDbvtBroadphase();btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver();btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);dynamicsWorld->setGravity(btVector3(0, -10, 0));// 创建地面btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0), 1);btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), btVector3(0,-1,0)));btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI(0, groundMotionState, groundShape, btVector3(0,0,0));btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);dynamicsWorld->addRigidBody(groundRigidBody);// 创建一个动态球体btCollisionShape* sphereShape = new btSphereShape(1);btDefaultMotionState* sphereMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), btVector3(0,50,0)));btScalar mass = 1;btVector3 sphereInertia(0,0,0);sphereShape->calculateLocalInertia(mass, sphereInertia);btRigidBody::btRigidBodyConstructionInfo sphereRigidBodyCI(mass, sphereMotionState, sphereShape, sphereInertia);btRigidBody* sphereRigidBody = new btRigidBody(sphereRigidBodyCI);dynamicsWorld->addRigidBody(sphereRigidBody);// 模拟物理世界for(int i=0;i<300;i++) {dynamicsWorld->stepSimulation(1/60.f, 10);btTransform trans;sphereRigidBody->getMotionState()->getWorldTransform(trans);std::cout << "Sphere height: " << trans.getOrigin().getY() << std::endl;}// 清理delete dynamicsWorld;delete solver;delete dispatcher;delete collisionConfiguration;delete broadphase;delete groundShape;delete sphereShape;return 0;
}

人工智能

人工智能(AI)在游戏中用于控制非玩家角色(NPC)的行为,使其具备自主决策能力。常见的AI技术包括状态机、行为树和路径规划。

行为树示例

 
// 简单的行为树结构
class BehaviorNode {
public:virtual ~BehaviorNode() {}virtual bool execute() = 0;
};class Sequence : public BehaviorNode {
public:void addChild(BehaviorNode* child) {children.push_back(child);}bool execute() override {for(auto child : children) {if(!child->execute()) return false;}return true;}private:std::vector<BehaviorNode*> children;
};class Selector : public BehaviorNode {
public:void addChild(BehaviorNode* child) {children.push_back(child);}bool execute() override {for(auto child : children) {if(child->execute()) return true;}return false;}private:std::vector<BehaviorNode*> children;
};class Action : public BehaviorNode {
public:Action(const std::string& name) : name(name) {}bool execute() override {std::cout << "Executing Action: " << name << std::endl;return true;}private:std::string name;
};int main() {Sequence* root = new Sequence();root->addChild(new Action("Move to target"));root->addChild(new Action("Attack"));root->execute();// 清理delete root;return 0;
}

网络编程

多人游戏需要处理网络通信,以同步玩家状态和游戏事件。C++中常用的网络库包括Boost.Asio和ENet。

Boost.Asio简单服务器示例

 
#include <boost/asio.hpp>
#include <iostream>using boost::asio::ip::tcp;int main() {try {boost::asio::io_context io_context;tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 12345));std::cout << "Server is running on port 12345..." << std::endl;for(;;) {tcp::socket socket(io_context);acceptor.accept(socket);std::string message = "Hello from server!\n";boost::system::error_code ignored_error;boost::asio::write(socket, boost::asio::buffer(message), ignored_error);}}catch(std::exception& e) {std::cerr << e.what() << std::endl;}return 0;
}

常用C++游戏开发库与引擎

C++生态系统中有许多强大的游戏开发库和引擎,选择合适的工具可以显著提升开发效率。以下是一些常用的C++游戏开发库与引擎的对比表:

名称类型特点适用平台示例项目
Unreal Engine全功能游戏引擎高度可定制,强大的图形和物理支持,蓝图可视化脚本Windows, macOS, Linux, 移动端, 主机《堡垒之夜》、《战争机器》
Cocos2d-x2D游戏框架跨平台,轻量级,适合移动端和独立游戏iOS, Android, Windows, macOS《植物大战僵尸》移动版
SDL (Simple DirectMedia Layer)多媒体库提供图形、音频、输入的底层访问,适合高度定制化多平台独立游戏、工具开发
SFML (Simple and Fast Multimedia Library)多媒体库简洁易用,面向对象设计,适合2D游戏多平台《Stardew Valley》部分模块
CryEngine全功能游戏引擎强大的图形渲染,适合大型3A游戏开发Windows, 主机《孤岛危机》
Godot全功能游戏引擎开源,支持2D和3D,内置脚本语言和C++扩展多平台《空洞骑士》部分模块
Ogre3D渲染引擎高度可定制,专注于3D渲染多平台自定义3D项目

引擎选择建议

选择合适的游戏引擎或库取决于项目的需求和团队的技术水平。以下是一些选择建议:

  • 大型3A游戏:推荐使用Unreal Engine或CryEngine,它们提供了强大的功能和支持,适合复杂的项目。
  • 2D游戏和移动游戏:Cocos2d-x和SFML是不错的选择,轻量级且易于上手。
  • 高度定制化项目:SDL和Ogre3D提供了底层访问能力,适合需要高度定制的游戏或工具开发。
  • 开源项目:Godot是一个优秀的开源游戏引擎,支持2D和3D,并且社区活跃。

实战示例:创建一个简单的C++游戏

为了更好地理解C++游戏开发的流程,下面将通过一个简单的例子,使用SDL库创建一个基本的2D游戏框架。

环境准备

  1. 安装SDL库。可以通过包管理器或从SDL官网下载。
  2. 配置开发环境,确保编译器能够找到SDL的头文件和库文件。

示例代码

 
#include <SDL2/SDL.h>
#include <iostream>// 游戏窗口的宽度和高度
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;int main(int argc, char* argv[]) {// 初始化SDLif(SDL_Init(SDL_INIT_VIDEO) < 0) {std::cerr << "SDL无法初始化! SDL_Error: " << SDL_GetError() << std::endl;return -1;}// 创建窗口SDL_Window* window = SDL_CreateWindow("简单C++游戏", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);if(window == nullptr) {std::cerr << "窗口无法创建! SDL_Error: " << SDL_GetError() << std::endl;SDL_Quit();return -1;}// 创建渲染器SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);if(renderer == nullptr) {std::cerr << "渲染器无法创建! SDL_Error: " << SDL_GetError() << std::endl;SDL_DestroyWindow(window);SDL_Quit();return -1;}bool quit = false;SDL_Event e;// 主循环while(!quit) {// 事件处理while(SDL_PollEvent(&e) != 0) {if(e.type == SDL_QUIT) {quit = true;}}// 清屏SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);SDL_RenderClear(renderer);// 绘制一个红色矩形SDL_Rect fillRect = { WINDOW_WIDTH / 4, WINDOW_HEIGHT / 4, WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2 };SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF);SDL_RenderFillRect(renderer, &fillRect);// 更新屏幕SDL_RenderPresent(renderer);}// 清理资源SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);SDL_Quit();return 0;
}

代码说明

  1. 初始化SDL:调用SDL_Init初始化SDL库,主要初始化视频子系统。
  2. 创建窗口:使用SDL_CreateWindow创建一个窗口,设置标题、位置和大小。
  3. 创建渲染器:使用SDL_CreateRenderer创建一个渲染器,用于绘制图形。
  4. 主循环
    • 事件处理:通过SDL_PollEvent处理用户输入和系统事件,如关闭窗口。
    • 绘制图形:设置绘图颜色,清屏,然后绘制一个红色矩形。
    • 更新屏幕:调用SDL_RenderPresent将渲染的内容显示到窗口。
  5. 清理资源:在退出前,销毁渲染器和窗口,并调用SDL_Quit清理SDL资源。

编译与运行

假设使用g++编译器,可以使用以下命令编译:

 
g++ -o simple_game simple_game.cpp -lSDL2

然后运行生成的可执行文件:
./simple_game

此时将会看到一个黑色窗口中央显示一个红色矩形,关闭窗口即可退出程序。

学习资源与社区支持

在线教程与课程

  • C++ Primer:一本经典的C++入门书籍,涵盖了C++的基础知识和高级特性。
  • Unreal Engine官方文档:Unreal Engine Documentation 提供详细的引擎使用指南和示例代码。
  • Cocos2d-x官方文档:Cocos2d-x Documentation 提供框架的使用教程和API参考。
  • SDL官方教程:Lazy Foo' Productions SDL Tutorials 是学习SDL的优秀资源。
  • Udemy和Coursera:提供大量C++和游戏开发相关的在线课程。

开发者社区

  • Stack Overflow:全球最大的开发者问答社区,涵盖了C++和游戏开发的各种问题。
  • GitHub:众多开源游戏项目和库的聚集地,开发者可以通过阅读和参与项目,提升自己的技能。
  • Reddit的r/gamedev:一个活跃的游戏开发者社区,分享经验、资源和项目进展。
  • C++中文网:C++中文网 提供丰富的C++资源和教程。

论坛与讨论组

  • Unreal Engine论坛:Unreal Engine Forums 官方的开发者交流平台,提供技术支持和资源分享。
  • Cocos2d-x论坛:Cocos2d-x Forums Cocos2d-x的用户交流社区,适合分享经验和解决开发问题。
  • SDL论坛:SDL Forum SDL的官方讨论区,讨论与SDL相关的问题。

开源项目

参与开源项目是提升技能的有效途径。以下是一些知名的开源C++游戏项目:

  • Godot Engine:Godot Engine GitHub 一个开源的全功能游戏引擎,支持C++扩展。
  • OpenTTD:OpenTTD GitHub 一个开源的运输模拟游戏。
  • SuperTuxKart:SuperTuxKart GitHub 一个开源的卡丁车竞速游戏。

结语

C++作为游戏开发的核心语言,以其卓越的性能和灵活的特性,助力开发者创造出令人惊叹的游戏作品。从掌握基础语法到深入理解高级技术,持续学习和实践是成为优秀C++游戏开发者的关键。借助丰富的资源和活跃的社区支持,您可以在C++游戏开发的道路上不断前行,打造出属于自己的精彩游戏世界。

无论您是刚刚踏入游戏开发领域的新手,还是希望提升技能的资深开发者,C++都为您提供了无限的可能性。希望本文能为您的C++游戏开发之旅提供有价值的指导和帮助。

参考资料

  1. C++ Primer,Stanley B. Lippman, Josée Lajoie, Barbara E. Moo
  2. 游戏编程模式,Robert Nystrom
  3. Unreal Engine官方文档,Unreal Engine Documentation
  4. Cocos2d-x官方文档,Cocos2d-x Documentation
  5. SDL官方教程,Lazy Foo' Productions SDL Tutorials
  6. Boost.Asio文档,Boost.Asio Documentation

通过不断学习和实践,您将在C++游戏开发领域取得卓越的成就。祝您开发顺利,创作出精彩的游戏作品!

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

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

相关文章

Data+AI━━隐私都没了,还不懂用户画像吗?

DataAI━━隐私都没了&#xff0c;还不懂用户画像吗&#xff1f; 前言用户画像是什么&#xff1f;用户画像的应用场景DataAI下如何构建用户画像 前言 数据驱动的时代&#xff0c;用户画像已经成为商业和技术领域的热门话题。无论你在电商、金融、广告还是社交媒体&#xff0c;…

从零开始学python必看,最强“Python编程三剑客(pdf)”

目录 三剑客PDF传送门&#xff1a;三剑客 第一本&#xff1a;《Python编程&#xff1a;从入门到实践》 1.1《Python编程&#xff1a;从入门到实践》第一部分&#xff1a;基础知识 1.2《Python编程&#xff1a;从入门到实践》第二部分&#xff1a;项目 第二本&#xff1a;《…

css模糊遮罩效果

原图&#xff1a; 模糊后的图片&#xff1a; html: <div class"bj"><div class"mengban"></div> </div> css: .bj {width: 750rpx;height: 643rpx;background-image:url(https://onlinekc.a.hlidc.cn/uploads/20241023/9e552fc…

大话网络协议:HTTPS协议和HTTP协议有何不同?为什么HTTPS更安全

大家现在访问网络,浏览网页,注意一下的话,网址前面基本上都是一个 https:// 的前缀,这里就是说明这个网址所采用的协议是 https 协议。那么具体应该怎么理解 https 呢? 本文我们就力争能清楚地解释明白这个我们目前应该最广的协议。 理解HTTP协议 要解释 https 协议,当…

FPGA采集adc,IP核用法,AD驱动(上半部分)

未完结&#xff0c;明天补全 IP核&#xff1a;集成的一个现有的模块 串口写好后基本不会再修改串口模块内部的一些逻辑&#xff0c;将串口.v文件添加进来&#xff0c;之后通过他的上层的接口去对他进行使用&#xff0c;所以我们打包IP&#xff0c;之后就不用去添加源文件了&a…

无人机和鸟数据集,无人机数据集+鸟数据集 yolo格式,可以直接用于模型的训练。7000张,图片自己打的标签 yolov5-yolov10通用

无人机和鸟数据集&#xff0c;无人机数据集鸟数据集 yolo格式&#xff0c;可以直接用于模型的训练。7000张&#xff0c;图片自己打的标签 yolov5-yolov10通用 无人机及鸟类目标检测数据集规模&#xff1a; 总图像数量&#xff1a;约7,000张类别&#xff1a;2类检测目标 Drone&…

从一个简单的计算问题,看国内几个大语言模型推理逻辑能力

引言 首先&#xff0c;来看问题&#xff1a; 123456*987654等于多少&#xff0c;给出你计算的过程。 从openai推出chatgpt以来&#xff0c;大模型发展的很快&#xff0c;笔者也经常使用免费的大语言模型辅助进行文档编写和编码工作。大模型推出时间也好久了&#xff0c;笔者想…

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】 导语 在Java高级编程的世界里,设计模式是每个开发者必须掌握的利器。但是,如何快速理解并灵活运用这些模式呢?让我们一起探索如何借助AI编程助手Cursor,轻松掌握设计模式,提升Java编程技能! 正文 设计模式:J…

易控天地|易控天地标准版3.0(EconTNT STD3.0)安装记录

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 以前使用过的组态软件WinCC、杰控、MCGS、组态王、KingSCADA、KingFunsion等&#xff0c; 关于易控天地去年在现场见到过&#xff0c;接下来安装体验下易控天地&#xff1b; 以下为安装笔记。 01 解压缩 下载完安装…

【YOLO模型】(1)--YOLO是什么

一、什么是YOLO YOLO&#xff08;You Only Look Once&#xff09;是一种基于深度学习的目标检测算法&#xff0c;由Joseph Redmon等人于2016年提出。 1. 核心思想 它的核心思想是将目标检测问题转化为一个回归问题&#xff0c;通过一个神经网络直接预测目标的类别和位置。 …

[Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)

前言 CentOS7替换yum源为阿里云 yum是CentOS中的一种软件管理器&#xff0c;通过yum安装软件&#xff0c;可以自动解决包依赖的问题&#xff0c;免去手工安装依赖包的麻烦。 yum使用了一个中心仓库来记录和管理软件的依赖关系&#xff0c;默认为mirrorlist.centos.org&#xf…

1208. 尽可能使字符串相等

Problem: 1208. 尽可能使字符串相等 题目描述 给定两个相同长度的字符串 s 和 t&#xff0c;将字符串 s 转换为字符串 t 需要消耗开销&#xff0c;开销是两个字符的 ASCII 码差值的绝对值。还有一个最大预算 maxCost&#xff0c;我们需要在这个预算范围内&#xff0c;找到 s 中…

时钟分频电路之Innovus自动产生的_clock_gen skew group盘点

我们在查看时钟树综合的log时会发现工具会自动生成一些skew group&#xff0c;这些skew group的名字都是以_clock_gen开头的。 skew_group _clock_gen_CLK_CORE_PLL_clk_reg_1/func: insertion delay [min0.020, max0.064, avg0.038, sd0.022], skew [0.045 vs 0.050], 100% {…

SSL证书有免费的吗?在哪里可以申请到?——附带申请步骤

申请免费的SSL证书通常可以通过以下几个步骤完成&#xff0c;这里以使用JoySSL为例进行说明&#xff0c;因为JoySSL提供了一个免费、自动化和开放的证书颁发机构&#xff08;CA&#xff09;来促进网站从HTTP向HTTPS的转换。 步骤&#xff1a; 选择工具&#xff1a; 访问JoySSL…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse&#xff0c;为了避免Hive还要清洗数据&#xff0c;因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse&#xff1a;clickhouse-client-21.9.5.16 Kettle&#xff1a;kettle9.2 Hadoop&#xff1a;hadoop-3.1.3…

汽车免拆诊断案例 | 2019 款奥迪 A6L 车行驶中偶发熄火

故障现象  一辆2019款奥迪A6L车&#xff0c;搭载2.0T发动机&#xff0c;累计行驶里程约为9万km。车主反映&#xff0c;车辆行驶中偶发熄火&#xff0c;故障频率较高。 故障诊断  接车后试车&#xff0c;起动发动机&#xff0c;可以正常起动着机。使用故障检测仪检测&#x…

Vue项目的创建

安装Vue工具 Vue CLI Vue CLI Vue.js 开发的标准工具&#xff0c;Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 npm install -g vue/cli安装之后&#xff0c;你就可以在命令行中访问 vue 命令。你可以通过简单运行 vue&#xff0c;看看是否展示出了一份所有可用命令的…

基于SSM邮票鉴赏系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;邮票信息管理&#xff0c;邮票分类管理&#xff0c;文章信息管理&#xff0c;系统管理&#xff0c;个人分享管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&…

【正点原子K210连载】第四十八章 自学习分类实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十八章 自学习分类实验 在上一章节中&#xff0c;介绍了利用maix.KPU模块实现了MNIST的手写数据识别&#xff0c;本章将继续介绍利用maix.KPU模块实现的自学习分类。通过本章的学习&#xff0c;读者将学习到自学习分类应用在CanMV上的实现。 本章分为如下几个小节&#xf…

Hallo2 长视频和高分辨率的音频驱动的肖像图像动画 (数字人技术)

HALLO2: LONG-DURATION AND HIGH-RESOLUTION AUDIO-DRIVEN PORTRAIT IMAGE ANIMATION 论文&#xff1a;https://arxiv.org/abs/2410.07718 代码&#xff1a;https://github.com/fudan-generative-vision/hallo2 模型&#xff1a;https://huggingface.co/fudan-generative-ai/h…