osg::buffered_value
是OpenSceneGraph中的一个类,用于保存值和历史、缓冲区。它支持跟踪和记录值的变化和历史,并提供了多个方法来访问当前值和历史。
osg::buffered_value
被设计用作OpenSceneGraph中状态的一个重要组成部分,例如底层数据的缓存。它包含以下属性:
创建一个osg::buffered_value
对象的方式如下:
osg::buffered_value<T> value(initialValue, bufferSize);
其中,T
是值的类型。initialValue
是T
类型的初值,bufferSize
是缓冲区的大小。
可以使用以下方法设置和获取osg::buffered_value
对象的值:
value.set(newValue);
设置value
的值为newValue
。
value.kick();
清空缓冲区和历史记录,并将当前值设为value
的当前值。
T current = value;
获取value
的当前值。
可以使用以下方法访问缓冲区和历史记录:
unsigned int size = value.getBufferSize();
获取value
缓冲区的大小。
std::vector<T>& history = value.getBuffer();
获取value
历史记录的引用。
bool hasNewerValue = value.hasNewerValues();
返回value
是否有更新的值。
osg::buffered_value<T>::UpdateOperation op = value.beginNewValue();
if (op==osg::buffered_value<T>::SET) {
// 当前值被设置为新值
} else if (op==osg::buffered_value<T>::INCREMENT) {
// 当前值被增加新值
} else if (op==osg::buffered_value<T>::DECREMENT) {
// 当前值被减小新值
}
获取一个osg::buffered_value<T>::UpdateOperation
枚举值,表示当前值与上一次保存的值之间的更新操作。
osg::buffered_value
还提供了一些方法,用于序列化和反序列化缓冲区和当前值:
bool valueWithinBuffer = value.getBufferedValue(newValue, timestamp);
得到的值将是离站最近的时间戳。如果该时间戳在缓冲区中,则将该值存储在newValue中,并返回true。如果该时间戳不在缓冲区中,则返回false。
bool setValueAccepted = value.setBufferedValue(newValue, timestamp);
将newValue
保存到value
的缓冲区,并将时间戳设置为timestamp
。
std::string valueAsString = value.serialise();
将value
序列化为字符串。
bool success = value.deserialise(valueAsString);
将字符串valueAsString
反序列化为value
。如果反序列化成功,则返回true;否则返回false。
#include <iostream>
#include <osg/buffered_value>
int main(int argc, char** argv)
{
// 创建一个缓冲区大小为5的整型缓冲区
osg::buffered_value<int> value(0, 5);
for (int i=0; i<20; ++i) {
std::cout << "Current value: " << value << ", History: ";
for (unsigned int j=0; j<value.getBufferSize(); ++j) {
std::cout << value.getBuffer()[j] << " ";
}
std::cout << std::endl;
value = i;
if (value.hasNewerValues()) {
// 处理新值
osg::buffered_value<int>::UpdateOperation op = value.beginNewValue();
if (op==osg::buffered_value<int>::SET) {
std::cout << "New value set: " << value << std::endl;
} else if (op==osg::buffered_value<int>::INCREMENT) {
std::cout << "New value incremented: " << value << std::endl;
} else if (op==osg::buffered_value<int>::DECREMENT) {
std::cout << "New value decremented: " << value << std::endl;
}
}
}
return 0;
}
上述示例将输出以下内容:
Current value: 0, History:
Current value: 1, History: 0
New value set: 1
Current value: 2, History: 0 1
New value set: 2
Current value: 3, History: 0 1 2
New value set: 3
Current value: 4, History: 0 1 2 3
New value set: 4
Current value: 5, History: 0 1 2 3 4
New value set: 5
Current value: 6, History: 1 2 3 4 5
New value set: 6
Current value: 7, History: 2 3 4 5 6
New value set: 7
Current value: 8, History: 3 4 5 6 7
New value set: 8
Current value: 9, History: 4 5 6 7 8
New value set: 9
Current value: 10, History: 5 6 7 8 9
New value set: 10
Current value: 11, History: 6 7 8 9 10
New value set: 11
Current value: 12, History: 7 8 9 10 11
New value set: 12
Current value: 13, History: 8 9 10 11 12
New value set: 13
Current value: 14, History: 9 10 11 12 13
New value set: 14
Current value: 15, History: 10 11 12 13 14
New value set: 15
Current value: 16, History: 11 12 13 14 15
New value set: 16
Current value: 17, History: 12 13 14 15 16
New value set: 17
Current value: 18, History: 13 14 15 16 17
New value set: 18
Current value: 19, History: 14 15 16 17 18
New value set: 19