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
英文地址,請注明出處:http://en.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 目…