RenderItem 渲染集中

本文详细解析了 RenderItem 数据结构,包括其成员变量如 ITexture 指针、顶点计数、渲染状态等,以及关键成员函数 renderToTarget 的工作原理。探讨了 DrawItemInfo 类型用于保存渲染信息单元的具体细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	typedef std::vector<DrawItemInfo> VectorDrawItem;

而DrawItemInfo 为:

	typedef std::pair<ISubWidget*, size_t> DrawItemInfo;
这里明显看出ISubWidget为Widget的渲染信息单元


RenderItem的数据结构:

	private:
#if MYGUI_DEBUG_MODE == 1
		std::string mTextureName;
#endif
		// 渲染纹理
		ITexture* mTexture;
		// 需要渲染的顶点数
		size_t mNeedVertexCount;
		// 渲染时候时机??
		bool mOutDate;
		// 需要渲染的SubWidget的列,
		//ISubWidget不是Widget 只是用来保存渲染的信息。
		VectorDrawItem mDrawItems;

		// 俄文看不懂, 顶点渲染数? 与 size_t mNeedVertexCount 
		// 有何区别???
		size_t mCountVertex;
		// 与 bool mOutDate 又是什么关系???
		bool mCurrentUpdate;
		// current vertex
		Vertex* mCurrentVertext;
		// ???
		size_t mLastVertextCount;
		
		IVertexBuffer* mVertexBuffer;
		IRenderTarget* mRenderTarget;
		// Compression的作用?
		// 压缩那些信息?
		bool mCompression;



renderToTarget  成员函数与RenderManager进行交流

	void RenderItem::renderToTarget(IRenderTarget* _target, bool _update)
	{
		if (mTexture == nullptr)
			return;

		mRenderTarget = _target;

		mCurrentUpdate = _update;

		if (mOutDate || _update)
		{
			mCountVertex = 0;
			Vertex * buffer = (Vertex*)mVertexBuffer->lock();

			for (VectorDrawItem::iterator iter=mDrawItems.begin(); iter!=mDrawItems.end(); ++iter)
			{
				// перед вызовом запоминаем позицию в буфере
				mCurrentVertext = buffer;
				mLastVertextCount = 0;

				(*iter).first->doRender();

				// колличество отрисованных вершин
				MYGUI_DEBUG_ASSERT(mLastVertextCount <= (*iter).second, "It is too much vertexes");
				buffer += mLastVertextCount;
				mCountVertex += mLastVertextCount;
			}

			mVertexBuffer->unlock();

			mOutDate = false;
		}

		// хоть с 0 не выводиться батч, но все равно не будем дергать стейт и операцию
		if (0 != mCountVertex)
		{
#if MYGUI_DEBUG_MODE == 1
			if (!RenderManager::getInstance().checkTexture(mTexture))
			{
				mTexture = nullptr;
				MYGUI_EXCEPT("texture pointer is not valid, texture name '" << mTextureName << "'");
				return;
			}
#endif
			// непосредственный рендринг
			_target->doRender(mVertexBuffer, mTexture, mCountVertex);
		}
	}




ECharts在快速点击图例时可能导致图表渲染错误,特别是当涉及到动态更新数据或者视图层级结构复杂时。对于立体堆叠柱状图,如果顶部颜色显示异常,可能是由于以下几个原因: 1. 更新时机问题:确保在改变数据或样式时,`setOption`或`resize`方法调用在事件处理函数结束后,避免在渲染过程中修改配置。 2. 数据绑定:检查堆积系列的数据是否正确,尤其是顶层数据和底层数据的关系。每个柱子的颜色应该基于其所属的底层柱子的值。 3. 色彩配置:确认堆叠柱状图的顶部填充色(`emphasis.color`)是否设置正确。它通常用于高亮状态下的效果,确保这与基础状态的颜色区分开。 4. 系列选项:检查`stack`属性是否设置正确,以及是否有任何无效的堆叠项或者颜色映射。 5. 图例交互:尝试禁用或限制图例的单击切换,或者使用更稳定的图例切换策略(如鼠标悬停切换),减少频繁渲染的需求。 修复这个问题的一个示例代码片段可能如下: ```javascript // 初始化echarts实例 var myChart = echarts.init(document.getElementById('main')); // 当点击图例时,缓存当前状态并处理渲染 myChart.on('legendselectchanged', function (params) { var currentData = ... // 获取当前选中的数据配置 var oldOption = myChart.getOption(); myChart.setOption({ series: [currentData, ...oldOption.series.filter(s => s !== currentData)] // 动态更改系列 }); setTimeout(function() { // 避免立即渲染,给浏览器一些时间处理 myChart.setOption(oldOption); // 恢复原始配置 }, 0); }); // 初始化堆叠柱状图配置,这里仅做简要展示 var option = { legend: { data: ['seriesA', 'seriesB'] }, series: [ { type: 'bar', stack: 'stack1', data: [...], emphasis: { color: 'red' // 设置高亮颜色 } }, ... ] }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值