7个版本
0.0.0-unsound.5 | 2022年1月21日 |
---|---|
0.0.0-unsound.4 | 2022年1月9日 |
0.0.0-reserved | 2020年12月2日 |
0.0.0-2022-09-30 | 2022年9月30日 |
#58 in Windows API
1.5MB
10K SLoC
thindx - 轻量级 DirectX 包装器
Rust的轻量级DirectX包装器。
为什么不直接使用 winapi 呢?
- 此crate旨在尽可能使函数安全/正确/略微Rust化。
- 通过大量单元测试尝试验证API的正确性,即使它们主要测试DirectX的行为。
- 文档注释为一站式智能感知、安全文档等。
为什么不使用 <其他图形 crate>
呢?
- 大多数其他图形crate都专注于尽可能多地隐藏底层图形API,以提高应用程序的可移植性。
- 此crate尽可能多地暴露底层图形API,以提高与其他图形代码/中间件应用程序交互的可能性。
❌ 此crate可能不正确!❌
我在将庞大的C++ API暴露给Rust。错误会发生。
尽管如此,正确性是一个 非常高的目标。 thindx
将在需要时添加一些东西,如额外的边界检查、参数验证、额外的初始化等,以确保尽可能在安全函数中保持正确性。当无法验证不正确性时,相关的函数应标记为 unsafe
。此crate力求比你自己编写的任何手动FFI更加正确,这是一个 很高的 标准。
但是,这里有一些实际的限制。如果一个后台驱动线程在没有直接关联到特定API误用(如大整数溢出)的情况下,由于无法分配内存而引发UB,那么我无法通过安全函数合理地缓解这个错误。我的意思是,理论上我可以编写DirectX运行时的纯软件克隆...但不会。
此外,虽然我在寻求通过测试验证我的API,但有关API的旧实现可能存在更多错误/未检查的参数/等等,我可能无法通过无法触发它们自己来缓解这些问题。虽然我很乐意进行调查、接受pull请求、扩展测试覆盖率等,但除非你自己测试过,否则值得假设此crate在旧版本中不正确。
⚠️ API主要版本变更 ⚠️
单个fn
函数可能会在无尽的尝试中获取/失去unsafe
、特性和等,以使DirectX访问听起来更好。因此,thindx
自身可能会一直受到主要版本更替的影响。这并不是一个大问题,直到两个crate想要在彼此之间共享/传递thindx
类型。可能通过将它们放逐到子crate中,在一定程度上稳定一些类型,但这尚未实现。此外,单个扩展特型/函数/方法可能永远不会得到同样的待遇(不需要?)
项目状态
示例 • 头文件覆盖率 • docs.rs • lib.rs • crates.io
DirectX | API | 测试 | 声音 | 稳定 | 备注 |
---|---|---|---|---|---|
d3dcompiler.dll |
✔️ | ⚠️ | ⚠️ | ❌ | 首要目标是稳定 |
dxcompiler.dll |
❌ | ❌ | ❌ | ❌ | |
d3d9 | ⚠️ | ⚠️ | ❌ | ❌ | |
d3d11 | ❌ | ❌ | ❌ | ❌ | |
d3d12 | ❌ | ❌ | ❌ | ❌ | |
dxgi | ❌ | ❌ | ❌ | ❌ | |
dinput | ❌ | ❌ | ❌ | ❌ | |
xinput | ✔️ | ✔️ | ✔️* | ⚠️ | * 在较旧的Windows上可能需要更多测试 |
xaudio2 | ❌ | ❌ | ❌ | ❌ | |
低优先级 | |||||
d2d | 我更喜欢d3d包装器? | ||||
dcompute | |||||
dsound | 更喜欢xaudio2?(可能需要用于游戏手柄耳机音频?) | ||||
dwrite | 考虑uniscribe? | ||||
dxr | |||||
xact3 | |||||
未计划 | 不过,请随意改变我的想法!也许可以用$? | ||||
d3d10 | d3d11与d3d10相同但更合理,而且同样易于移植? | ||||
d3dx10 | 已弃用,使用更少的d3d特定功能更合理 | ||||
d3dx11 | 已弃用,使用更少的d3d特定功能更合理 | ||||
d3dx9 | 已弃用,使用更少的d3d特定功能更合理 | ||||
ddraw | 更喜欢d2d、gdi或其他较不古老的API? | ||||
dplay | 更喜欢steamworks、原始套接字等? | ||||
xaudio1 | 这甚至存在吗?更喜欢xaudio2 |
图例 | 描述 |
---|---|
API | API覆盖率似乎基本完整 |
测试 | API有基本测试 |
声音 | API有足够的测试来使我确信它的可靠性 |
稳定 | API看起来足够稳定,可以开始提供semver待遇 |
许可证
根据您的选择,受以下许可证之一许可
- Apache许可证,版本2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交以包含在作品中的任何贡献,均将根据上述方式双许可,而不附加任何其他条款或条件。