note update

This commit is contained in:
ouczbs 2024-12-31 15:15:23 +08:00
parent d63af3eac3
commit af0038b5e6
22 changed files with 1204 additions and 32 deletions

4
.obsidian/appearance_0.json vendored Normal file
View File

@ -0,0 +1,4 @@
{
"accentColor": "",
"baseFontSize": 18
}

12
.obsidian/community-plugins_0.json vendored Normal file
View File

@ -0,0 +1,12 @@
[
"obsidian-git",
"obsidian-kanban",
"obsidian-excalidraw-plugin",
"calendar",
"obsidian-image-auto-upload-plugin",
"templater-obsidian",
"periodic-notes",
"media-extended",
"mx-bili-plugin",
"obsidian-plantuml"
]

View File

@ -1,21 +1,30 @@
[
"file-explorer",
"global-search",
"switcher",
"graph",
"backlink",
"canvas",
"outgoing-link",
"tag-pane",
"properties",
"page-preview",
"daily-notes",
"templates",
"note-composer",
"command-palette",
"editor-status",
"bookmarks",
"outline",
"word-count",
"file-recovery"
]
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": false,
"properties": true
}

22
.obsidian/graph_0.json vendored Normal file
View File

@ -0,0 +1,22 @@
{
"collapse-filter": false,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": false,
"collapse-color-groups": false,
"colorGroups": [],
"collapse-display": true,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 0.8854989543150492,
"close": false
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

View File

@ -85,4 +85,10 @@ Android Studio如何连接
- 文件 studio64.exe.vmoptions
- 添加 `-Dfile.encoding=UTF-8`
## 清单报错
- 如果项目中有多个模块或使用了第三方库,这些库的`AndroidManifest.xml`文件可能会与主项目的清单文件产生冲突。
- 在这种情况下,打开`build.gradle`中的`manifest`合并报告查看具体的冲突信息:
- 路径:`app/build/outputs/logs/manifest-merger-release-report.txt`
- 合并冲突通常发生在权限、`<application>`、`<activity>`等元素上,查看并手动解决冲突。

View File

@ -49,3 +49,9 @@ go install google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
```
## Goland
[官网地址](https://www.jetbrains.com/go/download/download-thanks.html?platform=windows)
https://www.jetbrains.com/go/download/download-thanks.html?platform=windows

View File

@ -108,6 +108,10 @@ luapanda插件
zhaoboshuang
892st21t
外网
zhaoboshuang
5xhs6ma3
## RTX
企业实时通信
@ -124,6 +128,11 @@ jg
jghd123
### 打包
192.168.101.212
devel
Rg7yQgjy
## \\192.168.1.212
`\\192.168.101.212`
`\\192.168.1.212\Nei`

View File

@ -94,9 +94,17 @@ set CGO_LDFLAGS=-LF:\Coding\GoModule\cgo -I:vulkan.lib
go build -o main.exe main.go
#C:\Users\Administrator\AppData\Roaming\go
#C:\Users\ouczbs\AppData\Roaming\go
```
```
CGO_ENABLED=1
CGO_CFLAGS=-IF:\Coding\GoModule\cgo
CGO_LDFLAGS=-LF:\Coding\GoModule\cgo -l:vulkan.lib
GOPROXY=https://goproxy.cn,direct
```
### mingw
https://blog.csdn.net/yyd9015/article/details/133873853
# 条件编译

15
src/m/me/密码.md Normal file
View File

@ -0,0 +1,15 @@
---
aliases:
tags:
creation date: 2024-07-04 14:29
modification date: Thursday 4th July 2024 14:29:10
---
# 破解
## 解压密码
【徐公】 回复 【解压密码 】即可获取
:: `xugong`
code
```
JZFLGE21ND-eyJsaWNlbnNlSWQiOiJKWkZMR0UyMU5EIiwibGljZW5zZWVOYW1lIjoic2lnbnVwIHNjb290ZXIiLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiIiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJQU0kiLCJmYWxsYmFja0RhdGUiOiIyMDI1LTA4LTAxIiwicGFpZFVwVG8iOiIyMDI1LTA4LTAxIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFdTIiwiZmFsbGJhY2tEYXRlIjoiMjAyNS0wOC0wMSIsInBhaWRVcFRvIjoiMjAyNS0wOC0wMSIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBDV01QIiwiZmFsbGJhY2tEYXRlIjoiMjAyNS0wOC0wMSIsInBhaWRVcFRvIjoiMjAyNS0wOC0wMSIsImV4dGVuZGVkIjp0cnVlfV0sIm1ldGFkYXRhIjoiMDEyMDIyMDkwMlBTQU4wMDAwMDUiLCJoYXNoIjoiVFJJQUw6LTE1NTI3NDEyNzIiLCJncmFjZVBlcmlvZERheXMiOjcsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-cQoXljKE7uBjoI23ZBPd84P89vQAaprVvVhxj1/nSOABUZKPZMCs6p2id5WKBP1n0EoPHykvzd0y7QcdcO2hxNwbaBRZxpPFuuMigGazrrt+zSd9+UlFXmtcseFTXlWn7Jw2qqp7WSVQlj+o3gf2Gic9/Vp2pAmIajMGdFDsXcHbYUrLwTRVtFkNtggtsqh0AVS8xhzLuXMzGXJsqEEWPZCKMEjy0bURm/FQvrRC/gIptJzuybSb/neqKmvxZefX1lhe98igS3tZsL/E+hsQK7ueXVSP2AuuVEz/6qHYknPS7K4UluWpd+ktIxTcHjIykK1tlWlwTsupZTxnvXFWQA==-MIIETDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUlaUFc1wf+CfY9wzFWEL2euKQ5nswqb57V8QZG7d7RoR6rwYUIXseTOAFq210oMEe++LCjzKDuqwDfsyhgDNTgZBPAaC4vUU2oy+XR+Fq8nBixWIsH668HeOnRK6RRhsr0rJzRB95aZ3EAPzBuQ2qPaNGm17pAX0Rd6MPRgjp75IWwI9eA6aMEdPQEVN7uyOtM5zSsjoj79Lbu1fjShOnQZuJcsV8tqnayeFkNzv2LTOlofU/Tbx502Ro073gGjoeRzNvrynAP03pL486P3KCAyiNPhDs2z8/COMrxRlZW5mfzo0xsK0dQGNH3UoG/9RVwHG4eS8LFpMTR9oetHZBAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAv8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBABqRoNGxAQct9dQUFK8xqhiZaYPd30TlmCmSAaGJ0eBpvkVeqA2jGYhAQRqFiAlFC63JKvWvRZO1iRuWCEfUMkdqQ9VQPXziE/BlsOIgrL6RlJfuFcEZ8TK3syIfIGQZNCxYhLLUuet2HE6LJYPQ5c0jH4kDooRpcVZ4rBxNwddpctUO2te9UU5/FjhioZQsPvd92qOTsV+8Cyl2fvNhNKD1Uu9ff5AkVIQn4JU23ozdB/R5oUlebwaTE6WZNBs+TA/qPj+5/we9NH71WRB0hqUoLI2AKKyiPw++FtN4Su1vsdDlrAzDj9ILjpjJKA1ImuVcG329/WTYIKysZ1CWK3zATg9BeCUPAV1pQy8ToXOq+RSYen6winZ2OO93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXugOoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5zfhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZOEmH0nOnH/0onD
```

189
src/n/noesis.md Normal file
View File

@ -0,0 +1,189 @@
---
aliases:
tags:
creation date: 2024-12-23 10:54
modification date: Monday 23rd December 2024 10:54:30
---
# 文档
## 控件
是否有富文本的概念?
- 按钮
- Button
- RepeatButton
- ToggleButton
- CheckBox
- RadioButton
- 常用控件
- Label
- 文本ToolTip
- GroupBox
- 自带标题,只能包含一个子控件
- Expander
- 同GroupBox但可以展开、收缩
- ProgressBar
- 进度条
- Slider
- 滑块
- TextBox
- 文本输入框
- PasswordBox
- 密码框
- 多子容器
- Selectors
- 好像是抽象类,定义了选中相关逻辑接口
- ComboBox
- 下拉选择框,默认只展示选中项,节省空间
- ListBox
- 同ComboBox但不会展示、隐藏
- ListView
- 继承自ListBox可支持自定义子元素类型展示
- GridView
- 继承自ListView
- TabControl
- 页签栏
- Menu
- 标题菜单
- ContextMenu
- 内容菜单,比如右键显示
- TreeView
- 树形容器
- ToolBar
- 工具栏
- StatusBar
- 状态栏
## 控件实例
- Image
- Text
- Animation
## 事件
- 控件绑定
- c++ 通过名字找到对应控件后,直接在代码强行绑定事件
- 接口绑定
- 在xaml中定义事件接口名字
- 在c++中绑定函数到事件接口上
- 命令绑定
-
- 路由事件 暂时看不懂
- Bubbling
- Tunneling
- Direct
## FrameWorkElement
- 生命周期
- Initialized 已初始化但布局未计算
- Loaded 已全部加载完成
- Reloaded 热重载
- Unloaded 删除控件时触发
## 画布
- 定义画刷
- 定义形状
# xaml
## 标记扩展
![image-20241224115033263](F:\ouczbs\znotes\Assert\Image\image-20241224115033263.png)
```xaml
<Style TargetType="{x:Type Button}">
<Button Background="{x:Null}">Click</Button>
<TextBlock TextContent="{Binding Path=SimpleProperty, Mode=OneTime}"/>
<TextBlock
Name="myText"
Background="{StaticResource
{x:Static SystemColors.ActiveCaptionBrushKey}}" />
<TextBlock Name="myText" Background="{DynamicResource
{x:Static SystemColors.ActiveCaptionBrushKey}}" />
```
```c#
TypeExtension te = new TypeExtension("Button");
object val = te.ProvideValue(s, Style.TargetTypeProperty);
Style s = new Style( );
s.TargetType = typeof(Button);
Button b = new Button( );
b.Background = null;
b.AddText("Click");
Binding b = new Binding( );
b.Path = new PropertyPath("SimpleProperty");
b.Mode = BindingMode.OneTime;
myText.Background = (Brush)
myText.FindResource(SystemColors.ActiveCaptionBrushKey);
myText.SetResourceReference(TextBlock.Background,
SystemColors.ActiveCaptionBrushKey);
```
```xaml
<?Mapping XmlNamespace="http://example.com/foo"ClrNamespace=
"MyNamespace" ?>
<Window
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
xmlns:my="http://example.com/foo">
<Button my:Foo.Bar="Blue" />
<StackPanel>
<StackPanel.Children>
<Button>Foo</Button>
<Button>Bar</Button>
<StackPanel.Children>
</StackPanel>
<Button>
<Button.Content>
<Ellipse Fill="Red" Height="20" Width="70"/>
</Button.Content>
</Button>
<ListBox>
<ListBox.Items>
<TextBlock>Foo</TextBlock>
<TextBlock>Bar</TextBlock>
<TextBlock>Quux</TextBlock>
<TextBlock>Spong</TextBlock>
</ListBox.Items>
</ListBox>
</Window>
```
# vulkan 渲染器
- 传输管线
- 分两种传输
- 高频的渲染队列传输在交换链waitforfence 后,可以保证渲染队列中渲染命令 和 传输命令都执行完毕
- 传输的中间缓冲需要按类型进行复用
- 复用对象要和传输队列区分开,因为二者复用规则不一样
- 低频的传输队列传输可以按一定策略每10帧同步清空一次可以按照帧索引来判断是否传输完毕
- 中间缓冲也需要按类型进行复用
- 所以呢? 抽象一个资源类,然后分两层
- 那么缓冲区如何管理呢?
- 可以跨队列提交
- 如何重用呢?
- 什么时候重置?
我发现一个问题如果我当前vulkan 着色器需要一个图片图片还未加载然后就会创建一个undefined 布局的图片,然后再把布局改成 TRANSFER_DST_OPTIMAL把磁盘数据拷贝到图片中。这个时候我着色器读取图像时布局又要处于SHADER_READ_ONLY_OPTIMAL。

15
src/s/shell/dumpbin.md Normal file
View File

@ -0,0 +1,15 @@
---
aliases:
tags:
creation date: 2024-06-26 17:50
modification date: 星期三 26日 六月 2024 17:50:59
---
# 静态库
- MDd
- MD
- MTd
- MT
MT 与 MD 的区别在于底层多线程库与c++标准库不同
```
dumpbin /directives myzlib.lib
```

View File

@ -1,10 +0,0 @@
---
aliases:
tags:
creation date: 2024-01-17 13:47
modification date: 星期三 17日 一月 2024 13:47:00
---
# vulkanapi
## shader

View File

@ -0,0 +1,23 @@
---
aliases:
tags:
creation date: 2024-10-21 11:29
modification date: Monday 21st October 2024 11:29:12
---
# 内存管理
## 全局对象
全局光照、场景属性
- 更新
- 整体更新
- 存储
- 所有数据放到一个大结构体里,然后持有唯一的对象结构
## 普通对象
按照基础类型分类,通过对象池管理
- 更新
- 挨个更新
- 存储
- 一个类型一个对象池
## 大量同类对象
- 分组批量存储、偏移更新
-

View File

@ -0,0 +1,77 @@
---
aliases:
tags:
creation date: 2024-01-17 13:47
modification date: 星期三 17日 一月 2024 13:47:00
---
# vulkanapi
## loader shader
### 输入
- 输入布局 `location`
- 顶点属性必须包含这些输入布局
- 一个小着色器,也可支持多个顶点类型
- 统一缓冲区 `binding + uniform`& 存储缓冲区 `binding + storage`
- 采样器和纹理 `binding + uniform + sampler2D`
- 输入附件 `subpass`
```glsl
#version 450
#extension GL_GOOGLE_include_directive : enable
layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texture;
layout (location = 2) in vec3 normal;
layout (location = 3) in vec3 tangent;
layout (location = 4) in vec4 weights;
layout (location = 5) in uvec4 bones;
layout(binding = 0) uniform UniformBufferObject {
mat4 model;
mat4 view;
mat4 proj;
} ubo;
layout(binding = 1) buffer StorageBufferObject {
vec4 data[];
} sbo;
layout(binding = 2) uniform sampler2D textureSampler;
layout(input_attachment_index = 0, set = 0, binding = 3) uniform subpassInput inputAttachment;
//out vec4 outPosition;
out gl_PerVertex {
vec4 gl_Position;
};
vec2 positions[3] = vec2[](
vec2(0.0, -0.5),
vec2(0.5, 0.5),
vec2(-0.5, 0.5)
);
void main() {
gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);
}
```
### 渲染管线
- 顶点属性
- 顶点装配
- 曲面细分
- 光线追踪属性
- 光栅化属性
- 视口剪裁
- 颜色混合
- 模板测试
- ...
# loader mesh
copy vertex and index to gpu

219
src/v/vulkan/描述符.md Normal file
View File

@ -0,0 +1,219 @@
---
aliases:
tags:
creation date: 2024-10-30 20:47
modification date: Wednesday 30th October 2024 20:47:25
---
当然可以!下面是一个示例,展示如何在 Vulkan 中为你的着色器代码添加描述符,并在着色器中使用这些描述符。这个例子将包括一个 uniform buffer用于传递颜色数据。
1. 更新着色器代码
首先,我们将更新顶点着色器以接受一个 uniform 颜色:
顶点着色器Vertex Shader
glsl
#version 450
layout (location = 0) in vec3 iPos;
layout(set = 0, binding = 0) uniform ColorData {
vec4 uColor; // 从 uniform buffer 获取颜色
};
layout (location = 0) out vec4 vColor;
void main()
{
gl_Position = vec4(iPos, 1.0);
vColor = uColor; // 使用 uniform 颜色
}
片段着色器Fragment Shader
片段着色器保持不变,只是将颜色从顶点着色器传递到输出:
glsl
#version 450
#extension GL_ARB_separate_shader_objects : enable
layout (location = 0) in vec4 vColor;
layout (location = 0) out vec4 oColor;
void main() {
oColor = vColor; // 输出传入的颜色
}
2. Vulkan 设置代码
接下来,我们将添加必要的 Vulkan 设置,以创建 uniform buffer并将其绑定到描述符集中。
2.1 创建 Uniform Buffer
首先,我们需要创建一个 uniform buffer以便传递颜色数据。
cpp
// 颜色数据结构
struct ColorData {
glm::vec4 color; // 使用 glm 库来处理向量
};
// 创建 uniform buffer
VkBuffer uniformBuffer;
VkDeviceMemory uniformBufferMemory;
// 设置 uniform buffer 的大小
VkDeviceSize bufferSize = sizeof(ColorData);
// 创建 buffer
createBuffer(bufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, uniformBuffer, uniformBufferMemory);
2.2 创建描述符布局
创建描述符布局以定义 uniform buffer 的结构。
cpp
VkDescriptorSetLayoutBinding layoutBinding = {};
layoutBinding.binding = 0;
layoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
layoutBinding.descriptorCount = 1;
layoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; // 顶点着色器使用
layoutBinding.pImmutableSamplers = nullptr;
VkDescriptorSetLayoutCreateInfo layoutInfo = {};
layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
layoutInfo.bindingCount = 1;
layoutInfo.pBindings = &layoutBinding;
VkDescriptorSetLayout descriptorSetLayout;
vkCreateDescriptorSetLayout(device, &layoutInfo, nullptr, &descriptorSetLayout);
2.3 创建描述符池
创建描述符池以管理描述符的分配。
cpp
VkDescriptorPoolSize poolSize = {};
poolSize.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
poolSize.descriptorCount = 1;
VkDescriptorPoolCreateInfo poolInfo = {};
poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
poolInfo.poolSizeCount = 1;
poolInfo.pPoolSizes = &poolSize;
poolInfo.maxSets = 1;
VkDescriptorPool descriptorPool;
vkCreateDescriptorPool(device, &poolInfo, nullptr, &descriptorPool);
2.4 分配描述符集
分配描述符集以绑定 uniform buffer。
cpp
VkDescriptorSetAllocateInfo allocInfo = {};
allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
allocInfo.descriptorPool = descriptorPool;
allocInfo.descriptorSetCount = 1;
allocInfo.pSetLayouts = &descriptorSetLayout;
VkDescriptorSet descriptorSet;
vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet);
2.5 更新描述符集
将 uniform buffer 更新到描述符集中。
cpp
VkDescriptorBufferInfo bufferInfo = {};
bufferInfo.buffer = uniformBuffer; // 你的 uniform buffer
bufferInfo.offset = 0;
bufferInfo.range = sizeof(ColorData); // uniform buffer 的大小
vkUpdateDescriptorSets(device, 1, &bufferInfo, 0, nullptr);
3. 渲染循环中设置颜色数据
在渲染循环中,你可以设置 uniform buffer 中的颜色数据:
cpp
ColorData colorData;
colorData.color = glm::vec4(1.0f, 0.0f, 0.0f, 1.0f); // 红色
// 将数据复制到 uniform buffer
void* data;
vkMapMemory(device, uniformBufferMemory, 0, sizeof(colorData), 0, &data);
memcpy(data, &colorData, sizeof(colorData));
vkUnmapMemory(device, uniformBufferMemory);
4. 在绘制时绑定描述符集
在你的绘制命令中绑定描述符集,以确保着色器能访问 uniform 数据。
cpp
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, nullptr);
总结
通过这个示例,你已经将一个 uniform buffer 绑定到着色器,使其能够动态设置颜色数据。你可以根据需要进一步扩展这个示例,添加更多的 uniform 或其他类型的资源。如果你有任何疑问或需要进一步的帮助,请告诉我!
您说:
嘿,是的,你的方法是可以运行的。但是我还是感到困惑,为什么需要这些步骤呢,每一步的作用和原理是什么呢
ChatGPT 说:
ChatGPT
当然,理解每一步的作用和原理有助于你更好地掌握 Vulkan 的资源管理。Vulkan 的 API 相对复杂,它的这些步骤主要是为了解决 GPU 资源的管理和绑定问题。让我逐步为你解释每一部分的作用和原理。
1. Uniform Buffer
Uniform buffer 是一种特殊的缓冲区,允许我们将数据从 CPU 传递到 GPU供着色器在每次绘制时使用。在本例中我们将颜色数据存储在 uniform buffer 中,并在顶点着色器中引用它。
作用:保存从 CPU 到 GPU 的数据传输内容。因为 Vulkan 的内存管理是手动的,所以我们需要在内存中分配出 uniform buffer 的位置。
原理GPU 无法直接访问 CPU 内存Vulkan 通过 vkMapMemory 允许我们将数据映射到统一的内存空间,之后 GPU 就能使用这个缓冲区中的内容了。
2. 描述符集布局Descriptor Set Layout
描述符集布局定义了描述符集的结构,也就是告诉 GPU 程序每个资源(如 uniform buffer、纹理应该怎样组织。Vulkan 中描述符集布局可以包含多个不同类型的资源描述符。
作用:定义了着色器可以访问的资源列表和每种资源的类型,这样我们可以在 GPU 上创建与着色器一致的布局。
原理Vulkan 需要事先知道资源类型和数量,这样它可以在执行命令时优化内存布局和性能。描述符集布局让 GPU 明确知道有哪些类型的数据(如 uniform buffer、采样器等并匹配着色器的 layout(set = 0, binding = 0) 标注。
3. 描述符池Descriptor Pool
描述符池是用于管理描述符集的内存池。在 Vulkan 中,描述符集用于将 GPU 资源绑定到着色器,并由描述符池统一分配和管理。
作用:管理描述符集的内存分配,并允许 Vulkan 高效管理和释放资源。
原理Vulkan 使用描述符池来避免频繁的内存分配和释放。通过池化机制,一次创建多个描述符可以有效地减少内存分配的开销,从而提升性能。
4. 描述符集Descriptor Set
描述符集是资源到 GPU 的具体绑定。例如,我们在着色器中使用 layout(set = 0, binding = 0) uniform ColorData描述符集的作用就是把 ColorData 这个 uniform buffer 实际绑定到着色器的 binding 中,使得 GPU 可以访问这些资源。
作用将具体的资源绑定到特定的管道pipeline和绑定点。
原理:描述符集是将特定资源绑定到 GPU 的接口,它通过指向资源(如 uniform buffer 或纹理)的指针来实现数据传递。描述符集使得不同的资源可以快速替换和重新绑定,支持灵活的渲染需求。
5. 更新描述符集
创建描述符集之后,我们还需要更新它的内容,将实际的资源(如 uniform buffer和描述符绑定。
作用:更新描述符集中的资源引用,比如告诉 Vulkan 当前描述符绑定的 uniform buffer 的位置。
原理:描述符集只是一个空的引用表,在更新时,我们指定每个 binding 实际要绑定的数据地址。更新描述符集时vkUpdateDescriptorSets 命令会在 GPU 内部建立引用,避免在绘制过程中频繁访问 CPU 数据。
6. 将数据写入 Uniform Buffer
在 Vulkan 中,将数据传输到 GPU 并不是实时的。我们需要先映射内存,然后将数据写入缓冲区,最后解除映射,这样数据才会从 CPU 缓冲区中传输到 GPU。
作用:将数据从 CPU 写入 GPU 中的 uniform buffer。
原理Vulkan 使用 vkMapMemory 和 vkUnmapMemory 允许 CPU 访问 GPU 内存(通常 GPU 内存在 CPU 端是不可见的)。通过这种方式,我们可以高效地将数据复制到 GPU 的 uniform buffer。
7. 绘制时绑定描述符集
在每次绘制调用时,需要告诉 Vulkan 要使用哪些描述符集。vkCmdBindDescriptorSets 将描述符集绑定到特定的管道,以确保在渲染过程中 GPU 能够访问到这些资源。
作用:将描述符集和管道绑定,以便在着色器中访问资源。
原理Vulkan 在渲染时会执行大量的管线状态切换,而描述符集绑定会在管道切换时发生,使得 GPU 可以根据描述符集内容动态调整资源。通过 vkCmdBindDescriptorSetsGPU 可以获得 uniform buffer 或纹理等资源的地址,并在着色器中使用这些数据。
通过这些步骤Vulkan 确保了 CPU 和 GPU 间资源管理的高效性和灵活性。描述符机制在着色器和 GPU 之间提供了一个清晰的接口,使得资源管理既灵活又高效。

View File

@ -0,0 +1,78 @@
---
aliases:
tags:
creation date: 2024-06-26 20:19
modification date: 星期三 26日 六月 2024 20:19:59
---
# debug
## lua_panda
- `xmake\core\main.lua`
```lua
local _luasocket = _PROGRAM_DIR .. "/winenv/bin/core.dll"
package.cpath = package.cpath .. ";" .. _luasocket
require("../winenv/bin/LuaPanda").start("127.0.0.1",8818)
```
## xrepo-debug
EmmyLua
https://zhuanlan.zhihu.com/p/658542723
```
#设置xrepo 权限
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
```
vscode
```json
settings.json
{
    "Lua.diagnostics.severity" : {
      "redefined-local" : "Hint",
      "emmy-lua" : "Hint",
      "undefined-global": "Hint",
      "lowercase-global": "Hint",
 }
}
```
# clang
## on_test
- `xmake\modules\private\action\require\impl\actions`
```lua
-- clang编译器需要注掉 test不然安装第三方库很容易失败
-- msvc编译器是官方支持的无需改动
-- test(package)
```
- engine.h
```c++
你知道c++ 的dll ,lib exe之间的链接吗 当我处理复杂项目时,遇到了困扰。请耐心听,当我提问的时候再回答,并且回答时不要带上代码,好吗
你先不要回答请听一下我的问题细节。现在假设有两个c++ 的 dll 项目 engine.dll 与 vulkan.dll。vulkan.dll 依赖 engine.dll。现在engine.dll 里 有一个未导出的全局函数声明 void* GlobalPool(); 和 一个未导出的类型 class ModuleManager{ public: void* GlobalPool(){return ::GlobalPool()}};。
//engine.h
void * GlobalPool();
struct ModuleManager{
static void* ModulePool(){
return GlobalPool;
}
std::string Name(){
return "ModuleManager";
}
}
//engine.cpp
void* GlobalPool(){
return nullptr;
}
//vulkan.h
#include "engine.h"
Module
```

40
src/z/zengine/体系.md Normal file
View File

@ -0,0 +1,40 @@
---
aliases:
tags:
creation date: 2024-12-04 13:44
modification date: Wednesday 4th December 2024 13:44:50
---
# 世界
阶段
- 组装
- 模块化
- 运行
- module
- 模块化设计
- subsystem
- 世界基石
- rule
- 规则创建世界
- 销毁
规则
- 时间规则
- 时间一帧一帧的前进
- 时间可暂停
- 可前进到下一帧
- 事件规则
- 每帧事件???
- 突发事件!!!
# 组装
# 运行
# 销毁

79
src/z/zengine/单例.md Normal file
View File

@ -0,0 +1,79 @@
---
aliases:
tags:
creation date: 2024-08-02 09:15
modification date: Friday 2nd August 2024 09:15:58
---
# # 符号
- static 与 extern 是互斥的static 缩小了变量范围,不再全局化
- static 的作用域是命名空间时每个引入的cpp文件里都会含有这个static 本地变量
- static 的作用域是类时变量作用域属于类类是唯一的static 变量也唯一
- static + inline + class 又变回了全局变量,定义唯一
- inline 不会报符号重定义的错,而是会合并相同符号
## 变量定义
- 定义与声明分离 ::extern
- 头文件中 extern 声明
- 源文件中 定义
- 具有唯一的定义
- 定义与声明合并 ::inline
- 头文件中 inline 定义
- 每个翻译单元都有,但是最终会合并符号为唯一
## 符号导出
- 在变量定义的基础上 加上 导出宏 DLL_API
- extern + DLL_API 可适配原逻辑
- 代价和原逻辑一样,需要头文件、源文件分离
- inline + DLL_API , 在引入符号时,不能带定义,只能适用于无参变量
- 有参变量,需要拆分,可通过宏拆分在头文件中
- DLL_API extern 是不实际导出的必须要有DLL_API + 声明,才能正确导出
### LIB
- 变量会导出到所有依赖库中
- 有策略可以保证在dll 和 exe 中唯一
- LIB 的依赖库 DLL 必须唯一,其他库必须通过该 DLL 间接依赖LIB
- extern 变量唯一,但符号未定义,不能直接用。 inline 能使用,但会导致变量不唯一
- 指针类型,可以想办法让变量不唯一,但是变量的值唯一。
### DLL
dll 链接时,只能链接导出符号,其他符号会报未定义错误
- 可以导出变量
- 类,函数
- 导出接口一致时才能通过替换dll实现逻辑动态切换
# 链接
## 函数
- 普通函数直接拷贝是合适的
- 深拷贝,可能会导致变量不唯一
- 含静态变量的函数怎么办呢?
- 建议导出,确保变量的唯一性
## 变量
- 依然是深拷贝,可能会导致出现其他符号
- 变量是要保证唯一的
- 需要导出
## 流程
- 声明符号
- 声明符号,必须结合使用符号才有意义
- 使用符号
- 使用符号之前,必须先声明符号
- 才能知道从何处查找符号
- 定义符号
- 同时包含了声明与使用符号
- 多重定义
- 多个相同符号不一定会造成多重定义,链接时是有范围的,范围外的符号不会参与链接
- 但是使用符号时,多个相同符号才会导致多重定义

View File

@ -0,0 +1,220 @@
---
aliases:
tags:
creation date: 2024-08-16 13:30
modification date: Friday 16th August 2024 13:30:09
---
# 抽象设计
## 跨平台窗口
功能
- 图像渲染
- 创建交换链
- 图像渲染、展示
- 消息处理
- 触摸事件
- 点击事件
- 键盘事件
## 渲染命令
- api接口 同步接口
# 代码设计
## Main
```c++
int API_MAIN(int argc, char** argv){
AppImpl app;
app.run();
}
//15277607545
```
## framegraph
### 资源复用
- **纹理**Textures
- 相同大小、格式兼容的纹理可以复用。
- 典型的例子是阴影贴图和后处理缓冲区等,这些通常在不同的渲染阶段被用作输入输出。
- **渲染目标**Render Targets
- 多个不同阶段的渲染目标(如颜色缓冲、深度缓冲)可以复用,前提是它们的大小和格式相同或兼容。
- **深度缓冲**Depth Buffers
- 深度缓冲资源也可以复用,如果它们不同时被读写,并且格式一致。
- **计算着色器的中间缓冲**Compute Shader Buffers
- 用于计算着色器的中间缓冲区可以复用,特别是在不同的计算通道或不同的阶段。
- **临时数据存储缓冲**Temporary Buffers
- 如 SSBOShader Storage Buffer Objects和 UBOUniform Buffer Objects等可以用于不同阶段的复用特别是这些缓冲区通常在一个帧内使用后不再需要可以在下一阶段复用。
### 输入输出
渲染图像有rendergraph管理
其他资源需要有renderpassnode自身管理
- 输入交换链图像
- 更新交换链图像目标布局
- 输入的资源总需要rendergraph 保持状态正确吧
- 输出同步信号量
## 编辑器模式
输入是交换链图像,这样就会有两个窗口大小?
原始窗口变成了编辑器窗口,只有编辑器能用,其他逻辑用的是编辑器的一个子窗口
- 所以要把和窗口相关的逻辑都修改了吗?
- 我希望从非编辑器模式切换到编辑器模式是做加法,尽量不要影响到原始逻辑
FrameGraph 相关逻辑都变了,一个是正常渲染的交换链图像需要换成纹理。一个是信号量同步逻辑需要修改
- 增加一个mEditorSurface 表示真实的交换链而mSurface则替换成子纹理
- 替换逻辑需要最先执行,那要怎么执行呢?
- 信号量同步逻辑是否需要重构让framegraph 能够更加自由
## FrameGraph
VkImageUsageFlags
VkImageLayout
核心是做好同步工作,需要为输出节点补充自动同步信号
那么编辑器模式需要做如何改动呢?
- 获取输入时,编辑器会修改输入
- 输出节点会新增一个类型
-
输入
- 输入阶段可以拆分,就可以让任意目标有机会修改数据了
- 交换链获取图像的信号量
- 交换链图像
- 如果还输入了其他图像,还需要信号量吗?
- 如果需要信号量那么应该封装为renderpass
- 所以输入不用关心信号量
- 暂时先封装到这里
输出
- 渲染完成信号量
- 交换链图像布局切换到present
编译
- 需要找出所有输出节点
- 创建节点时可以填写节点类型
- 需要裁剪掉和输出节点不相连的冗余节点
- 需要对输出节点进行排序,然后补充信号依赖
- 多输出,不需要考虑其他输出,自动依据类型排序
- 如果要兼容编辑器,应该怎么设计?
- 相当于有两种输出,需要按输出类型,按节点类型双重排序
- 然后依然是正常的依赖补充,下一个依赖上一个
- 需要做好信号量的依赖
- 依据补充依赖 与 输入边进行信号依赖
- 那么输入的获取交换链的信号量怎么同步呢?
- 需要找到使用node的第一个renderpass
- 实际上第一个renderpass只能在输出节点里找
- 因为把原始交换链图像作为输入是没有意义,也不合理的
执行
- 按node顺序执行node在gpu端是并行的通过信号量同步所以顺序不重要
- 判断是否是第一个节点,添加信号依赖???
- 这样不是特别合理吧? 为什么不在准备阶段就传递好信号量
- 因为执行在render.lib 获取不到信号量对象信号量是vulkan专属的
- 但是这样扩展性就低了,不是吗?
## 资源管理
一条边对应一个资源实例
资源实例包含了当前需要的资源状态
需要找到另外一个对应的唯一资源对象,找到当前状态
需要更新GPU与唯一资源对象 资源状态
- 例子
- 比如我在editor中输入了一个纹理对象细节需要创建对应的图
- ResolveTexture
- 找另外一个对象时,发现没图,需要创建
- 需要注意三缓冲有三张格式一样的图,如何区分?
- 这需要加一个唯一id吧
- 唯一资源描述池子
- 依据名字+下标找资源资源中包含唯一id
- 这里的资源不负责创建对象仅仅是为了获取描述与唯一id
- 资源池子
- 通过唯一id找到对应的池子资源
- 如果不存在再去创建资源
- 那么为什么要两份呢?
- 那我还如何共享资源呢? 难道id 指向0吗
- 如果我有两个资源类型一样,如何共享资源
实现资源共享
- 依据名字找资源,资源唯一
- 依据类型找资源,资源共享
实现资源唯一
所以有名字池,类型池,唯一池
那么如何回收资源呢?更新三个池子就行
## 资源管理 二版
资源池
- 存储了所有图像包括id格式、状态、内存等
名字池
- 存储名字到id的映射
- 依据名字找到唯一的资源池资源
资源key池
- 资源复用如果资源的key一致就用已有的
- 如果找不到就新创建一个共享资源
那么如果出现了资源复用,是否会影响到节点图的拓扑排序和并发
- 任意资源都能复用吗???
- 如果出现问题了,需要人为调整资源类型吗?
- 资源不再需要name而是id资源复用时可以检测状态然后切换到另外一个资源吗
- 边也不需要状态,状态存储在资源里
## renderpass
考虑多重采样格式一致有就一定是k
node
outs[mask1,mask2,mask3,mask4]
formats[color1, color2, depth]不行哈如果这样计算mask会很麻烦
- color1
- resolve1
- color2
- depth
- 别省简单就行可是这样mask 也会变大哈

View File

@ -21,3 +21,46 @@ modification date: 星期二 30日 四月 2024 10:16:59
- 着色器参数
## texture
通用描述:资源描述、资源实例
- 导入纹理
- 用做着色器输入
- 绑定描述符,暂时省略
- 用做渲染目标
- 依据资源描述构建渲染附件
- 自身纹理
- 用做渲染目标
- 多一步,从资源池中获取资源对象
### property
-
### function
## renderpass
### property
- key
- ::texture::
- colorFormat[8]
- depthFormat
- ::flags::
- clear
- discardStart[8]
- discardEnd[8]
- samples
- val
- pAttachments
- pSubpasses
- pDependencies
### function
- execute
- beginrenderpass

108
src/z/zengine/资源.md Normal file
View File

@ -0,0 +1,108 @@
---
aliases:
tags:
creation date: 2024-07-01 17:19
modification date: Monday 1st July 2024 17:19:43
---
# 资源
path是地址地址分为两部分小区名和房间号
guid 是身份证
resourcemanager 是网络平台,资源可通过 guid 交互,前提是对方处于上网状态(已加载)
filemanager 是地址管理平台通过path可以找到资源可能在本地也可能在外面也可能加密躲起来了
那么如何找到想要的资源呢?
- path
- 加载文件内的所有资源
- 如果资源不在呢?
- 支持异步下载、加解密
- 如果重复加载呢?
- 第一个人加载资源
- 加载列表会变化吗?当然可以,比如保存场景信息,客户端信息,客户端服务器优先校验信息
- 这里不支持热更变化,如有需求,请在上层实现
- 那么单个资源会变化吗?
- suffix
- .b
- 二机制数据
- .c
- 压缩数据
- 其他
- 其他数据由loader, resource_manager管理
- resource_manager
- 处理meta数据
- 调用loader
- loader
- 处理各类型数据 纹理、视频、音频
- 不同类型可以有不同的数据存储方式
- file_manager
- 需要存储各种变体吗不应该存储meta就够了双倍字符串
- 如果是不同的变体呢? 二进制 | 压缩 | HTTP谁来处理
- 变体类型从哪里存储呢?
- 先进行读
- 一个类型一个类型判断?
- guid
- 如果资源已加载就能找到
资源如果知道谁持有就可以通过guid找对方要否则需要记住path
## URL
- 路径
- 包名
- 相对路径
- 原始资源
- 一个文件一个资源一个meta
- 对象资源
- 一个文件任意对象资源
- 序列化 + 反序列化
- 代码资源
## Loader
### .obj
- .obj
- .meta
- model object
- mesh object
- mesh object
- .asset
- mesh property
- 如何标记为dirty
# 问题
## 如何统一读写数据?
- 二进制
- 文本
- 完整文件
- 文件分割
## 如何优化字符串? 占用空间大,查找、比较 慢
- 存储
- 引用
- 比较
- 查找