RenderTree渲染树
RenderTree渲染树对类中的静态成员有很重要的关系,这个和多态是有很重要的关系,举个简单的例子,在游戏中,马里奥需要渲染,蘑菇也需要渲染,怪兽也需要渲染,其是串在一个树上的,但是不同的类型怎么将其挂在一起,在渲染的过程中,马里奥,蘑菇和怪兽都是拥有不同的渲染接口,但是这样渲染器会做的很复杂,并不是我们想要的,简单的方式就是创建一个抽象基类,让马里奥,蘑菇和怪兽都继承同一个抽象基类,但是我们面临的问题是,对于马里奥,蘑菇和怪兽来说,他们的类型都是不一样的,怎么才能够穿在一个链表上
如上所示,提供一个纯虚函数show,使得下面的函数可以继承,每个子类中的show都是不一样的
为了将这些东西连起来,需要有个静态的头,这个是没有问题的
要串成一个链表,我们要求所有的节点都是类型是一样的,所以需要在每个节点加上next,因此这个链表本质上是父类指针next连在一起的
#include <iostream>
using namespace std; #include <thread>
#include <unistd.h>
//父类需要提供一个接口
class RenderShape
{
public:
virtual void show()=;
bool init(int x,int y)
{
_x=x;
_y=y;
return true;
} static void RenderShapeList()
{
RenderShape *t=head;
while(t)
{
t->show();//所有的地方可以直接实现覆写
t=t->next;
}
} protected:
int _x;
int _y;
static RenderShape *head;//这个是需要共享的
RenderShape *next;
}; RenderShape *RenderShape::head=nullptr; class Rect:public RenderShape
{
public:
Rect *create(int x,int y,int w,int l)
{
Rect *pRet=new Rect;
if(pRet&&pRet->init(x,y,w,l))
{
pRet->autoRelease();
}
else
{
delete pRet;
pRet=nullptr;
}
} bool init(int x, int y,int w,int l)
{
RenderShape::init(x,y);
_w=w;
_l=l;
return true;
} void autoRelease()
{
this->next=head;
head=this;
} virtual void show()
{
cout<<"draw rect from"<<"("<<_x<<","<<")"<<_y
<<"width"<<_w<<"length"<<_l<<endl;
}
protected:
int _w;
int _l;
}; class Circle:public RenderShape
{
public:
Circle *create(int x,int y,int r)
{
Circle *pRet=new Circle;
if(pRet&&pRet->init(x,y,r))
{
pRet->autoRelease();
}
else
{
delete pRet;
pRet=nullptr;
}
} bool init(int x, int y, int r)
{
RenderShape::init(x,y);
_r=r;
return true;
} void autoRelease()
{
this->next=head;
head=this;
} virtual void show()
{
cout<<"draw circle from"<<"("<<_x<<","<<")"<<_y
<<"radius"<<_r<<endl;
} protected:
int _r;
}; class Ellipse:public RenderShape
{
protected:
int _l;
int _s;
}; void threadTask()
{
while()
{
cout<<"++++++++++++++++++++++++++"<<endl;
RenderShape::RenderShapeList();
sleep();
cout<<"--------------------------"<<endl;
}
}
int main()
{
Rect *pr;
Circle *pc; thread t(threadTask);
while()
{
int choice;
cin>>choice;
switch(choice)
{
case :
pr=Rect::create(,,,);
break;
case :
pc=Circle::create(,,);
break;
}
}
t.join();
return ;
}
RenderTree渲染树的更多相关文章
- 【浏览器渲染原理】渲染树构建之渲染树和DOM树的关系(转载 学习中。。。)
在DOM树构建的同时,浏览器会构建渲染树(render tree).渲染树的节点(渲染器),在Gecko中称为frame,而在webkit中称为renderer.渲染器是在文档解析和创建DOM节点后创 ...
- 探索未知种族之osg类生物---状态树与渲染树以及节点树之间的关系
节点树 首先我们来看一个场景构建的实例,并通过它来了解一下“状态节点”StateGraph 和“渲染叶”RenderLeaf 所构成的状态树,“渲染台”RenderStage 和“渲染元”Render ...
- [js] 渲染树构建、布局及绘制
渲染树构建.布局及绘制
- Simple2D-24 Sprite 渲染树
如果要开发游戏,单单使用 Painter 绘制图片会变得十分复杂.如果使用 Sprite 对象进行显示,可以简单地实现图片的位移.旋转和缩放,结合 Action 对象可以实现复杂的动画效果.最重要的是 ...
- 渲染树render tree
CSSOM树和DOM树连接在一起形成一个render tree,渲染树用来计算可见元素的布局并且作为将像素渲染到屏幕上的过程的输入. DOM树和CSSOM树连接在一起形成render tree . r ...
- JavaScript 页面渲染
1. 从输入url到得到html的详细过程 1.1 加载资源的形式 输入 URL 或跳转页面 加载 html 1.2 加载一个资源的过程 浏览器根据DNS服务器得到域名的IP地址 向这个IP ...
- css加载是否会阻塞dom树渲染
这里说的是头部引入css的情况 首先,我们都知道:css是由单独的下载线程异步下载的. 咱们先分析下css加载会影响什么,刚才的问题太笼统了,咱们需要细化一下. 会影响什么呢? 一个就是DOM树解析, ...
- 页面渲染机制(一、DOM和CSSOM树的构建)
1.HTML的加载 HTML是一个网页的基础,下载完成后解析 2.其他静态资源加载 解析HTML时,发现其中有其他外部资源链接比如CSS.JS.图片等,会立即启用别的线程下载. 但当外部资源是JS时, ...
- How Javascript works (Javascript工作原理) (十一) 渲染引擎及性能优化小技巧
个人总结:读完这篇文章需要20分钟,这篇文章主要讲解了浏览器中引擎的渲染机制. DOMtree ----| |----> RenderTree CSSOMtree ----| ...
随机推荐
- Zend Framework2从入门到精通
1. 下载安装zf2的web程序 步骤: 第一步,保证得到一个基本的zf2框架 直接从官网下载并解压即可:http://www.zendframework.org.cn/downloads/lates ...
- 四、docker compose
docker compose可以方便我们快捷高效地管理容器的启动.停止以及重启等操作,和批量管理容器,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什 ...
- Linux 下 解压zip文件出现乱码
网上下载了一个文件,鼠标右键提取出来发现中文文件名全部乱码: 打开命令行 unzip -h 可以看到 -O 参数 制定编码解压: 比如: unzip -O CP936 xxx.zip
- c++ string替换指定字符串
string fnd = "dataset"; string rep = "labels"; string buf = "d:/data/datase ...
- Add Languages to Your Xamarin Apps with Multilingual App Toolkit
With Xamarin, you can extend your cross-platform apps with support for native speakers, reaching mar ...
- Go For It ,一个灵活的待办事项列表程序
导读 Go For It,是我们开源工具系列中的第十个工具,它将使你在 2019 年更高效,它在 Todo.txt 系统的基础上构建,以帮助你完成更多工作. 每年年初似乎都有疯狂的冲动想提高工作效率. ...
- 部署 Django
补充说明:关于项目部署,历来是开发和运维人员的痛点.造成部署困难的主要原因之一是大家的Linux环境不同,这包括发行版.解释器.插件.运行库.配置.版本级别等等太多太多的细节.因此,一个成功的部署案例 ...
- MySql获取树型结构的所有子节点
stackoverflow的解决方案,亲测有效: SELECT * FROM person WHERE department IN (SELECT department_id FROM departm ...
- kubernetes 利用label标签来绑定到特定node运行pod
利用label标签来绑定到特定node运行pod: 不如将有大量I/O的pod部署到配置了ssd的node上或者需要使用GPU的pod部署到某些安装了GPU的节点上 查看节点的标签: kubectl ...
- Luogu5280 ZJOI2019线段树(线段树)
容易发现相当于求2m种操作序列所得的每种线段树tag数量之和.显然考虑每个点的贡献,也即有多少种方案会使该点上有tag.可以将点分为四类: 1.修改时被经过且有儿子被修改的节点 2.修改时被经过且没有 ...