1.3 KiB
1.3 KiB
OpenGLBuffer::SetData()
void SetData(const void* data, size_t size, size_t offset = 0) override;
作用
更新当前 buffer 的全部或部分内容。
参数
data: 源数据指针。size: 要写入的字节数。offset: 写入偏移。
当前实现行为
函数会先绑定目标,然后分两种路径:
- 当
offset == 0 && size == m_size时,调用glBufferData(target, size, data, usage),相当于整块重建存储。 - 其他情况调用
glBufferSubData(target, offset, size, data),相当于局部更新。
最后它会解绑目标。
重要限制
- 不会检查
offset + size是否越界。 - 不会在局部更新后修改
m_size。 - 如果传入一个和原始大小不同、但又不是“整块覆盖”的写入请求,函数仍然会走
glBufferSubData(),其合法性完全交给驱动。 usage依然只取决于最初初始化时的m_dynamic。
设计说明
很多引擎会把“重建存储”和“局部上传”明确拆成两个接口,因为它们在性能和资源生命周期上的语义并不相同。当前这里把两条路径折叠到一起,优点是简单,缺点是行为边界需要通过文档讲清楚。