这个例子比较有用,平均了三维场景CPU和GPU的花费。
进入GraphicsCostEstimator这个类,
CostPair estimateCompileCost(const osg::Geometry* geometry) const { return
_geometryEstimator->estimateCompileCost(geometry); }
CostPair estimateDrawCost
(const osg::Geometry* geometry) const { return _geometryEstimator->estimateDrawCost
(geometry); }
CostPair estimateCompileCost(const osg::Texture* texture) const {
return _textureEstimator->estimateCompileCost(texture); }
CostPair
estimateDrawCost(const osg::Texture* texture) const { return _textureEstimator-
>estimateDrawCost(texture); }
CostPair estimateCompileCost(const osg::Program*
program) const { return _programEstimator->estimateCompileCost(program); }
CostPair estimateDrawCost(const osg::Program* program) const { return
_programEstimator->estimateDrawCost(program); }
CostPair estimateCompileCost
(const osg::Node* node) const;
CostPair estimateDrawCost(const osg::Node* node)
const;
对Geometry、Texture、Program和Node的编译和绘制都做了评估。
typedef std::pair<double, double> CostPair;
代表CPU和GPU所花的时间。
GraphicsCostEstimator负责评估Geometry、Texture、Program、Node编译和绘制所用的时间。
CollectCompileCosts这个类是计算时间的类,继承自osg::NodeVisitor,先来回忆一下
osg::NodeVisitor,它是一个访问者模式,节点accept它,它就可以通过apply函数实现相应的
功能。NodeCallback就是通过NodeVisitor实现,只是在没一帧的更新回调中都调用了这个
accept递归遍历。
我们回到这个例子,这个例子统计的时间并不是运行时统计的,而是事先定制好了一些基本的时
间,然后通过Geometry、Texture、Program、Node中的数据量。
看GeometryCostEstimator的setDefaults函数:
void GeometryCostEstimator::setDefaults()
{
double transfer_bandwidth =
10000000000.0; // 1GB/sec
double gpu_bandwidth = 50000000000.0; // 50 GB/second
double min_time = 0.00001; // 10 nano seconds.
_arrayCompileCost.set(min_time,
1.0/transfer_bandwidth, 256); // min time 1/10th of millisecond, min size 256
_primtiveSetCompileCost.set(min_time, 1.0/transfer_bandwidth, 256); // min time
1/10th of millisecond, min size 256
_arrayDrawCost.set(min_time,
1.0/gpu_bandwidth, 256); // min time 1/10th of millisecond, min size 256;
_primtiveSetDrawCost.set(min_time, 1.0/gpu_bandwidth, 256); // min time 1/10th of
millisecond, min size 256;
_displayListCompileConstant = 0.0;
_displayListCompileFactor = 10.0;
}
通过这些基本的单位时间,计算总体的时间。
进入GraphicsCostEstimator这个类,
CostPair estimateCompileCost(const osg::Geometry* geometry) const { return
_geometryEstimator->estimateCompileCost(geometry); }
CostPair estimateDrawCost
(const osg::Geometry* geometry) const { return _geometryEstimator->estimateDrawCost
(geometry); }
CostPair estimateCompileCost(const osg::Texture* texture) const {
return _textureEstimator->estimateCompileCost(texture); }
CostPair
estimateDrawCost(const osg::Texture* texture) const { return _textureEstimator-
>estimateDrawCost(texture); }
CostPair estimateCompileCost(const osg::Program*
program) const { return _programEstimator->estimateCompileCost(program); }
CostPair estimateDrawCost(const osg::Program* program) const { return
_programEstimator->estimateDrawCost(program); }
CostPair estimateCompileCost
(const osg::Node* node) const;
CostPair estimateDrawCost(const osg::Node* node)
const;
对Geometry、Texture、Program和Node的编译和绘制都做了评估。
typedef std::pair<double, double> CostPair;
代表CPU和GPU所花的时间。
GraphicsCostEstimator负责评估Geometry、Texture、Program、Node编译和绘制所用的时间。
CollectCompileCosts这个类是计算时间的类,继承自osg::NodeVisitor,先来回忆一下
osg::NodeVisitor,它是一个访问者模式,节点accept它,它就可以通过apply函数实现相应的
功能。NodeCallback就是通过NodeVisitor实现,只是在没一帧的更新回调中都调用了这个
accept递归遍历。
我们回到这个例子,这个例子统计的时间并不是运行时统计的,而是事先定制好了一些基本的时
间,然后通过Geometry、Texture、Program、Node中的数据量。
看GeometryCostEstimator的setDefaults函数:
void GeometryCostEstimator::setDefaults()
{
double transfer_bandwidth =
10000000000.0; // 1GB/sec
double gpu_bandwidth = 50000000000.0; // 50 GB/second
double min_time = 0.00001; // 10 nano seconds.
_arrayCompileCost.set(min_time,
1.0/transfer_bandwidth, 256); // min time 1/10th of millisecond, min size 256
_primtiveSetCompileCost.set(min_time, 1.0/transfer_bandwidth, 256); // min time
1/10th of millisecond, min size 256
_arrayDrawCost.set(min_time,
1.0/gpu_bandwidth, 256); // min time 1/10th of millisecond, min size 256;
_primtiveSetDrawCost.set(min_time, 1.0/gpu_bandwidth, 256); // min time 1/10th of
millisecond, min size 256;
_displayListCompileConstant = 0.0;
_displayListCompileFactor = 10.0;
}
通过这些基本的单位时间,计算总体的时间。