Mitsuba 渲染基础

Mitsuba 渲染基础

    • 0. Abstract
    • 1. 安装 Mitsuba2
      • 1.1 下载 Mitsuba2 源码
      • 1.2 选择后端 (variants)
      • 1.3 编译
    • 2. [Mitsuba2PointCloudRenderer](https://github.com/tolgabirdal/Mitsuba2PointCloudRenderer)
      • 2.1 Mitsuba2 渲染 XML
      • 2.2 Scene 场景的 XML 文件格式
        • 2.2.1 `chair.npy` to XML
        • 2.2.2 Scene XML 文件解析
    • 3. Mitsuba2 小结
    • 4. Mitsuba3
      • 4.1 Mitsuba3 安装
      • 4.2 Quickstart
        • 4.2.1 Dr.Jit Quickstart (Similarity with NumPy)
        • 4.2.2 Mitsuba3 Quickstart

0. Abstract

最近看到一些点云相关的工作, 他们在文章中展示的点云结果很好看, 类似这样:

但自己用 matplotlib 画的结果却很丑, 发邮件问作者才知道他用了一个渲染工具 Mitsuba2PointCloudRenderer. 它用到了渲染软件 Mitsuba2, 执行:

python render_mitsuba2_pc.py chair.npy

就能渲染点云, 过程是这样的:

  1. generates an XML file, which describes a 3D scene in the format used by Mitsuba;
  2. calls Mitsuba2 to render the point cloud into an EXR file;
  3. processes the EXR into a jpg file.
  4. iterates for multiple point clouds present in the tensor (.npy)

想要了解其到底干了什么, 如何自定义渲染配置? 就进入这个仓库好好看一看.

1. 安装 Mitsuba2

那么自然要先安装 Mitsuba2, 比较麻烦, 似乎要根据 官方文档 从源码编译安装, 那就照说明做.

1.1 下载 Mitsuba2 源码

git clone --recursive https://github.com/mitsuba-renderer/mitsuba2

Mitsuba2 依赖了很多其他库, --recursive 可以保证同时将其依赖的库一起 clone 下来.

1.2 选择后端 (variants)

克隆好后, 还要了解 Mitsuba2 的后端. 它是一个重定向系统, 前端的调用接口大多是一致的, 实际的后端执行者有很多版本, 各后端版本命名规则:

上面是一个后端的例子:

  • Computational Backend: 指计算设备及计算方式. 如果选择在 CPU 上计算, 可以是 scalar, 对应标量计算方式, 也可以是 packet, 对应并行计算方式; 如果选择在 GPU 上计算, 有 gpugpu_autodiff 可选;

大概意思是, 渲染过程需要发出很多光线, scalar 后端每次只能计算一个光路径, packet 每次并行计算一组, gpu 则具有更高的并行性. 下图展示了 scalarpacket 的区别.

  • Color Representation: 指颜色的表示方式, 有 mono, rgb, spectral. 其中, mono 是单色的意思, 可能是灰白; 光谱表示可能有更加丰富的颜色; 需要注意的是, 在 spectral 模式下, 默认输出的依然是 RGB 图片, 输入仅包含 RGB 颜色信息的 scene, 也能渲染;
  • Polarization: 略;
  • Precision: 计算时使用的浮点精度, 默认是单精度, 带 _double 则表示使用双精度; 注意, GPU 不支持双精度.

全部的变体列表在 Choosing Variants 查看.

了解了 Mitsuba2 的后端后, 可在代码库的根目录配置你需要的后端类型:

cd <..mitsuba repository..>
cp resources/mitsuba.conf.template mitsuba.conf

打开 mitsuba.conf, 找到(大约在70行):

"enabled": [# The "scalar_rgb" variant *must* be included at the moment."scalar_rgb","scalar_spectral"
],

这是默认启用的两个, 你可以向这个列表中添加需要的后端.

注意: scalar_rgb 必须要有, 因为很多基础功能是基于它的; 尽量少添加, 因为后端越多, 编译时间越长, 占用空间越大.

设置默认后端: (如果使用 Mitsuba2 时未指定后端, 则使用默认的后端)

# If mitsuba is launched without any specific mode parameter,
# the configuration below will be used by default
"default": "scalar_spectral"

1.3 编译

不同系统编译要求及命令不同(Python>=3.6). Windows 下需要安装 Visual Studio, 果断放弃; Linux 下也需要一堆依赖:

# Install recent versions build tools, including Clang and libc++ (Clang's C++ library)
sudo apt install -y clang-9 libc++-9-dev libc++abi-9-dev cmake ninja-build
# Install libraries for image I/O and the graphical user interface
sudo apt install -y libz-dev libpng-dev libjpeg-dev libxrandr-dev libxinerama-dev libxcursor-dev
# Install required Python packages
sudo apt install -y python3-dev python3-distutils python3-setuptools# >>>>>>>>>>>>> 可选 >>>>>>>>>>>>>>>>
# For running tests
sudo apt install -y python3-pytest python3-pytest-xdist python3-numpy
# For generating the documentation
sudo apt install -y python3-sphinx python3-guzzle-sphinx-theme python3-sphinxcontrib.bibtex

文档说编译器要选 clang, 因为用 gcc 会有各种问题.

export CC=clang-9
export CXX=clang++-9

如果已经有其他版本的 clang, 可以调整后缀.

然后, 进入代码根目录开始编译:

# Create a directory where build products are stored
mkdir build
cd build
cmake -GNinja ..
ninja

编译好之后, build 目录下会有一个dist 的文件夹, 里面就是编译好的 Mitsuba2:

其中 mitsuba 就是可执行文件.

注意, 如果选择了 GPU 后端, 需要有 CUDA 和 OptiX 来编译.

2. Mitsuba2PointCloudRenderer

在 Abstract 中, 已经说明这个库的步骤是先生成 .xml scene 文件, 然后调用 Mitsuba2 进行渲染. 为了急于验证编译的 Mitsuba2 好不好使, 先讲述渲染部分.

2.1 Mitsuba2 渲染 XML

编译之后就可以使用了, 在这之前, 需要把 render_mitsuba2_pc.py 中的 Mitsuba2 路径修改一下:

...
# mitsuba exectuable, 改成自己的 Mitsuba2 位置
PATH_TO_MITSUBA2 = "/home/tolga/Codes/mitsuba2/build/dist/mitsuba"
...

然后执行:

python render_mitsuba2_pc.py chair.npy

就可以得到渲染后的点云图片.

Mitsuba2 的调用是通过 python 的 subprocess 包执行 shell 命令来实现的:

...
subprocess.run([PATH_TO_MITSUBA2, xmlFile])
...

这里的 xmlFile 是 Python 代码根据 numpy 数组生成的表示 scene 的 xml 文件. 此行代码相当于 shell 命令:

/home/tolga/Codes/mitsuba2/build/dist/mitsuba chair_scene.xml

由 1.2 节可知, 默认使用的是 scalar_spectral, 应该是比较慢的, 渲染这个椅子大约花费了 42s. 那就试一试 GPU 咋样:

subprocess.run([PATH_TO_MITSUBA2, xmlFile, '-m', 'gpu_rgb'])

出了意外:

2024-09-20 20:15:36 INFO  main  [optix_api.cpp:56] Dynamic loading of the Optix library ..
Caught a critical exception: [optix_api.cpp:144] optix_initialize(): libnvoptix.so.1 could not be loaded.

试试手动渲染也是一样的错误. 后来尝试各种办法均无法解决, 可能原因是我使用的环境是 docker 服务器, 管不了 NVIDIA 驱动的事.

GPU 不行就试试 packet:

subprocess.run([PATH_TO_MITSUBA2, xmlFile, '-m', 'packet_rgb'])

好像并没有变快, 足足花了 49s. 可能还有其他参数未设置吧, 比如并行数量. 后来发现是因为 rgb, 之前是 spectral, scalar_rgb 足足花了 1.24m. 可见还是加速了的.

2.2 Scene 场景的 XML 文件格式

了解 scene 文件的格式才能自由调整渲染的各种属性, 官方文档中的 提供了详细说明, 但本博文就只简单了解一下根据 chair.npy 生成的 XML 文件.

2.2.1 chair.npy to XML

阅读 render_mitsuba2_pc.py, 可以发现, XML 文件的生成是三部分组成的: head, shape, tail, 具体的后面再说, 现在看看点云是如何转化为 XML 文件的.

最主要的是中间部分:

xml_ball_segment = \"""<shape type="sphere"><float name="radius" value="0.015"/><transform name="toWorld"><translate x="{}" y="{}" z="{}"/></transform><bsdf type="diffuse"><rgb name="reflectance" value="{},{},{}"/></bsdf></shape>
"""
xml_segments = [xml_head]
for i in range(pcl.shape[0]):color = colormap(pcl[i, 0] + 0.5, pcl[i, 1] + 0.5, pcl[i, 2] + 0.5 - 0.0125)xml_segments.append(xml_ball_segment.format(pcl[i, 0], pcl[i, 1], pcl[i, 2], *color))
xml_segments.append(xml_tail)

通过一个 for 循环把点云 pcl 中的点映射至颜色 color (根据点位置), 然后点和颜色一起送入 xml_ball_segment 的格式化占位符中, 分别对应 shape -> transform -> translateshape -> bsdf -> rgb.

2.2.2 Scene XML 文件解析

已经了解了点云如何转化为 XML 文件, 可其中的标签都代表什么还不清楚, 查阅官方文档既漫长又枯燥, 直接拿得到的 XML 文件问一问通义千问吧, 现以注释的形式记录:

<scene version="0.6.0"><!--积分器是用来计算光照传输方程的方法, 模拟不同的光照效果;path: 这里指定的是路径追踪积分器(Path Tracer), 模拟光线在场景中的随机行走(即光线的“路径”), 从而得到更加真实的光影效果;maxDepth: 路径的最大深度, 当 maxDepth 设置为 -1 时, 表示没有最大深度限制, 即允许光线无限反弹.--><integrator type="path"><integer name="maxDepth" value="-1"/></integrator><!-- 定义了一个相机(传感器)sensor, 它用于捕捉场景并生成图像; --><sensor type="perspective">  <!-- “透视”相机, 它将场景中的物体从三维空间映射到二维图像上, 以模拟人眼观察的视觉效果. --><float name="farClip" value="100"/>   <!-- 远裁剪平面的距离为 100 单位长度, 任何在这个距离之外的对象都不会被绘制. --><float name="nearClip" value="0.1"/>  <!-- 近裁剪平面的距离为 0.1 单位长度. 任何在这个距离之内的对象也不会被绘制. --><!--相机的位置和方向:origin="3,3,3": 相机的位置是在 (3, 3, 3) 坐标处.target="0,0,0": 相机对准的点是在原点 (0, 0, 0).up="0,0,1": 向上的方向是沿着 Z 轴正方向.--><transform name="toWorld"><lookat origin="3,3,3" target="0,0,0" up="0,0,1"/></transform><float name="fov" value="25"/>  <!-- 相机的视场角(Field of View)为 25 度. 视场角决定了相机能看到的范围大小. --><!--独立采样器(Sampler), 用于确定渲染过程中像素的样本分布sampleCount: 每个像素的采样数量为 256. 更多的样本可以减少噪点, 但也增加了渲染时间.--><sampler type="independent"><integer name="sampleCount" value="256"/></sampler><!-- 渲染输出的胶片(Film)类型为 HDR(高动态范围)--><film type="hdrfilm"><integer name="width" value="1920"/>  <!-- 图像宽度为1920像素 --><integer name="height" value="1080"/> <!-- 图像高度为1080像素 --><rfilter type="gaussian"/>  <!-- 使用高斯滤波器进行像素重建, 以减少输出图像的噪声 --></film></sensor><!-- 材料的表面反射模型(BSDF) --><bsdf type="roughplastic" id="surfaceMaterial">  <!-- 粗糙塑料材质的 BSDF(双向散射分布函数) --><string name="distribution" value="ggx"/><float name="alpha" value="0.05"/>  <!-- 微表面模型的粗糙度参数alpha为0.05. 该值越小, 表面看起来越光滑;越大, 则越粗糙. --><float name="intIOR" value="1.46"/> <!-- 折射率影响物体的透明度和折射效果. 对于塑料而言, 1.46是一个合理的折射率值 --><!--材料的漫反射颜色, 默认情况下是白色(1,1,1), 这里的值覆盖了默认的 0.5, 使得材料看起来更加白色. 漫反射颜色影响物体在没有直接光照情况下的颜色表现. --><rgb name="diffuseReflectance" value="1,1,1"/> <!-- default 0.5 --></bsdf><shape type="sphere"><float name="radius" value="0.015"/><transform name="toWorld"><translate x="-0.28334808349609375" y="0.3507939875125885" z="-0.43566787242889404"/></transform><bsdf type="diffuse"><rgb name="reflectance" value="0.24634252336480672,0.9673892625993827,0.05893535263050671"/></bsdf></shape><!-- ... 很多 shape ... --><shape type="rectangle"><ref name="bsdf" id="surfaceMaterial"/>  <!-- 引用前面的 bsdf, 以说明本长方形的表面材质 --><transform name="toWorld"><scale x="10" y="10" z="1"/><translate x="0" y="0" z="-0.5"/></transform></shape><shape type="rectangle"><transform name="toWorld"><scale x="10" y="10" z="1"/><lookat origin="-4,4,20" target="0,0,0" up="0,0,1"/></transform><emitter type="area"><rgb name="radiance" value="6,6,6"/></emitter></shape>
</scene>

深追无益, 现在只关注几个要点, 用以调整生成点云渲染图的视角和颜色效果:

  • sensor -> transform -> lookat 影响视角: 查看方向朝上的方向决定了你看到图片的效果;
  • <float name="fov" value="25"/> 视场角决定了相机能看到的范围大小;
  • sensor -> film 影响生成图片的分辨率;

3. Mitsuba2 小结

有了这些, 已经足够渲染点云, 也能更改渲染时的各种属性. 存在的问题在于:

  • Windows 下安装麻烦, 不想安装 Visual Studio, 因为它太大了;
  • 目前无法使用 GPU;

然后, 目光转向:

4. Mitsuba3

Mitsuba2 已经被弃用, 不会再有更新和维护. Mitsuba3 已发布, 解决了之前的很多问题, 那就看一看咋样吧.

4.1 Mitsuba3 安装

Mitsuba3 官方已经打包了 PYPI 包, 可以直接用 pip 安装了(暂时没有 conda 渠道, 不过 Windows 下也能轻松安装了):

pip install mitsuba

Requirements

  • Python >= 3.8
  • (optional) For computation on the GPU: NVidia driver >= 495.89
  • (optional) For vectorized / parallel computation on the CPU: LLVM >= 11.1

无需自己手动编译, 可直接在 Python 脚本中调用:

import mitsuba as mimi.set_variant('scalar_rgb')      # 设置后端
scene_dict = mi.cornell_box()     # 包内提供的一个描述场景信息的字典, 等价于 xml 文件
scene = mi.load_dict(scene_dict)  # 加载场景
img = mi.render(scene)            # 渲染
mi.Bitmap(img).write('cbox.exr')  # 保存

当然也可以命令行调用:

~# mitsuba -h
Mitsuba version 3.5.2 (master[29d6537], Linux, 64bit, 64 threads, 8-wide SIMD)
Copyright 2022, Realistic Graphics Lab, EPFL
Enabled processor features: cuda llvm avx f16c sse4.2 x86_64

PYPI 包默认编译了 4 个后端:

>>> mi.variants()
['scalar_rgb', 'scalar_spectral', 'cuda_ad_rgb', 'llvm_ad_rgb']
# 注意, 在 Mitsuba3 中, 后端名不太一样, packet --> llvm, gpu --> cuda

基本够用了, 但如果你需要其他后端, 可以像 Mitsuba2 一样进行配置和编译. 比较麻烦, 不过比 Mitsuba2 好的地方在于, 我发现 Mitsuba3 的代码仓库中有 pyproject.toml 文件, 那么就可能通过:

cd <root of the repository>
pip install .

进行安装, 过程中会进行源代码的编译和安装. 我试了试, 无论是直接 cmake .. 还是 pip install ., 都失败了, 算了.

4.2 Quickstart

Mitsuba3 使用一个叫 Dr.Jit 的后端计算工具库, 这可能会在后面的高级用法中用到, 本节先介绍一下 Dr.Jit 的 Quickstart, 然后介绍 Mitsuba3 的 Quickstart.

Dr.Jit 是为 Mitsuba3 特意设计的, 但也可以用作其他计算用途.

重磅: 后面会牵扯到不少渲染, scalarllvm 都比较慢(后来发现, 即使在 scalar 下, CPU 都会 100%), 于是到 Colab 尝试, 分得 T4 GPU, 渲染竟然瞬间完成. 可结果却是模糊的…

4.2.1 Dr.Jit Quickstart (Similarity with NumPy)

Dr.Jit 语法很像 NumPy, 且两个库是可互操作的:

from drjit.llvm import Float, UInt32# Create some floating-point arrays
a = Float([1.0, 2.0, 3.0, 4.0])
b = Float([4.0, 3.0, 2.0, 1.0])# Perform simple arithmetic
c = a + 2.0 * b
print(f'c -> ({type(c)}) = {c}')# Convert to NumPy array
d = np.array(c)
print(f'd -> ({type(d)}) = {d}')

这里 from drjit.llvm import Float, UInt32 有问题, 虽然能运行, 但 IDE 中写代码会报错: 找不到 llvm, 其他后端如 cuda 也一样. 这可能是其 .pyi 文档有问题. 改成 from drjit import llvm 就没问题了, 然后通过 llvm.Float, llvm.UInt32 访问其中的类.
注意, 尝试了修改其 .pyi 文件, 得到的结果是连运行都不行了.

NumPy 不同, Dr.Jit 可以选择在 GPU 上运算:

其他就不多说了, 如有需要, 可参考 Dr.Jit Quickstart.

4.2.2 Mitsuba3 Quickstart

上面安装后的测试已经是 Mitsuba3 的 Quickstart 了, 这里重复一遍, 并加以说明:

>>> import mitsuba as mi
>>> mi.variants()
['scalar_rgb', 'scalar_spectral', 'cuda_ad_rgb', 'llvm_ad_rgb']

这是默认的四个后端, 可以选择其中一个:

>>> mi.set_variant("scalar_rgb")

然后加载场景文件, 支持 XML 格式和 DICT 格式:

scene = mi.load_file("./scenes/cbox.xml")

scenes 可在这里下载. 渲染 (We can for example pass the desired number of samples per pixel (SPP)):

image = mi.render(scene, spp=256)

可用 matplotlib 画出渲染结果:

import matplotlib.pyplot as pltplt.axis("off")
plt.imshow(image ** (1.0 / 2.2)); # approximate sRGB tonemapping

在这里插入图片描述
可以保存为各种格式的图片:

mi.util.write_bitmap("my_first_render.png", image)
mi.util.write_bitmap("my_first_render.exr", image)

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

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

相关文章

设计模式之装饰模式(Decorator)

前言 这个模式带给我们有关组合跟继承非常多的思考 定义 “单一职责” 模式。动态&#xff08;组合&#xff09;的给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码 & 减少…

JavaWeb招聘信息管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

利用Langchain开发框架研发智能体Agent的过程,以及相关应用场景

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下本文主要介绍了利用langchain开发智能体agent的过程。文章首先阐述了项目背景&#xff0c;随后通过给出样例代码&#xff0c;详细展示了执行过程。此外&#xff0c;本文还探讨了该智能体agent在实际应用场景中的运用…

Excel根据一个值匹配一行数据

根据一个值从一个表中匹配一行数据&#xff0c;例如从左边的表中找到指定姓名的所有行数据 使用VLOOKUP函数&#xff0c;参数&#xff1a; Lookup_value&#xff1a;需要搜索的值&#xff0c;单个值 Table_array&#xff1a;被搜索的区域&#xff0c;是个表 Col_index_num&…

【Python基础(一)】

学习分享 一、基本语法1、输出print语句2、常量的写法3、运算符 (/) 与(//)4、字符串5、列表5.1、列表查询元素是否存在5.2、列表查询元素是否存在5.3、身份运算符5.4、列表的增删改查 6、元组6.1、tuple() 7、字典8、函数8.1、值传递8.2、引用传递8.3、函数的传参 二、文件的操…

AWS Network Firewall -NAT网关配置只应许白名单域名出入站

1. 创建防火墙 选择防火墙的归属子网(选择公有子网) 2. 创建规则白名单域名放行 3. 绑定相关规则

Spring JDBC及声明式事务

目录 Spring JDBC基础概念 Spring声明式事务 事务传播方式 Spring JDBC基础概念 Spring JDBC 封装了原生的JDBC API&#xff0c;使得处理关系型数据库更加简单。Spring JDBC的核心是JdbcTemplate&#xff0c;里面封装了大量数据库CRUD的操作。使用Spring JDBC…

[uni-app]小兔鲜-02项目首页

轮播图 轮播图组件需要在首页和分类页使用, 封装成通用组件 准备轮播图组件 <script setup lang"ts"> import type { BannerItem } from /types/home import { ref } from vue // 父组件的数据 defineProps<{list: BannerItem[] }>()// 高亮下标 const…

影响6个时序Baselines模型的代码Bug

前言 我是从去年年底开始入门时间序列研究&#xff0c;但直到最近我读FITS这篇文章的代码时&#xff0c;才发现从去年12月25号就有人发现了数个时间序列Baseline的代码Bug。如果你已经知道这个Bug了&#xff0c;那可以忽略本文&#xff5e; 这个错误最初在Informer&#xff0…

安科瑞Acrel-1000DP分布式光伏监控系统在鄂尔多斯市鄂托克旗巴音乌苏六保煤矿5MW分布式光伏项目中的应用

安科瑞 华楠 摘 要&#xff1a;分布式光伏发电就是将太阳能光伏板分散布置在各个区域&#xff0c;通过小规模、模块化的方式实现电能的并网或独立使用&#xff0c;这种发电方式具有就近发电、就近并网、就近转换、就近使用的特点。近年来&#xff0c;技术进步和政策支持推动了光…

Python在AI中的应用--使用决策树进行文本分类

Python在AI中的应用--使用决策树进行文本分类 文本分类决策树什么是决策树 scikit算法 使用scikit的决策树进行文章分类一个文本分类的Python代码使用的scikit APIs说明装入数据集决策树算法类类构造器&#xff1a; 构造决策树分类器产生输出评估输出结果分类准确度分类文字评估…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-22

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-22 引言: 全球最热销的国产游戏-《黑神话: 悟空》不仅给世界各地玩家们带来愉悦&#xff0c;而且对计算机人工智能研究也带来新的思考。在本期的论文速读中&#xff0c;我们带来一篇关于视觉语言模型&#xff0…

漫步者头戴式耳机好用吗?漫步者、西圣、万魔顶级机型测评对比

现在市面上有很多头戴式耳机&#xff0c;它们都基本精进主动降噪功能&#xff0c;以让大家在生活中能更少受到噪音的干扰&#xff0c;所以对于有降噪需求的人来说&#xff0c;头戴式耳机就是很适合他们的一种耳机。作为一名数码测评博主&#xff0c;也有很多人问我漫步者头戴式…

C++的vector优化

1、C中的动态数组一般是特指vector类 2、vector需要优化的原因之一是当我们push_back元素到数组中时&#xff0c;如果原来分配给动态数组的内存不够用了&#xff0c;那么就会找一块更大的内存空间分配给数组&#xff0c;把旧的内容复制到新的内存中去&#xff0c;这就是导致程…

大数据处理从零开始————3.Hadoop伪分布式和分布式搭建

1.伪分布式搭建&#xff08;不会用&#xff0c;了解就好不需要搭建&#xff09; 这里接上一节。 1.1 伪分布式集群概述 伪分布式集群就是只有⼀个服务器节点的分布式集群。在这种模式中&#xff0c;我们也是只需要⼀台机器。 但与本地模式不同&#xff0c;伪分布式采⽤了分布式…

C++简单缓冲区类设计

目录 1.引言 2.静态缓冲区 3.动态缓冲区 4.数据引用类 5.自动数据引用类 6.几种缓冲区的类关系图 7.注意事项 8.完整代码 1.引言 在C中&#xff0c;设计静态和动态缓冲区类时&#xff0c;需要考虑的主要差异在于内存管理的方式。静态缓冲区类通常使用固定大小的内存区域…

红绿灯倒计时读秒数字识别系统源码分享

红绿灯倒计时读秒数字识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of …

Power Automate 设置流Owner不生效的bug

在查找某个功能没生效时&#xff0c;定位到是一个Power automate的流停了&#xff0c;查看原因是因为创建流的owner被disable了 但是当把流的owner更新为可用的用户时&#xff0c;流依旧没被触发&#xff0c;触发的条件很简单&#xff0c;某个表的记录创建时&#xff0c;因为是…

Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch

在 Java 编程中&#xff0c;条件控制语句用于控制程序的执行路径&#xff0c;决定根据某些条件来选择执行某段代码或跳过某段代码。它们是 Java 编程的重要组成部分&#xff0c;帮助开发者根据不同的输入、状态或数据流来编写更加灵活和动态的代码。在本文中&#xff0c;我们将…

CORE MVC 过滤器 (筛选器)

MVC FrameWork MVCFramework MVC Core 过滤器 分 同步、异步 1、 授权筛选器 IAuthorizationFilter&#xff0c;IAsyncAuthorizationFilter 管道中运行的第一类筛选器&#xff0c;用来确定发出请求的用户是否有权限发出当前请求 2、资源筛选器 IResourceFilter &#xff0c;…