SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4209|回复: 0
打印 上一主题 下一主题

[gui2] 悬浮控件

[复制链接]

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
跳转到指定楼层
楼主
发表于 2017-4-29 11:06:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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。

悬浮控件使用恢复式渲染。
  1. window->draw_float_widgets();
  2. disp->draw_float_anim();
  3. cursor::draw();

  4. video.flip();

  5. cursor::undraw();
  6. disp->undraw_float_anim();
  7. 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。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2024-5-20 02:29 , Processed in 0.049608 second(s), 20 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表