Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

新渲染系统 #643

Merged
merged 183 commits into from
Apr 3, 2024
Merged

新渲染系统 #643

merged 183 commits into from
Apr 3, 2024

Conversation

Blinue
Copy link
Owner

@Blinue Blinue commented Jun 5, 2023

这个 PR 将重写渲染架构以优化使用重量级效果时的流畅度以及提高可拓展性。

现有架构:

flowchart LR
    捕获((捕获))
    呈现((呈现))
    捕获-->应用效果/绘制光标
    应用效果/绘制光标-->游戏内叠加层
    游戏内叠加层-->呈现
    呈现-->捕获
Loading

新架构:

flowchart LR
    subgraph 呈现线程
    呈现((呈现))
    共享纹理{共享纹理}
   后缓冲{后缓冲}
    共享纹理--拷贝-->后缓冲
    后缓冲-->游戏内叠加层
    游戏内叠加层-->绘制光标
    绘制光标-->呈现
    呈现-->后缓冲
    end
    subgraph 渲染线程
    捕获((捕获))
    捕获-->应用效果
    应用效果--拷贝-->共享纹理
    应用效果-->捕获
    end
Loading
  1. 两个 D3D 设备,两个渲染管线。一个负责捕获和应用效果,另一个负责绘制游戏内叠加层和光标以及呈现到屏幕。
  2. 对于渲染线程(后端)
    • 应用效果可能非常昂贵
    • 渲染完成后拷贝到共享纹理
    • 可以限制捕获帧率以降低功耗,不会影响光标渲染
    • 计算管线
  3. 对于呈现线程(前端)
    • 会以高于屏幕刷新率的速度循环以降低光标延迟
    • 图形管线
  4. 对于轻量的效果不会提高性能,反而会消耗更多显存,因此不适合 3D 游戏。
  5. 渲染线程和呈现线程可以使用不同的显卡。集成显卡负责呈现,独立显卡负责渲染。我相信这可以有效提高性能。

其他更改:

  1. 删除垂直同步和允许额外的延迟选项。
  2. 添加限制帧率选项。
  3. 删除默认降采样算法选项,现在始终是 Catmull-Rom。

@Blinue Blinue added the enhancement New feature or request label Jun 5, 2023
@Blinue Blinue marked this pull request as draft June 6, 2023 15:24
@Blinue
Copy link
Owner Author

Blinue commented Jun 11, 2023

MagpieFX 的变化:

  1. 不再支持 GetCursorPos、MP_LAST_EFFECT、MP_LAST_PASS、WriteToOutput、CheckViewport、GENERIC_DOWNSCALER
  2. 特殊关键字 OUTPUT,不再支持 OUTPUT_WIDTH 和 OUTPUT_HEIGHT,改为指定 OUTPUT 的尺寸。OUTPUT 不能作为通道的输入。最后一个通道不再需要调用 WriteToOutput,应直接写入 OUTPUT,最后一个通道的输出只能是 OUTPUT。
    //!TEXTURE
    //!WIDTH INPUT_WIDTH * 2
    //!HEIGHT INPUT_HEIGHT * 2
    Texture2D OUTPUT;

@Blinue
Copy link
Owner Author

Blinue commented Jun 12, 2023

使用 D3D11 在 GPU 之间共享纹理似乎是不可能的,我只得到这个错误:
D3D11 ERROR: ID3D11Device::OpenSharedResource: Returning E_INVALIDARG, meaning invalid parameters were passed. [ STATE_CREATION ERROR #381: DEVICE_OPEN_SHARED_RESOURCE_INVALIDARG_RETURN]

通过内存传输纹理在性能上无法接受,因此渲染线程和呈现线程必须使用同一个显卡。(D3D12 有共享堆,D3D11 中没有等价物。)

更新:这个文档明确指出 DXGI 的共享纹理只能在同一个适配器上访问。

@Blinue
Copy link
Owner Author

Blinue commented Jun 13, 2023

旧架构允许输出尺寸大于屏幕尺寸,现在不再支持,因为会大幅增加鼠标逻辑的复杂度。我也会删除默认降采样效果选项,现在始终是 Catmull-Rom。Bicubic 将内置,没有效果文件。

@Blinue
Copy link
Owner Author

Blinue commented Mar 25, 2024

Bicubic 将内置,没有效果文件。

Bicubic 不再内置了,我计划在未来不再支持用户修改效果文件,并实现一个机制来导入用户效果。

@Blinue
Copy link
Owner Author

Blinue commented Mar 25, 2024

现在所有功能都已实现,虽然还有一些 bug,但不影响使用,可以合并后再修复。

@Blinue Blinue marked this pull request as ready for review March 25, 2024 13:48
Blinue and others added 17 commits March 26, 2024 09:03
* refactor: 简化 ScalingRuntime

* fix: 修复特定情况下退出时死锁的问题
* feat: 优化对最大化窗口的支持

* feat: 捕捉标题栏时去除边框

* feat: 非最大化的窗口自动裁剪上边框

* perf: 性能优化

* fix: 错误修复

* fix: 修复警告

* fix: 尝试修复 Graphics Capture 的捕获区域

* feat: 适配 Win11 的捕获区域

* fix: 添加检查
* feat: 支持自定义形状窗口,修复对原生标题栏的支持

* fix: 优化鼠标行为

* chore: 删除不必要的调用

* fix: 修复开始和退出缩放时光标位置变化

* chore: 微小调整

* chore: 添加注释
* fix: 修复鼠标移动到叠加层或其他窗口时有时会跳跃的问题

* perf: 性能优化
* test

* perf: 优化流畅度

* chore: 修复编译警告

* test

* perf: 简化状态

* perf: 稍微优化 Renderer 的同步性能

* fix: 优化计时器精度

* fix: 优化调试模式下光标行为

* test

* chore

* perf

* fix: 错误处理
@Blinue
Copy link
Owner Author

Blinue commented Apr 3, 2024

新的渲染系统很棒,超出了我的预想,感谢参与贡献、测试的你们!很快会有预览版本🥳

@Blinue Blinue merged commit 65e5bd8 into dev Apr 3, 2024
4 checks passed
@Blinue Blinue deleted the render-system branch April 3, 2024 11:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Keyboard/controller input breaks down with FSR-filters
4 participants