查看: 1438|回复: 5

2.9.10版GLBufferObject::compileBuffer()中BufferEntry的更新问题

[复制链接]

该用户从未签到

发表于 2010-12-27 00:28:53 | 显示全部楼层 |阅读模式
在GLBufferObject::compileBuffer()中,判断BufferEntry的dataSource是否改变仅从其指针地址和大小来判断合理吗(蓝色部分),

....................
    for(; i<_bufferObject->getNumBufferData(); ++i)
    {
        BufferData* bd = _bufferObject->getBufferData(i);
        if (i<_bufferEntries.size())
        {
            BufferEntry& entry = _bufferEntries;
            if (offsetChanged ||
                entry.dataSource != bd ||
                entry.dataSize != bd->getTotalDataSize())
            {
                unsigned int previousEndOfBufferDataMarker = entry.offset + entry.dataSize;

.................

该用户从未签到

发表于 2010-12-27 08:48:31 | 显示全部楼层
能否给出一些前因后果?您遇到了什么问题?抑或您通过什么样的实验发现了问题?

该用户从未签到

 楼主| 发表于 2010-12-27 09:46:13 | 显示全部楼层
谢谢这么快回复!
暂时没有,只是看代码觉得欠妥。
如果
1、改变了BufferData的数据内容,但地址和大小没变
2、同一地址被删除后又重新分配,且数据大小和原先的一样,又被加入到BufferObject中的BufferData Vector的同一位置时
是否会出现不能更新GPU中的缓存数据

该用户从未签到

发表于 2010-12-27 16:49:32 | 显示全部楼层
事实上compileBuffer只有当isDirty()为true时才会被执行,而isDirty()是否为真是由用户决定的:例如我们在使用VBO表达顶点数据时,如果数据的内容发生了改变,我们会执行array->dirty()来强制要求更新——这时候才会执行compileBuffer(),我们可以确定此时它的内容已经改变了

如果我们没有执行dirty(),那么不会自动更新

该用户从未签到

发表于 2010-12-27 17:20:11 | 显示全部楼层
奥,这样啊~~

该用户从未签到

 楼主| 发表于 2010-12-27 23:34:16 | 显示全部楼层
看了后面的代码
............
if (compileAll || entry.modifiedCount != entry.dataSource->getModifiedCount())
.................
应该是通过modifiedCount来甄别的
BufferEntry的modifiedCount初始值为0xffffff
BufferData的modifiedCount初始值为0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表