sundog公司的SilverLining SDK库实现3d动态云层和下雨、下雨、雨夹雪效果

OSG系列文章目录

文章目录

  • OSG系列文章目录
  • 前言
  • 一、3d动态云与下雨、下雪效果不能同时出现
  • 二、3d动态云与下雨、下雪效果不能同时出现的原因
  • 三、解决办法:

前言

先看下效果:下雨
在这里插入图片描述
效果:下雪
在这里插入图片描述
在这里插入图片描述
效果:雨夹雪
在这里插入图片描述

🌤️ Sundog Software 的 SilverLining SDK 是一个专为模拟真实天空和天气效果而设计的高性能图形库,广泛应用于飞行模拟、虚拟现实、游戏和科学可视化等领域。下面是它的核心功能介绍:

☁️ 3D动态云层系统
SilverLining 提供多种真实云层类型,支持动态变化和体积渲染:

积云(Cumulus):包括 Cumulus Mediocris、Congestus、Towering Cumulus、Cumulonimbus 等,支持体积建模、云成长动画、随风漂移。

层云(Stratus):适合模拟低空覆盖的厚重云层,支持雾化和光照穿透。

卷云(Cirrus):高空薄云,用于增强天空真实感。

沙尘暴(Sandstorm):模拟沙尘天气,带有特殊的雾效和颜色。

云层支持 无限区域覆盖、随时间变化、随风移动,并可通过配置文件或 API 动态控制。

降水系统(雨、雪、雨夹雪)
SilverLining 的降水系统支持三种主要天气粒子效果:

类型 控制参数示例 特效说明
雨(RAIN) SetPrecipitation(RAIN, intensity) 模拟雨滴下落、雨丝、地面湿润感
雪(SNOW) SetPrecipitation(SNOW, intensity) 模拟雪花飘落、雪粒旋转、积雪感
雨夹雪(SLEET) SetPrecipitation(SLEET, intensity) 混合雨雪效果,粒子更稠密
🔧 可调参数包括:

粒子数量(如 rain-max-particles)

粒子大小(如 rain-streak-width-multiplier、snowflake-size-multiplier)

可见度影响(如 rain-visibility-multiplier)

雨丝亮度、雪花颜色、粒子速度等

📁 所有这些都可以通过 SilverLining.config 文件进行精细调节,也可以在运行时通过 API 动态修改。

🌌 天空与光照模拟
真实的太阳、月亮、星辰轨道计算

晨昏光线(Crepuscular Rays),俗称“上帝之光”

HDR色调映射,自动调整亮度与对比度

天空颜色算法:支持 Hosek-Wilkie 模型,模拟不同大气条件下的天空色彩

⚡ 其他高级特效
闪电模拟:支持闪电分支、光照影响、HDR增强

云影图:自动生成云层阴影,增强真实感

从太空看地球大气边缘:支持地心坐标系渲染

🧩 集成与兼容性

支持 OpenGL、DirectX、Vulkan 渲染管线

提供 C++ 和 C# API

可与 Unity、osgEarth、OpenSceneGraph 等平台集成

跨平台支持:Windows、Linux、macOS、iOS、Android

一、3d动态云与下雨、下雪效果不能同时出现

遇到的问题:3d动态云与下雨、下雪效果不能同时出现
在这里插入图片描述

二、3d动态云与下雨、下雪效果不能同时出现的原因

这是 SilverLining SDK 的一个常见“陷阱”,其实并不是你的云层消失了,而是能见度效果在起作用。
SilverLining 在启用降水(如雨、雪、雨夹雪)时,会自动模拟真实天气中的能见度降低。这意味着:

云层距离摄像机较远时,会被“雾化”或“淡出”处理。

降水强度越高,能见度越低,云层越容易被遮蔽。

三、解决办法:

🛠️ 解决方法: 你可以通过修改配置文件 SilverLining.config 来调整或关闭这种能见度衰减效果:
找到SilverLining SDK安装路径:我的路径是
D:\workSpace\osg\sundog\SilverLining SDK\resources\SilverLining.config

在这里插入图片描述

1.提高能见度倍率:雨、雪、雨夹雪

# the simulated visibility here.
rain-visibility-multiplier = 5.0# A similar fudge factor for snow visibility
snow-visibility-multiplier = 50.0# And for sleet
sleet-visibility-multiplier = 1.0

