SDL中文论坛
标题:
悬浮控件
[打印本页]
作者:
ancientcc
时间:
2017-4-29 11:06
标题:
悬浮控件
本帖最后由 ancientcc 于 2017-4-29 11:10 编辑
两种渲染方式:恢复式渲染,累加式渲染
恢复式渲染。时刻t1要画图像p1了,它从A上先扣出背景到纹理B,然后用把p1上传到A。时刻t2要画图像p2了,先把纹理B用glDrawArrays上传到A,即恢复背景,然后又一次在A上用glDrawArrays扣出背景到纹理B,再用glDrawArrays把p2上传到A。抛开上传图像p1、p2……pN,这里有个持续不断操作是从A扣出背景B,背景B恢复回到A,A又扣出背景B,背景B又恢复回到A,
扣出背景(redraw#1):screen-->buf。记住要画位置处旧有矩形图像,这矩形图像称为背景图像,buf存储着背景纹理。
画此次内容(redraw#2):canvas-->screen。在位置处画图像
擦回初始(undraw):buf-->screen。当图像要被擦除时,位置处恢复背景图像
要处理的是多个单元,而且单元间有可能出现重叠,redraw时各单元以着顺序去操作,undraw时各单元以着逆序去操作。
累加式渲染。从#1、#2、#3……#N,逐层渲染。为降低渲染消耗,会设裁剪矩形,矩形尺寸就是terminate.rect。
悬浮控件使用恢复式渲染。
window->draw_float_widgets();
disp->draw_float_anim();
cursor::draw();
video.flip();
cursor::undraw();
disp->undraw_float_anim();
window->undraw_float_widgets();
复制代码
背景
如何减少扣背景次数?只有确实需要时才去执行。它涉及到的矩形脏了。twindow::draw时的terminate,
渲染矩形
什么时候重新计算渲染矩形?
1)item.need_layout是true。2)rect.w==0。3)rect.h==0。
item.need_layout是true。有种可能会导致item.need_layout是true。1)参考控件发生变化。2)参考控件的渲染矩形发生变化。
rect.w==0、rect.h==0。可认为是同一种情况,初始时两个值都是0。
一旦修改了渲染矩形后,如果当前是场景,那要重新计算指示和大地图有交叉的volatiles_。volatiles_有两个作用。一是发生鼠标事件如果坐标是在volatiles_,那将不再发向大地图。二是dipslay::draw会强制置脏大地图中和volatiles_有交叉的栅格。对第二个问题,虽然渲染悬浮控件用的是恢复方式,但由于glDrawArrays虚化问题,还是要求每次扣背景时背景内容发生变化。对能否“智能”判断出背景哪部分脏了?当栅格是正六边形时,脏的将不再是矩形,非常有难度。
如何计算渲染矩形
x、y根据脚本中的“x、y”字段进行计算。控件的标称尺寸就是渲染尺寸。
canvas
什么时候更新canvas?
1)dirty_==true。说下ttrack控件,它的更新有两种情况,一是此处的dirty_=true时更新,二是app自更新,那时dirty_=false。
欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/)
Powered by Discuz! X3.3