note update
This commit is contained in:
parent
d63af3eac3
commit
af0038b5e6
4
.obsidian/appearance_0.json
vendored
Normal file
4
.obsidian/appearance_0.json
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"accentColor": "",
|
||||||
|
"baseFontSize": 18
|
||||||
|
}
|
||||||
12
.obsidian/community-plugins_0.json
vendored
Normal file
12
.obsidian/community-plugins_0.json
vendored
Normal 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"
|
||||||
|
]
|
||||||
51
.obsidian/core-plugins.json
vendored
51
.obsidian/core-plugins.json
vendored
@ -1,21 +1,30 @@
|
|||||||
[
|
{
|
||||||
"file-explorer",
|
"file-explorer": true,
|
||||||
"global-search",
|
"global-search": true,
|
||||||
"switcher",
|
"switcher": true,
|
||||||
"graph",
|
"graph": true,
|
||||||
"backlink",
|
"backlink": true,
|
||||||
"canvas",
|
"canvas": true,
|
||||||
"outgoing-link",
|
"outgoing-link": true,
|
||||||
"tag-pane",
|
"tag-pane": true,
|
||||||
"properties",
|
"page-preview": true,
|
||||||
"page-preview",
|
"daily-notes": true,
|
||||||
"daily-notes",
|
"templates": true,
|
||||||
"templates",
|
"note-composer": true,
|
||||||
"note-composer",
|
"command-palette": true,
|
||||||
"command-palette",
|
"slash-command": false,
|
||||||
"editor-status",
|
"editor-status": true,
|
||||||
"bookmarks",
|
"bookmarks": true,
|
||||||
"outline",
|
"markdown-importer": false,
|
||||||
"word-count",
|
"zk-prefixer": false,
|
||||||
"file-recovery"
|
"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
22
.obsidian/graph_0.json
vendored
Normal 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
|
||||||
|
}
|
||||||
BIN
Assert/Image/image-20241224115033263.png
Normal file
BIN
Assert/Image/image-20241224115033263.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 92 KiB |
@ -85,4 +85,10 @@ Android Studio如何连接
|
|||||||
|
|
||||||
- 文件 studio64.exe.vmoptions
|
- 文件 studio64.exe.vmoptions
|
||||||
- 添加 `-Dfile.encoding=UTF-8`
|
- 添加 `-Dfile.encoding=UTF-8`
|
||||||
|
## 清单报错
|
||||||
|
|
||||||
|
- 如果项目中有多个模块或使用了第三方库,这些库的`AndroidManifest.xml`文件可能会与主项目的清单文件产生冲突。
|
||||||
|
- 在这种情况下,打开`build.gradle`中的`manifest`合并报告查看具体的冲突信息:
|
||||||
|
- 路径:`app/build/outputs/logs/manifest-merger-release-report.txt`
|
||||||
|
- 合并冲突通常发生在权限、`<application>`、`<activity>`等元素上,查看并手动解决冲突。
|
||||||
|
|
||||||
|
|||||||
@ -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
|
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
|
||||||
|
|
||||||
|
|||||||
@ -108,6 +108,10 @@ luapanda插件
|
|||||||
zhaoboshuang
|
zhaoboshuang
|
||||||
892st21t
|
892st21t
|
||||||
|
|
||||||
|
外网
|
||||||
|
zhaoboshuang
|
||||||
|
5xhs6ma3
|
||||||
|
|
||||||
## RTX
|
## RTX
|
||||||
|
|
||||||
企业实时通信
|
企业实时通信
|
||||||
@ -124,6 +128,11 @@ jg
|
|||||||
|
|
||||||
jghd123
|
jghd123
|
||||||
|
|
||||||
|
### 打包
|
||||||
|
192.168.101.212
|
||||||
|
devel
|
||||||
|
Rg7yQgjy
|
||||||
|
|
||||||
## \\192.168.1.212
|
## \\192.168.1.212
|
||||||
`\\192.168.101.212`
|
`\\192.168.101.212`
|
||||||
`\\192.168.1.212\Nei`
|
`\\192.168.1.212\Nei`
|
||||||
|
|||||||
@ -94,9 +94,17 @@ set CGO_LDFLAGS=-LF:\Coding\GoModule\cgo -I:vulkan.lib
|
|||||||
go build -o main.exe main.go
|
go build -o main.exe main.go
|
||||||
|
|
||||||
#C:\Users\Administrator\AppData\Roaming\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
15
src/m/me/密码.md
Normal 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
189
src/n/noesis.md
Normal 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
|
||||||
|
|
||||||
|
## 标记扩展
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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
15
src/s/shell/dumpbin.md
Normal 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
|
||||||
|
```
|
||||||
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
aliases:
|
|
||||||
tags:
|
|
||||||
creation date: 2024-01-17 13:47
|
|
||||||
modification date: 星期三 17日 一月 2024 13:47:00
|
|
||||||
---
|
|
||||||
# vulkanapi
|
|
||||||
|
|
||||||
## shader
|
|
||||||
|
|
||||||
23
src/v/vulkan/vulkan resource.md
Normal file
23
src/v/vulkan/vulkan resource.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
tags:
|
||||||
|
creation date: 2024-10-21 11:29
|
||||||
|
modification date: Monday 21st October 2024 11:29:12
|
||||||
|
---
|
||||||
|
# 内存管理
|
||||||
|
|
||||||
|
## 全局对象
|
||||||
|
全局光照、场景属性
|
||||||
|
- 更新
|
||||||
|
- 整体更新
|
||||||
|
- 存储
|
||||||
|
- 所有数据放到一个大结构体里,然后持有唯一的对象结构
|
||||||
|
## 普通对象
|
||||||
|
按照基础类型分类,通过对象池管理
|
||||||
|
- 更新
|
||||||
|
- 挨个更新
|
||||||
|
- 存储
|
||||||
|
- 一个类型一个对象池
|
||||||
|
## 大量同类对象
|
||||||
|
- 分组批量存储、偏移更新
|
||||||
|
-
|
||||||
77
src/v/vulkan/vulkan_guid.md
Normal file
77
src/v/vulkan/vulkan_guid.md
Normal 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
219
src/v/vulkan/描述符.md
Normal 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 可以根据描述符集内容动态调整资源。通过 vkCmdBindDescriptorSets,GPU 可以获得 uniform buffer 或纹理等资源的地址,并在着色器中使用这些数据。
|
||||||
|
|
||||||
|
通过这些步骤,Vulkan 确保了 CPU 和 GPU 间资源管理的高效性和灵活性。描述符机制在着色器和 GPU 之间提供了一个清晰的接口,使得资源管理既灵活又高效。
|
||||||
|
|
||||||
78
src/x/xmake/xmake bugfix.md
Normal file
78
src/x/xmake/xmake bugfix.md
Normal 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
40
src/z/zengine/体系.md
Normal 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
79
src/z/zengine/单例.md
Normal 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实现逻辑动态切换
|
||||||
|
|
||||||
|
# 链接
|
||||||
|
|
||||||
|
## 函数
|
||||||
|
|
||||||
|
- 普通函数直接拷贝是合适的
|
||||||
|
- 深拷贝,可能会导致变量不唯一
|
||||||
|
- 含静态变量的函数怎么办呢?
|
||||||
|
- 建议导出,确保变量的唯一性
|
||||||
|
|
||||||
|
## 变量
|
||||||
|
|
||||||
|
- 依然是深拷贝,可能会导致出现其他符号
|
||||||
|
- 变量是要保证唯一的
|
||||||
|
- 需要导出
|
||||||
|
|
||||||
|
## 流程
|
||||||
|
|
||||||
|
- 声明符号
|
||||||
|
- 声明符号,必须结合使用符号才有意义
|
||||||
|
- 使用符号
|
||||||
|
- 使用符号之前,必须先声明符号
|
||||||
|
- 才能知道从何处查找符号
|
||||||
|
- 定义符号
|
||||||
|
- 同时包含了声明与使用符号
|
||||||
|
- 多重定义
|
||||||
|
- 多个相同符号不一定会造成多重定义,链接时是有范围的,范围外的符号不会参与链接
|
||||||
|
- 但是使用符号时,多个相同符号才会导致多重定义
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
220
src/z/zengine/引擎文档.md
Normal file
220
src/z/zengine/引擎文档.md
Normal 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):
|
||||||
|
|
||||||
|
- 如 SSBO(Shader Storage Buffer Objects)和 UBO(Uniform 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 也会变大哈
|
||||||
@ -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
108
src/z/zengine/资源.md
Normal 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
|
||||||
|
|
||||||
|
# 问题
|
||||||
|
|
||||||
|
## 如何统一读写数据?
|
||||||
|
|
||||||
|
- 二进制
|
||||||
|
- 文本
|
||||||
|
- 完整文件
|
||||||
|
- 文件分割
|
||||||
|
|
||||||
|
## 如何优化字符串? 占用空间大,查找、比较 慢
|
||||||
|
|
||||||
|
- 存储
|
||||||
|
- 引用
|
||||||
|
- 比较
|
||||||
|
- 查找
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user