2.完全关闭能见度衰减:
在这里插入图片描述

enable-precipitation-visibility-effects = no
apply-fog-from-cloud-precipitation = no

添加代码:

cumulusCongestusLayer->SetPrecipitation(SilverLining::CloudLayer::RAIN, 30.0);

🌧️ 参数说明:

RAIN 是降水类型(你也可以选择 DRY_SNOW、WET_SNOW或 SLEET)。

20.0 是降水强度,单位是毫米/小时。你可以根据需要调整这个值。
完整代码:
头文件

// Copyright (c) 2008-2012 Sundog Software, LLC. All rights reserved worldwide.#pragma once#include <osg/Drawable>
#include <osgViewer/Viewer>
#include "SilverLining.h"class AtmosphereReference;
class SkyDrawable;// SilverLining now supports separate cull and update methods, so we hook into OSG's cull and update
// passes using callbacks on our Drawable object.
struct SilverLiningCullCallback : public osg::Drawable::CullCallback
{SilverLiningCullCallback() : atmosphere(0) {}virtual bool cull(osg::NodeVisitor* nv, osg::Drawable* drawable, osg::RenderInfo* renderInfo) const { if (atmosphere)  {atmosphere->CullObjects();}return false; }SilverLining::Atmosphere *atmosphere;
};// Our update callback just marks our bounds dirty each frame (since they move with the camera.)
struct SilverLiningUpdateCallback : public osg::Drawable::UpdateCallback
{SilverLiningUpdateCallback() : camera(0) {}virtual void update(osg::NodeVisitor*, osg::Drawable* drawable);osg::Camera *camera;
};// We also hook in with a bounding box callback to tell OSG how big our skybox is, plus the
// atmospheric limb if applicable.
struct SilverLiningSkyComputeBoundingBoxCallback : public osg::Drawable::ComputeBoundingBoxCallback
{SilverLiningSkyComputeBoundingBoxCallback() : camera(0) {}virtual osg::BoundingBox computeBound(const osg::Drawable&) const;osg::Camera *camera;
};// The SkyDrawable wraps SilverLining to handle updates, culling, and drawing of the skybox - and works together with a CloudsDrawable
// to draw the clouds toward the end of the scene.
class SkyDrawable : public osg::Drawable
{
public:SkyDrawable();SkyDrawable(osgViewer::Viewer* view);virtual bool isSameKindAs(const Object* obj) const {return dynamic_cast<const SkyDrawable*>(obj)!=NULL;}virtual Object* cloneType() const {return new SkyDrawable();}virtual Object* clone(const osg::CopyOp& copyop) const {return new SkyDrawable();}void setSkyboxSize(double size) {_skyboxSize = size;}double getSkyboxSize() const {return _skyboxSize;}virtual void drawImplementation(osg::RenderInfo& renderInfo) const;protected:void setLighting(SilverLining::Atmosphere *atm) const;void initializeSilverLining(AtmosphereReference *ar) const;void initializeDrawable();void logCloudInfo(SilverLining::Atmosphere* atmosphere) const;osgViewer::Viewer* _view;double _skyboxSize;SilverLiningCullCallback *cullCallback;SilverLiningUpdateCallback *updateCallback;SilverLiningSkyComputeBoundingBoxCallback *computeBoundingBoxCallback;
};

实现文件:

