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. Java权限访问修饰符

    私有的,以 private 修饰符指定,在同一类内可见. 默认的,也称为 default,在同一包内可见,不使用任何修饰符. 受保护的,以 protected 修饰符指定,对同一包内的类和所有子类可见 ...

  2. npm安裝、卸載、刪除、撤銷發佈包、更新版本信息

    利用npm安裝包: 全局安裝:npm install -g 模塊安裝 局部安裝(可以使用repuire(‘模塊名’)引用):npm install 模塊名稱 如果權限不夠,就是用管理員方式安裝. 本地 ...

  3. Bootstrap之响应式导航栏

    代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8 ...

  4. Python——Menu控件

    一.参数说明: tearoff  :分窗,0为在原窗,1为点击分为两个窗口 bg,fg  : 背景,前景 borderwidth: 边框宽度 font :  字体 activebackgound   ...

  5. 我的Git

    1.git 的安装与配置. 首先,对git进行下载.然后,在本地安装后进行版本查看,win10系统通过win+r快捷键打开控制台,然后用git --version的cmd命令查看git版本. 然后对g ...

  6. 学习 Spring (七) Resource

    Spring入门篇 学习笔记 Resource: Spring 针对资源文件的统一接口 UrlResource: URL 对应的资源,根据一个 URL 地址即可构建 ClassPathResource ...

  7. django中怎么使用自定义管理后台xadmin

    django中怎么使用自定义管理后台xadmin 2018年05月19日 15:48:08 LH_python 阅读数:1001   首先创建基本的django项目,配置好基本的model ,url, ...

  8. JSON 解析 (三)—— FastJSON与Jackson比较

    一.方便性与性能 调用方便性而言: FastJSON提供了大量静态方法,调用简洁方便 Jackson须实例化类,调用相对繁琐,可通过封装成JSON工具类简化调用 性能而言: FastJSON反序列化的 ...

  9. 使用aapt查看当前apk的属性

    android:versioncode——整数值,代表应用程序代码的相对版本,也就是版本更新过多少次. android:versionname——字符串值,代表应用程序的版本信息,需要显示给用户. e ...

  10. python之旅第八篇--异常

    判断类与对象关系 isinstance #判断对象obj是否是由cls类创建的 class Foo(object): pass obj = Foo() print isinstance(obj,Foo ...