高屋建瓴 cocos2d-x-3.0架构设计 Cocos2d (v.3.0) rendering pipeline roadmap(原文)
Cocos2d (v.3.0) rendering pipeline roadmap
Why (the vision)
The way currently Cocos2d does rendering is good but it is beginning to feel somehow antiquate and moreover
it doesn’t actually leverage modern multi core CPUs so popular nowadays on most modern tablets and mobile phones.
So we want to re design Cocos renderer, for making it more performing, elegant, scalable, flexible but still simple to
use and to understand. Also we want to maintain that same familiar API that current Cocos2d users will feel immediately
comfortable with, without having to bother about what’s changed or new under the hood.
We will do this maintaining the same key cornerstone concepts Cocos2d users get to know and like as Scenes,
Nodes, Layers, Sprites.
What (the goals)
Here is a high level view of the new features and improvements we would like to achieve in Cocos2d v.3.0:
Decouple the scene graph from the renderer
Visiting nodes issues graphics commands and put them on a queue, but doesn’t actually invoke any OpenGL
rendering code
Viewing frustum Geometry culling
Sprites (and geometries more in general) not visible from the camera’s point of view be automatically removed
from the current frame and not rendered
Rendering on a thread
The execution of all the rendering commands (i.e. OpenGL calls) will be moved to different thread than the main
one (this will allow for better parallelism and usage of more than one CPUs cores where possible)
Automatic batching
Efficiently reduces the number of draw calls (automatically) batching them together when possible (i.e. sprites
using the same material)
(Node based) Customizable rendering
As in the current version of Cocos, users will still be able (if needed) to customize rendering on a per node basis
, calling OpenGL commands directly, disregarding the official renderer (but possibly incurring on worst performances)
How (the plan)
Central to the new design is the notion CommandQueue. While visiting a node, rendering will not call OpenGL
commands directly anymore (as currently is the case); it will instead push CocosGraphicsCommands to a queue.
Commands In the queue will subsequently be read by the rendering backend, processed as needed and pushed
to the actual rendering API (i.e. OpenGL) (see picture)
The rendering backend (running on his own thread) will in turn pop graphics commands from the queue, process
them and actually execute them. Any locking or CPU expensive OpenGL commands will be then executed from the
back-end thread, letting Cocos’ main thread free continue working on parsing the scene graph or doing other non
rendering related tasks. This will help parallelism and will allow for using multi core CPU’s (see picture)
With Cocos2d-x 3.00 we also want to introduce the concept of automatic-batching. In fact we believe reducing the number of draw calls and render device state changes will improve
drastically rendering speed.
In order to achieve very good batching, we would like to introduce also a new concept of “attributes” for Layers
(formally CCLayer). There are going to (at least) 3 new Layer attributes:
● Unordered
● Static
● Batch
Unordered Layer (formally CCLayer)
We want now focus on Unordered Layers, which are going to help achieving auto batching for improving rendering
performance.
Rendering order in Cocos2d is dictated by the “order” nodes are arranged in the scene graph (see picture)
This is still going to be true still in V.3.0 unless the Layer is tagged as Unordered.
The Unordered attribute will instruct the Layer to disregard rendering order for
all of his children (see picture)
The graphics commands will then be put in the CommandQueue and a special “unordered tag” will be place
in the command queue as well for instructing the rendered to disregard the order and re arrange graphics commands
so to render all the primitives using the same material in one draw call. Rendering all primitives (that use the
same “material”) in one go will make rendering much faster, especially on mobile devices.
Static Layer
Layers tagged as static, will be treated as if all children will not going to be translated/rotated/ zoomed
(transformed) during the entire lifespan of the layer.
This will allow Cocos performing expensive operations as matrices concatenation or computing culling
information (i.e. quad-tree) only once (typically before the first rendering pass) improving drastically
performance. Note that sprites in a static Layer can still be “animated” as far as they’re not transformed or scaled.
Batch Layer
A batch layers will behave very similarly to how a Batch Node (CCBatchNode) currently works in Cocos2d.
All the children of a batch layer will HAVE to use the same “material” thus allowing the front end to combine
all the draw calls for that layer in one single one. (Erroneously) Adding children that use a different material to
a Batch Layer will trigger an Assert ().
Automatic Culling
To do
Rendering context (RenderBucket, RenderTarget, Camera,
viewport)
To do
Rendering and materials system
To do
Customize rendering for nodes
To do
高屋建瓴 cocos2d-x-3.0架构设计 Cocos2d (v.3.0) rendering pipeline roadmap(原文)的更多相关文章
- 支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型
支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型 原创 杨翊(席翁) 阿里巴巴云原生 2020-12-28
- Go语言学习之14 商品秒杀架构设计与开发
本节主要内容 1. 秒杀抢购背景2. 秒杀抢购架构设计&模块划分3. 秒杀抢购接入层实现 1. 秒杀抢购背景 (1)架构分析 电商网站架构 秒杀抢购1.0 (2)上述网站架构问题 和已有电商逻 ...
- ThinkPHP5.0框架开发--第2章 TP5.0架构
ThinkPHP5.0框架开发--第2章 TP5.0架构 第2章 TP5.0架构 ================================================== 上次复习 1.如 ...
- 建筑材料系统 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发
框架介绍: 1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性 ...
- petshop4.0 具体解释之中的一个(系统架构设计)
前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...
- 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架
在过去持续分享的几十期阿里Java面试题中,几乎每次都会问到Dubbo相关问题,比如:“如何从0到1设计一个Dubbo的RPC框架”,这个问题主要考察以下几个方面: 你对RPC框架的底层原理掌握程度. ...
- 万字详解TDengine 2.0整体架构设计思路
导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...
- .NET Core实战项目之CMS 第九章 设计篇-白话架构设计
前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计,源码也已经上传到服务器上了.今天我们就好聊聊架构设计,在开始之前先给大家分享一下这几天我一直在听的<从零开始学架构>里面关于架构设 ...
- cocos2D(一)----第一个cocos2D程序
简单介绍 我们这个专题要学习的是一款iOS平台的2D游戏引擎cocos2d.严格来说叫做cocos2d-iphone,由于cocos2d有非常多个版本号.我们学习的是iphone版本号的.既然是个游戏 ...
随机推荐
- Linux C语言遍历目录结构
遍历目录结构查找文件是很常用的功能,今天介绍一下使用Linux C 遍历Linux目录结构的方法: linux提供几个系统调用,以便于直接目录的读取和操作: DIR * opendir(const c ...
- 【整理】Object-C中的属性(Property)的Setter:assign,copy,retain,weak,strong之间的区别和联系
iOS编程过程中,经常看到一些属性前面有些修饰符,比如copy,retain等. 这些关键字,是Object-C语言中,对于Property的setter. Mac官网: The Objective- ...
- Problem A: A + B
Problem A: A + BTime Limit: 1 Sec Memory Limit: 128 MBSubmit: 17 Solved: 10[Submit][Status][Web Boar ...
- dubbo架构演变之路
背景 (#) 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时, ...
- PHP解析和生成xml(DOMDocument版)
上次和大家分享了SimpleXML操作xml的一些知识,但是php中除了simplexml还有DOMDocument,这次就着重来看看DOMDocument的用法,还是把生成xml和解析xml分开写 ...
- Delphi 的动态数组
传统的Pascal 语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数.专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存. Delp ...
- 软件包管理_rpm命令管理_yum工具管理_文件归档压缩_源码包管理
rpm命令管理软件 对于挂载的像U盘那种都会在midea目录下,但是会显示在桌面上 安装软件(i:install,v:verbose冗长的,h:human):rpm -ivh xxxx.rpm 安 ...
- python使用easygui写图形界面程序
我 们首先下载一个类库easygui,它是一个Python用于简单开发图形化界面的类库,打开easygui的下载网页 http://sourceforge.net/projects/easygui/? ...
- 宣布正式发布 Windows Azure 上的 Oracle 软件以及 Windows Azure Traffic Manager 更新
Windows Azure 的核心原则之一就是为客户提供一个开放.灵活的平台.今天是一个令人振奋的里程碑,因为我们与 Oracle 的合作又向前迈进了一步.Oracle Database.Ora ...
- 基于Visual C++2013拆解世界五百强面试题--题3-打印螺旋数组
请用C语言实现 输入N,打印N*N矩阵 比如 N = 3, 打印: 1 2 3 8 9 4 7 6 5 N = 4, 打印 1 2 3 4 12 13 14 5 11 16 ...