// Copyright (c) 2008-2012 Sundog Software, LLC. All rights reserved worldwide.#include "SkyDrawable.h"
#include "SilverLining.h"
#include "AtmosphereReference.h"#include <GL/gl.h>
#include <GL/glu.h>
#include <assert.h>using namespace SilverLining;SkyDrawable::SkyDrawable(): osg::Drawable(), _view(0), _skyboxSize(100000)
{
}SkyDrawable::SkyDrawable(osgViewer::Viewer* view): osg::Drawable(), _view(view), _skyboxSize(100000)
{initializeDrawable();
}void SkyDrawable::initializeDrawable()
{setDataVariance(osg::Object::DYNAMIC);setUseVertexBufferObjects(false);setUseDisplayList(false);cullCallback = new SilverLiningCullCallback();setCullCallback(cullCallback);updateCallback = new SilverLiningUpdateCallback();updateCallback->camera = _view->getCamera();setUpdateCallback(updateCallback);computeBoundingBoxCallback = new SilverLiningSkyComputeBoundingBoxCallback();computeBoundingBoxCallback->camera = _view->getCamera();setComputeBoundingBoxCallback(computeBoundingBoxCallback);
}void SkyDrawable::setLighting(SilverLining::Atmosphere *atmosphere) const
{osg::Light *light = _view->getLight();osg::Vec4 ambient, diffuse;osg::Vec3 direction;if (atmosphere && light) {float ra, ga, ba, rd, gd, bd, x, y, z;atmosphere->GetAmbientColor(&ra, &ga, &ba);atmosphere->GetSunOrMoonColor(&rd, &gd, &bd);atmosphere->GetSunOrMoonPosition(&x, &y, &z);direction = osg::Vec3(x, y, z);ambient = osg::Vec4(ra, ga, ba, 1.0);diffuse = osg::Vec4(rd, gd, bd, 1.0);direction.normalize();light->setAmbient(ambient);light->setDiffuse(diffuse);light->setSpecular(osg::Vec4(0,0,0,1));light->setPosition(osg::Vec4(direction.x(), direction.y(), direction.z(), 0));}
}void SkyDrawable::initializeSilverLining(AtmosphereReference *ar) const
{if (ar && !ar->atmosphereInitialized) {ar->atmosphereInitialized = true; // only try once.SilverLining::Atmosphere *atmosphere = ar->atmosphere;if (atmosphere) {srand(1234); // constant random seed to ensure consistent clouds across windows// Update the path below to where you installed SilverLining's resources folder.const char *slPath = getenv("SILVERLINING_PATH");if (!slPath) {printf("Can't find SilverLining; set the SILVERLINING_PATH environment variable ");printf("to point to the directory containing the SDK.\n");exit(0);}std::string resPath(slPath);
#ifdef _WIN32resPath += "\\Resources\\";
#elseresPath += "/Resources/";
#endifint ret = atmosphere->Initialize(SilverLining::Atmosphere::OPENGL, resPath.c_str(),true, 0);if (ret != SilverLining::Atmosphere::E_NOERROR) {printf("SilverLining failed to initialize; error code %d.\n", ret);printf("Check that the path to the SilverLining installation directory is set properly ");printf("in SkyDrawable.cpp (in SkyDrawable::initializeSilverLining)\n");exit(0);}// Let SilverLining know which way is up. OSG usually has Z going up.atmosphere->SetUpVector(0, 0, 1);atmosphere->SetRightVector(1, 0, 0);// Set our location (change this to your own latitude and longitude)SilverLining::Location loc;loc.SetAltitude(0);loc.SetLatitude(45);loc.SetLongitude(-122);atmosphere->GetConditions()->SetLocation(loc);// Set the time to noon in PSTSilverLining::LocalTime t;t.SetFromSystemTime();t.SetHour(12);t.SetTimeZone(PST);atmosphere->GetConditions()->SetTime(t);// Center the clouds around the camera's initial positionosg::Vec3d pos = _view->getCameraManipulator()->getMatrix().getTrans();SilverLining::CloudLayer *cumulusCongestusLayer;cumulusCongestusLayer = SilverLining::CloudLayerFactory::Create(CUMULUS_CONGESTUS, *atmosphere);  //STRATUS //CUMULUS_CONGESTUS,CUMULUS_CONGESTUScumulusCongestusLayer->SetPrecipitation(SilverLining::CloudLayer::SLEET, 30.0);cumulusCongestusLayer->SetIsInfinite(true);cumulusCongestusLayer->SetBaseAltitude(4000);cumulusCongestusLayer->SetThickness(1500);//设置云层厚度cumulusCongestusLayer->SetBaseLength(80000); //40000cumulusCongestusLayer->SetBaseWidth(80000); //40000cumulusCongestusLayer->SetDensity(0.8);cumulusCongestusLayer->SetAlpha(0.8);cumulusCongestusLayer->SetWind(10.0f, 0.0f);  //设置风速和风向cumulusCongestusLayer->SetCloudAnimationEffects(1.0, true, 0, 0);//翻滚或卷动//cumulusCongestusLayer->SetPrecipitation(SilverLining::CloudLayer::DRY_SNOW, 20.0);cumulusCongestusLayer->SetFadeTowardEdges(true);//cumulusCongestusLayer->EnableFadeTowardGround(true);//cumulusCongestusLayer->EnablePrecipitationShadowing(true);          // 让雨水与环境互动//cumulusCongestusLayer->EnableFadeTowardGround(true);// Note, we pass in X and -Y since this accepts "east" and "south" coordinates.cumulusCongestusLayer->SetLayerPosition(pos.x(), -pos.y());cumulusCongestusLayer->SeedClouds(*atmosphere);atmosphere->GetConditions()->AddCloudLayer(cumulusCongestusLayer);cullCallback->atmosphere = atmosphere;}}
}void SkyDrawable::drawImplementation(osg::RenderInfo& renderInfo) const
{SilverLining::Atmosphere *atmosphere = 0;AtmosphereReference *ar = dynamic_cast<AtmosphereReference *>(renderInfo.getCurrentCamera()->getUserData());if (ar) atmosphere = ar->atmosphere;renderInfo.getState()->disableAllVertexArrays();if (atmosphere) {initializeSilverLining(ar);osg::Matrix projMat = renderInfo.getState()->getProjectionMatrix();atmosphere->SetProjectionMatrix(projMat.ptr());osg::Matrix viewMat = renderInfo.getCurrentCamera()->getViewMatrix();atmosphere->SetCameraMatrix(viewMat.ptr());atmosphere->DrawSky(true, false, _skyboxSize, true, false);setLighting(atmosphere);}//if (atmosphere) {//	initializeSilverLining(ar);//	osg::Matrix projMat = renderInfo.getState()->getProjectionMatrix();//	atmosphere->SetProjectionMatrix(projMat.ptr());//	osg::Matrix viewMat = renderInfo.getCurrentCamera()->getViewMatrix();//	atmosphere->SetCameraMatrix(viewMat.ptr());//	atmosphere->DrawSky(true, false, _skyboxSize, true, false);//	setLighting(atmosphere);//	// 新增:渲染云层和降水//	//atmosphere->DrawObjects(true, true, true);//}//logCloudInfo(atmosphere);renderInfo.getState()->dirtyAllVertexArrays();
}void SkyDrawable::logCloudInfo(SilverLining::Atmosphere* atmosphere) const{if (!atmosphere) {std::cerr << "Atmosphere 是空指针!" << std::endl;return;}SilverLining::AtmosphericConditions* conditions = atmosphere->GetConditions();if (!conditions) {std::cerr << "无法获取 AtmosphericConditions!" << std::endl;return;}// 自动推导类型,避免手动书写 allocatorconst auto& layers = conditions->GetCloudLayers();std::cout << "云层数量:" << layers.size() << std::endl;for (const auto& entry : layers) {int id = entry.first;const SilverLining::CloudLayer* layer = entry.second;if (layer) {std::cout << "云层 ID " << id<< ":高度=" << layer->GetBaseAltitude()<< " 厚度=" << layer->GetThickness()<< " 密度=" << layer->GetDensity()<< " 透明度=" << layer->GetAlpha()<< std::endl;}}
}void SilverLiningUpdateCallback::update(osg::NodeVisitor*, osg::Drawable* drawable)
{SilverLining::Atmosphere *atmosphere = 0;AtmosphereReference *ar = dynamic_cast<AtmosphereReference *>(camera->getUserData());if (ar) {if (!ar->atmosphereInitialized) return;atmosphere = ar->atmosphere;}//if (atmosphere) {//    atmosphere->UpdateSkyAndClouds();//}// Since the skybox bounds are a function of the camera position, always update the bounds.drawable->dirtyBound();
}osg::BoundingBox SilverLiningSkyComputeBoundingBoxCallback::computeBound(const osg::Drawable& drawable) const
{osg::BoundingBox box;if (camera) {const SkyDrawable& skyDrawable = dynamic_cast<const SkyDrawable&>(drawable);SilverLining::Atmosphere *atmosphere = 0;AtmosphereReference *ar = dynamic_cast<AtmosphereReference *>(camera->getUserData());if (ar) {atmosphere = ar->atmosphere;}if (atmosphere) {double skyboxSize;if (skyDrawable.getSkyboxSize() != 0.0) {skyboxSize = skyDrawable.getSkyboxSize();} else {skyboxSize = atmosphere->GetConfigOptionDouble("sky-box-size");if (skyboxSize == 0.0) skyboxSize = 1000.0;}double radius = skyboxSize * 0.5;osg::Vec3f eye, center, up;camera->getViewMatrixAsLookAt(eye, center, up);osg::Vec3d camPos = eye;osg::Vec3d min(camPos.x() - radius, camPos.y() - radius, camPos.z() - radius);osg::Vec3d max(camPos.x() + radius, camPos.y() + radius, camPos.z() + radius);box.set(min, max);double dToOrigin = camPos.length();bool hasLimb = atmosphere->GetConfigOptionBoolean("enable-atmosphere-from-space");if (hasLimb) {// Compute bounds of atmospheric limb centered at 0,0,0double earthRadius = atmosphere->GetConfigOptionDouble("earth-radius-meters");double atmosphereHeight = earthRadius ++ atmosphere->GetConfigOptionDouble("atmosphere-height");double atmosphereThickness = atmosphere->GetConfigOptionDouble("atmosphere-scale-height-meters")+ earthRadius;osg::BoundingBox atmosphereBox;osg::Vec3d atmMin(-atmosphereThickness, -atmosphereThickness, -atmosphereThickness);osg::Vec3d atmMax(atmosphereThickness, atmosphereThickness, atmosphereThickness);// Expand these bounds by itbox.expandBy(atmosphereBox);}}}return box;
}

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

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

相关文章

Python:简易的 TCP 服务端与客户端示例

下面是一个完整的 TCP 服务端与客户端示例&#xff0c;适用于 Python 3&#xff0c;使用 socket 模块&#xff0c;并正确处理了中文传输与异常情况&#xff0c;支持基本的多轮通信。TCP 服务端&#xff08;server_tcp.py&#xff09;import socket HOST 127.0.0.1 # 监听本地…

文心一言 4.5 开源深度剖析:中文霸主登场,开源引擎重塑大模型生态

> 百度用一场彻底的开源风暴,宣告中文大模型进入性能与普惠并重的新纪元——这里没有技术黑箱,只有开发者手中跃动的创新火花。 2025年,当全球大模型竞赛进入深水区,百度文心一言4.5的开源如同一颗重磅炸弹,彻底打破了“闭源即领先”的固有认知。这一次,中国团队不…

解决“Windows 无法启动服务”问题指南

错误1067&#xff1a;进程意外终止一、重启计算机有时系统出现临时性的服务故障&#xff0c;重启计算机就可以有效解决问题。需要注意的是&#xff0c;在重启之前&#xff0c;需要保存好所有未保存的工作&#xff0c;以免数据丢失。重启完成后&#xff0c;再次尝试启动相关服务…

银河麒麟(Kylin) - V10 GFB高级服务器操作系统ARM64部署昇腾910b训练机以及Docker安装

银河麒麟(Kylin) - V10 GFB高级服务器操作系统ARM64部署昇腾910b训练机以及Docker安装 原因 项目需要使用Deepseek-r1-distill-qwen-32b来做训练&#xff0c;在此记录 测试环境 服务器配置 型号&#xff1a;G5680V2 CPU&#xff1a;CPU 4Kunpeng 920-5250 NPU&#xff1a;NP…

消息中间件(Kafka VS RocketMQ)

目录 一、概要介绍 二、架构与原理 三、消费模式 1、Kafka—纯拉模式 2、RocketMQ—拉模式 3、RocketMQ—推模式 4、模式对比 四、特殊消息 1、顺序消息 2、消息过滤 3、延迟消息 4、事务消息 5、广播消息 五、高吞吐 六、高可用 七、高可靠 一、概要介绍 Apa…

MyBatis级联查询深度解析:一对多关联实战指南

MyBatis级联查询深度解析&#xff1a;一对多关联实战指南在实际企业级开发中&#xff0c;单表操作仅占20%的场景&#xff0c;而80%的业务需求涉及多表关联查询。本文将以一对多关系为例&#xff0c;深入剖析MyBatis级联查询的实现原理与最佳实践&#xff0c;助你掌握高效的数据…

搜索框的显示与隐藏(展开与收起)

效果如下直接上代码v-if"showAll || 0 < 3" 的意思是&#xff1a;如果 showAll 为 true&#xff0c;或者 0 小于 3&#xff0c;这个表单项就会显示。<el-form :inline"true" class"demo-form-inline" size"default" label-width…

01 启动流程实例

前言本文基于 Activiti 7.0.0.GA 源码&#xff0c;研究 Activiti 如何启动一个流程实例。审批流程图如下图&#xff0c;在此流程图中&#xff0c;存在两个UserTask节点&#xff0c;第一个节点是主管审批&#xff0c;第二个节点是产品经理审批&#xff0c;两个节点中间有一个排他…

LeetCode--47.全排列 II

解题思路&#xff1a;1.获取信息&#xff1a;给定一个可包含重复数字的序列&#xff0c;按任意顺序返回所有不重复的全排列提示信息&#xff1a;1 < nums.length < 8-10 < nums[i] < 102.分析题目&#xff1a;相较于46题&#xff0c;它多限制了一个条件&#xff0c…

vue3 服务端渲染时请求接口没有等到数据,但是客户端渲染是请求接口又可以得到数据

原因是: 服务端请求 后端接收到 请求 ‘Content-Type’: ‘application/x-www-form-urlencoded; charsetUTF-8’ 直接返回错误的code 200000 增加 data: {} 服务端请求 后端接收到 请求 ‘Content-Type’: ‘application/json; charsetUTF-8’ 服务端请求就可以得到数据 expo…

Linux 文件操作命令大全:从入门到精通的实用指南

Linux 文件操作命令大全&#xff1a;从入门到精通的实用指南 在 Linux 系统中&#xff0c;文件操作是日常工作的核心内容之一。无论是开发者、运维工程师还是 Linux 爱好者&#xff0c;掌握常用的文件操作命令都能极大提升工作效率。本文将详细介绍 Linux 系统中最常用的文件操…

Linux开发利器:探秘开源,构建高效——基础开发工具指南(上)【包管理器/Vim】

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

基于迁移学习的培养基配方开发方法

本文为学习笔记&#xff0c;原文专利&#xff1a; 中国专利公布公告 然后输入 202110622279.7 概览 一、问题背景 传统培养基开发痛点&#xff1a; 数据依赖&#xff1a;需大量细胞实验&#xff08;1000配方&#xff09;训练专用模型 迁移性差&#xff1a;A细胞模型无法直接…

Web3.0与元宇宙:重构数字文明的技术范式与社会变革

一、技术融合&#xff1a;Web3.0与元宇宙的底层架构互补1.1 区块链与智能合约&#xff1a;构建信任基石去中心化信任机制&#xff1a;Web3.0的区块链技术为元宇宙提供去中心化信任框架&#xff0c;虚拟资产&#xff08;如土地、道具&#xff09;通过NFT&#xff08;非同质化代币…

Java: OracleHelper

/*** encoding: utf-8* 版权所有 2025 ©涂聚文有限公司 * 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎* 描述&#xff1a; https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html ojdbc11* Author : geovi…

OSPFv3-一二类LSA

文章目录OSPFv3 LSA类型Router LSANetwork LSA&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Datacom专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年07月12日20点01分 OSPFv3 LSA类型 Router LSA 不再包含地址信息&#xff0c;使能 OS…

HugeGraph 【图数据库】JAVA调用SDK

1.引入依赖<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>28.0-jre</version> </dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifac…

软考中级【网络工程师】第6版教材 第2章 数据通信基础(中)

考点分析&#xff1a;重要程度&#xff1a;⭐⭐⭐&#xff0c;本章可能是全书最难的章节&#xff0c;偏理论&#xff0c;公式多除了传输介质&#xff0c;其他知识点只考选择题&#xff0c;考试一般占3 ~ 5分高频考点&#xff1a;PCM、奈奎斯特定理、曼彻斯特编码&#xff1b;难…

单片机(STM32-中断)

一、中断基础知识 1.概念 中断&#xff08;Interrupt&#xff09;是一种特殊的事件处理机制。当CPU正在执行主程序时&#xff0c;如果出现了某些紧急或重要的事件&#xff08;如外设请求、定时器溢出等&#xff09;&#xff0c;可以暂时中止当前的程序&#xff0c;转而去处理…

gitlab-ci.yml

.gitlab-ci.yml 文件的位置 该文件应放置在 GitLab 项目的代码仓库的根目录 下&#xff0c;具体说明如下&#xff1a;存储库根目录 .gitlab-ci.yml 是 GitLab 持续集成&#xff08;CI&#xff09;的配置文件&#xff0c;需直接放在项目的代码仓库的根目录&#xff08;与 .git 目…