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渲染树的更多相关文章

  1. 【浏览器渲染原理】渲染树构建之渲染树和DOM树的关系(转载 学习中。。。)

    在DOM树构建的同时,浏览器会构建渲染树(render tree).渲染树的节点(渲染器),在Gecko中称为frame,而在webkit中称为renderer.渲染器是在文档解析和创建DOM节点后创 ...

  2. 探索未知种族之osg类生物---状态树与渲染树以及节点树之间的关系

    节点树 首先我们来看一个场景构建的实例,并通过它来了解一下“状态节点”StateGraph 和“渲染叶”RenderLeaf 所构成的状态树,“渲染台”RenderStage 和“渲染元”Render ...

  3. [js] 渲染树构建、布局及绘制

    渲染树构建.布局及绘制

  4. Simple2D-24 Sprite 渲染树

    如果要开发游戏,单单使用 Painter 绘制图片会变得十分复杂.如果使用 Sprite 对象进行显示,可以简单地实现图片的位移.旋转和缩放,结合 Action 对象可以实现复杂的动画效果.最重要的是 ...

  5. 渲染树render tree

    CSSOM树和DOM树连接在一起形成一个render tree,渲染树用来计算可见元素的布局并且作为将像素渲染到屏幕上的过程的输入. DOM树和CSSOM树连接在一起形成render tree . r ...

  6. JavaScript 页面渲染

    1. 从输入url到得到html的详细过程 1.1 加载资源的形式      输入 URL 或跳转页面 加载 html 1.2 加载一个资源的过程 浏览器根据DNS服务器得到域名的IP地址 向这个IP ...

  7. css加载是否会阻塞dom树渲染

    这里说的是头部引入css的情况 首先,我们都知道:css是由单独的下载线程异步下载的. 咱们先分析下css加载会影响什么,刚才的问题太笼统了,咱们需要细化一下. 会影响什么呢? 一个就是DOM树解析, ...

  8. 页面渲染机制(一、DOM和CSSOM树的构建)

    1.HTML的加载 HTML是一个网页的基础,下载完成后解析 2.其他静态资源加载 解析HTML时,发现其中有其他外部资源链接比如CSS.JS.图片等,会立即启用别的线程下载. 但当外部资源是JS时, ...

  9. How Javascript works (Javascript工作原理) (十一) 渲染引擎及性能优化小技巧

    个人总结:读完这篇文章需要20分钟,这篇文章主要讲解了浏览器中引擎的渲染机制. DOMtree       ----|   |---->  RenderTree CSSOMtree  ----| ...

随机推荐

  1. 常用Mac快捷键

    1.复制Cmd + C 粘贴Cmd + C —-> Cmd + V 剪切Cmd + C —-> Cmd + Opt + V 2.查看隐藏文件 Cmd + shift + . 3. 货币符号 ...

  2. C# Web开发中弹出对话框的函数[转载]

    public void Alert(string str_Message) { ClientScriptManager scriptManager =((Page)System.Web.HttpCon ...

  3. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0'

    七月 05, 2018 10:26:54 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRul ...

  4. IntelliJ IDEA Tomcat启动VM Options配置

    -server -XX:PermSize=512M -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8 JDK8中用metaspace代替permsize,因此在许 ...

  5. IDEA @Contract annotation

    IDEA @Contract annotation ----------------------------------- http://www.jetbrains.com/help/idea/con ...

  6. HDOJ 5667 Sequence//费马小定理 矩阵快速幂

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5667 题意:如题给了一个函数式,给你a,b,c,n,p的值,叫你求f(n)%p的值 思路:先对函数取以a为 ...

  7. Linux iptables设置

    先举例子说明,若服务器网卡: eth0 10.10.0.100 eth0:0 10.10.0.200 eth0:1 10.10.0.201 eth0:2 10.10.0.202 只允许10.10.0. ...

  8. UOJ277【清华集训2016】定向越野(计算几何,最短路)

    UOJ题目传送门 显然最优的路径只会经过若干条两个圆的公切线和若干段圆弧 为了方便,把起点终点看成两个半径为\(0\)的圆也行. 最烦的就是算两个圆的公切线了,一共有四条 对于靠外面的两条,我们把切线 ...

  9. 参考RPC

    普遍RPC在客户端需要提供接口,如果不提供则无法进行调用.同时,因为客户端也依赖提供的接口,服务端的升级.优化所带来的更新,客户端也要及时的更新API,否则会带来影响.这样,就带来了依赖接口,常常更新 ...

  10. Android ListView item 点击事件失效问题的解决

    关于ListView点击无效,item无法相应点击事件的问题,网上有很多, 大致可分为俩种情况, 一种是 item中存在 ImageButton 等可以点击的组件,这会抢先获得ListView的焦点. ...