mirror of
https://github.com/yse/easy_profiler.git
synced 2024-12-27 08:41:02 +08:00
(GUI) Less buggy and more efficient recursive painting algorithm for blocks at diagram. Test mode.
Note: with recursive algorithm it is possible to iterate through blocks in parallel to make painting just more efficient - this is my future todo
This commit is contained in:
parent
5a14887ec8
commit
bf7bf10b80
@ -479,7 +479,8 @@ void EasyGraphicsView::setTree(const ::profiler::thread_blocks_tree_t& _blocksTr
|
|||||||
|
|
||||||
if (!t.children.empty())
|
if (!t.children.empty())
|
||||||
{
|
{
|
||||||
children_duration = setTree(item, t.children, h, y, 0);
|
uint32_t dummy = 0;
|
||||||
|
children_duration = setTree(item, t.children, h, dummy, y, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -551,7 +552,7 @@ const EasyGraphicsView::Items &EasyGraphicsView::getItems() const
|
|||||||
return m_items;
|
return m_items;
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal EasyGraphicsView::setTree(EasyGraphicsItem* _item, const ::profiler::BlocksTree::children_t& _children, qreal& _height, qreal _y, short _level)
|
qreal EasyGraphicsView::setTree(EasyGraphicsItem* _item, const ::profiler::BlocksTree::children_t& _children, qreal& _height, uint32_t& _maxDepthChild, qreal _y, short _level)
|
||||||
{
|
{
|
||||||
if (_children.empty())
|
if (_children.empty())
|
||||||
{
|
{
|
||||||
@ -562,6 +563,8 @@ qreal EasyGraphicsView::setTree(EasyGraphicsItem* _item, const ::profiler::Block
|
|||||||
const auto n = static_cast<unsigned int>(_children.size());
|
const auto n = static_cast<unsigned int>(_children.size());
|
||||||
_item->reserve(level, n);
|
_item->reserve(level, n);
|
||||||
|
|
||||||
|
_maxDepthChild = 0;
|
||||||
|
uint16_t maxDepth = 0;
|
||||||
const short next_level = _level + 1;
|
const short next_level = _level + 1;
|
||||||
bool warned = false;
|
bool warned = false;
|
||||||
qreal total_duration = 0, prev_end = 0, maxh = 0;
|
qreal total_duration = 0, prev_end = 0, maxh = 0;
|
||||||
@ -571,6 +574,11 @@ qreal EasyGraphicsView::setTree(EasyGraphicsItem* _item, const ::profiler::Block
|
|||||||
{
|
{
|
||||||
auto& gui_block = easyBlock(child_index);
|
auto& gui_block = easyBlock(child_index);
|
||||||
const auto& child = gui_block.tree;
|
const auto& child = gui_block.tree;
|
||||||
|
if (child.depth > maxDepth)
|
||||||
|
{
|
||||||
|
maxDepth = child.depth;
|
||||||
|
_maxDepthChild = j;
|
||||||
|
}
|
||||||
|
|
||||||
auto xbegin = time2position(child.node->begin());
|
auto xbegin = time2position(child.node->begin());
|
||||||
if (start_time < 0)
|
if (start_time < 0)
|
||||||
@ -609,10 +617,11 @@ qreal EasyGraphicsView::setTree(EasyGraphicsItem* _item, const ::profiler::Block
|
|||||||
|
|
||||||
qreal h = 0;
|
qreal h = 0;
|
||||||
qreal children_duration = 0;
|
qreal children_duration = 0;
|
||||||
|
uint32_t maxDepthChild = 0;
|
||||||
|
|
||||||
if (next_level < 256)
|
if (next_level < 256)
|
||||||
{
|
{
|
||||||
children_duration = setTree(_item, child.children, h, _y + ::profiler_gui::GRAPHICS_ROW_SIZE_FULL, next_level);
|
children_duration = setTree(_item, child.children, h, maxDepthChild, _y + ::profiler_gui::GRAPHICS_ROW_SIZE_FULL, next_level);
|
||||||
}
|
}
|
||||||
else if (!child.children.empty() && !warned)
|
else if (!child.children.empty() && !warned)
|
||||||
{
|
{
|
||||||
@ -631,10 +640,16 @@ qreal EasyGraphicsView::setTree(EasyGraphicsItem* _item, const ::profiler::Block
|
|||||||
}
|
}
|
||||||
|
|
||||||
b.block = child_index;// &child;
|
b.block = child_index;// &child;
|
||||||
|
|
||||||
|
#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT
|
||||||
b.neighbours = n;
|
b.neighbours = n;
|
||||||
|
b.state = j > 0 || level == 0 ? 0 : -1;
|
||||||
|
#else
|
||||||
|
b.max_depth_child = maxDepthChild;
|
||||||
|
#endif
|
||||||
|
|
||||||
b.setPos(xbegin, duration);
|
b.setPos(xbegin, duration);
|
||||||
//b.totalHeight = ::profiler_gui::GRAPHICS_ROW_SIZE + h;
|
//b.totalHeight = ::profiler_gui::GRAPHICS_ROW_SIZE + h;
|
||||||
b.state = j > 0 || level == 0 ? 0 : -1;
|
|
||||||
|
|
||||||
prev_end = xbegin + duration;
|
prev_end = xbegin + duration;
|
||||||
total_duration = prev_end - start_time;
|
total_duration = prev_end - start_time;
|
||||||
|
@ -193,7 +193,7 @@ private:
|
|||||||
void scaleTo(qreal _scale);
|
void scaleTo(qreal _scale);
|
||||||
void scrollTo(const EasyGraphicsItem* _item);
|
void scrollTo(const EasyGraphicsItem* _item);
|
||||||
void onWheel(qreal _mouseX, int _wheelDelta);
|
void onWheel(qreal _mouseX, int _wheelDelta);
|
||||||
qreal setTree(EasyGraphicsItem* _item, const ::profiler::BlocksTree::children_t& _children, qreal& _height, qreal _y, short _level);
|
qreal setTree(EasyGraphicsItem* _item, const ::profiler::BlocksTree::children_t& _children, qreal& _height, uint32_t& _maxDepthChild, qreal _y, short _level);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
|
@ -152,15 +152,24 @@ inline ::profiler::color_t textColorForRgb(::profiler::color_t _color)
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define EASY_GRAPHICS_ITEM_RECURSIVE_PAINT
|
||||||
|
//#undef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
struct EasyBlockItem Q_DECL_FINAL
|
struct EasyBlockItem Q_DECL_FINAL
|
||||||
{
|
{
|
||||||
qreal x; ///< x coordinate of the item (this is made qreal=double to avoid mistakes on very wide scene)
|
qreal x; ///< x coordinate of the item (this is made qreal=double to avoid mistakes on very wide scene)
|
||||||
float w; ///< Width of the item
|
float w; ///< Width of the item
|
||||||
::profiler::block_index_t block; ///< Index of profiler block
|
::profiler::block_index_t block; ///< Index of profiler block
|
||||||
|
|
||||||
|
#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT
|
||||||
::profiler::block_index_t neighbours; ///< Number of neighbours (parent.children.size())
|
::profiler::block_index_t neighbours; ///< Number of neighbours (parent.children.size())
|
||||||
uint32_t children_begin; ///< Index of first child item on the next sublevel
|
uint32_t children_begin; ///< Index of first child item on the next sublevel
|
||||||
int8_t state; ///< 0 = no change, 1 = paint, -1 = do not paint
|
int8_t state; ///< 0 = no change, 1 = paint, -1 = do not paint
|
||||||
|
#else
|
||||||
|
::profiler::block_index_t max_depth_child; ///< Index of child with maximum tree depth
|
||||||
|
uint32_t children_begin; ///< Index of first child item on the next sublevel
|
||||||
|
#endif
|
||||||
|
|
||||||
// Possible optimizations:
|
// Possible optimizations:
|
||||||
// 1) We can save 1 more byte per block if we will use char instead of short + real time calculations for "totalHeight" var;
|
// 1) We can save 1 more byte per block if we will use char instead of short + real time calculations for "totalHeight" var;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -61,10 +61,12 @@ class EasyGraphicsView;
|
|||||||
class EasyGraphicsItem : public QGraphicsItem
|
class EasyGraphicsItem : public QGraphicsItem
|
||||||
{
|
{
|
||||||
typedef ::profiler_gui::EasyItems Children;
|
typedef ::profiler_gui::EasyItems Children;
|
||||||
typedef ::std::vector<unsigned int> DrawIndexes;
|
typedef ::std::vector<uint32_t> DrawIndexes;
|
||||||
|
typedef ::std::vector<qreal> RightBounds;
|
||||||
typedef ::std::vector<Children> Sublevels;
|
typedef ::std::vector<Children> Sublevels;
|
||||||
|
|
||||||
DrawIndexes m_levelsIndexes; ///< Indexes of first item on each level from which we must start painting
|
DrawIndexes m_levelsIndexes; ///< Indexes of first item on each level from which we must start painting
|
||||||
|
RightBounds m_rightBounds; ///<
|
||||||
Sublevels m_levels; ///< Arrays of items for each level
|
Sublevels m_levels; ///< Arrays of items for each level
|
||||||
|
|
||||||
QRectF m_boundingRect; ///< boundingRect (see QGraphicsItem)
|
QRectF m_boundingRect; ///< boundingRect (see QGraphicsItem)
|
||||||
@ -158,6 +160,10 @@ private:
|
|||||||
///< Returns pointer to the EasyGraphicsView widget.
|
///< Returns pointer to the EasyGraphicsView widget.
|
||||||
const EasyGraphicsView* view() const;
|
const EasyGraphicsView* view() const;
|
||||||
|
|
||||||
|
#ifdef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT
|
||||||
|
void paintChildren(const float _minWidth, const int _narrowSizeHalf, const uint8_t _levelsNumber, QPainter* _painter, struct EasyPainterInformation& p, ::profiler_gui::EasyBlockItem& _item, const ::profiler_gui::EasyBlock& _itemBlock, RightBounds& _rightBounds, uint8_t _level, int8_t _mode);
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Public inline methods
|
// Public inline methods
|
||||||
|
Loading…
x
Reference in New Issue
Block a user