51 lines
1.1 KiB
Markdown
51 lines
1.1 KiB
Markdown
|
|
# OpenGLFence::Wait
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
void Wait(uint64_t timeoutNs) override;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
等待栅栏达到 signaled 状态或超时。
|
|||
|
|
|
|||
|
|
## 详细描述
|
|||
|
|
|
|||
|
|
此方法尝试等待 `m_sync`(OpenGL 同步对象)变为 signaled 状态:
|
|||
|
|
|
|||
|
|
- **未信号或无同步对象**:直接调用 `glFinish()` 阻塞 CPU,直到 GPU 完成所有命令,然后将 `m_completedValue` 更新为 `m_fenceValue`
|
|||
|
|
- **已信号状态**:调用 `glClientWaitSync()` 尝试获取同步状态,支持超时
|
|||
|
|
- **timeout = 0**:立即返回,不阻塞
|
|||
|
|
|
|||
|
|
内部使用 `GL_SYNC_FLUSH_COMMANDS_BIT` 标志确保客户端命令已刷新。
|
|||
|
|
|
|||
|
|
## 参数
|
|||
|
|
|
|||
|
|
| 参数 | 类型 | 描述 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| `timeoutNs` | `uint64_t` | 超时时间,以纳秒为单位。为 `0` 时立即返回 |
|
|||
|
|
|
|||
|
|
## 返回值
|
|||
|
|
|
|||
|
|
无
|
|||
|
|
|
|||
|
|
## 示例
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
OpenGLFence fence;
|
|||
|
|
fence.Initialize(false);
|
|||
|
|
fence.Signal();
|
|||
|
|
|
|||
|
|
// 等待最多 1 秒 (1000000000 ns)
|
|||
|
|
fence.Wait(1000000000);
|
|||
|
|
|
|||
|
|
// 等待最多 100 毫秒
|
|||
|
|
fence.Wait(100000000);
|
|||
|
|
|
|||
|
|
// timeout = 0 立即返回
|
|||
|
|
fence.Wait(0);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 相关文档
|
|||
|
|
|
|||
|
|
- [OpenGLFence 总览](fence.md) - 返回类总览
|
|||
|
|
- [Signal](signal.md) - 信号栅栏
|
|||
|
|
- [IsSignaled](is-signaled.md) - 非阻塞检查状态
|