Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs...

49
gamedesigninitiative at cornell university the Scene Graphs Lecture 9

Transcript of Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs...

Page 1: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Scene Graphs

Lecture 9

Page 2: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Scene Graphs2

Structure of a Cocos2D-x Application

AppDelegate

DeployedPlatform

Director

Scene Scene Scene

Page 3: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Scene Graphs3

Structure of a Cocos2D-x Application

AppDelegate

DeployedPlatform

Director

Scene Scene Scene

iOS or Android

Memory policy(future lecture)

Page 4: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Scene Graphs4

Structure of a Cocos2D-x Application

AppDelegate

DeployedPlatform

Director

Scene Scene Scene

Access as asingleton

Director::getInstance()

Page 5: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Scene Graphs5

Structure of a Cocos2D-x Application

AppDelegate

DeployedPlatform

Director

Scene Scene Scene

Player Modes/Levels

Active Dormant

Page 6: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Sort of like a controller� Manages main game loop� Effectivly owns everything

� It is a black-box singleton� You change settings…� but cannot add methods

� Adjustable settings� Current active scene� OpenGL drawing context� Cache of loaded textures � Input event listeners

Scene Graphs6

The Cocos2D-x Director

Director

SceneCustom

code must go here

Page 7: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Scene Graphs7

Aside: When Do We Load Assets?

AppDelegate

DeployedPlatform

Director

Scene Scene Scene

Level Load

ApplicationStart-up

Choice affects design& ownership of the

asset manager

Page 8: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Scene Graphs8

The Scene Graph

Scene

Node

Layer

Node Node

Node Node Node Node Node Node

Necessary to support touch input

Or anysubclass

Page 9: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Scene Graphs9

Each Node is a Coordinate System

Node

Layer

Node Node

Node Node Node Node Node Node

Device/Screen

CoordinatesBoundedbox inside

Coords relative to parent box

Page 10: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Layer

Scene Graphs10

Each Node is a Coordinate System

Node Node

NodeNode

Node

Node

Page 11: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Layer

Scene Graphs11

Each Node is a Coordinate System

Node

Node

NodeNode

NodeNode

Node

Layer

Node

Node NodeNode Node

Page 12: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Layer

Scene Graphs12

Each Node is a Coordinate System

Node Node

NodeNode

Node

Node

Origin

OriginOrigin

Origin

Page 13: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Layer

Scene Graphs13

Settings Pass Down the Graph

Transforms on parentalso transform children

Page 14: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Layer

Scene Graphs14

Settings Pass Down the Graph

Node

Node

Node Transparency on parentalso applies to children

Page 15: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Layer

Scene Graphs15

Settings Pass Down the Graph

Node

Node

Node Disabling the parentalso disables children

Page 16: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Scene Graphs16

The Scene Graph

Scene

Node

Layer

Node Node

Node Node Node Node Node Node

Necessary to support touch input

Page 17: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

class GameMode: public RootLayer{private:

// Internal controllers/models…

public:/** Starts the game */void start() override;

/** Update one frame */void update(float dt) override;

/** Stops the game */void stop() override;

};

Scene Graphs17

Creating a Custom Scene

� Engine has RootLayer class� Subclass of class Layer� Simplifies later subclassing

� Do not call its constructor!� Use function createScene� Call templated with class� Example (in AppDelegate):

s = createScene<ShipRoot>()� In namespace GameRoot

� See the code samples� All follow this pattern

Page 18: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

start()

� Handles the game assets� Attaches the asset loaders� Loads immediate assets

� Starts any global singletons� Example: SoundController

� Creates any player modes� But does not launch yet� Waits for assets to load� Like GDXRoot in 3152

Scene Graphs18

The Two Main RootLayer Methods

update()

� Called each animation frame

� Manages gameplay� Converts input to actions� Processes NPC behavior� Resolves physics� Resolves other interactions

� Updates the scene graph� Transforms nodes� Enables/disables nodes

Page 19: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

start()

� Handles the game assets� Attaches the asset loaders� Loads immediate assets

� Starts any global singletons� Example: SoundController

� Creates any player modes� But does not launch yet� Waits for assets to load� Like GDXRoot in 3152

Scene Graphs19

The Two Main RootLayer Methods

update()

� Called each animation frame

� Manages gameplay� Converts input to actions� Processes NPC behavior� Resolves physics� Resolves other interactions

� Updates the scene graph� Transforms nodes� Enables/disables nodes

Page 20: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Each model is its own node� Node coords = texture coords� Model pos = node pos

� Each node is a Box2D body� Scene is a Box2D world� Nodes moved automatically

� Each node processes input� Node has custom listener� Gets touches on that node

� Massive violation of MVC

Scene Graphs20

The Cocos2D-x Philosophy

Layer

PhysicsSprite

PhysicsSprite

PhysicsSprite

PhysicsSprite

PhysicsSprite

Page 21: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Each model is its own node� Node coords = texture coords� Model pos = node pos

� Each node is a Box2D body� Scene is a Box2D world� Nodes moved automatically

� Each node processes input� Node has custom listener� Gets touches on that node

� Massive violation of MVC

Scene Graphs21

The Cocos2D-x Philosophy

Layer

PhysicsSprite

PhysicsSprite

PhysicsSprite

PhysicsSprite

PhysicsSprite

Page 22: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

The Problem: Physics

Scene Graphs22

2D Physics“Island”

Parallax layers(e.g. beat-em up)

Page 23: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

The Problem: Physics

Scene Graphs23

2D Physics“Island”

SeparateIsland

Parallax layers(e.g. beat-em up)

Page 24: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

The Problem: Physics

Scene Graphs24

Page 25: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

The Problem: Physics

Scene Graphs25

How big isthat scene graph?

Page 26: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Cocos2D 2.x Rendering� Node = new graphics call� Even if the same texture� Many calls on small data

� GPU cards do not like this� Each call requires card I/O� Want few calls on large data� Else performance stalls

� Result: Horrible framerate� Cocos2D 3.x changed this

Scene Graphs26

Bigger Problem: Rendering

Layer

Sprite

Sprite

Sprite

Sprite

Sprite

Page 27: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Sprites = textured triangles� Gather all sprite vertices� Make one list of triangles� Send them to GPU at once

� But stall on texture change� Reorder data on texture� Limits texture switches� Safe if there is no overlap

� Is there a name for this?� SpriteBatch!

Scene Graphs27

What Do We Really Want?

Page 28: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Sprites = textured triangles� Gather all sprite vertices� Make one list of triangles� Send them to GPU at once

� But stall on texture change� Reorder data on texture� Limits texture switches� Safe if there is no overlap

� Is there a name for this?� SpriteBatch!

Scene Graphs28

What Do We Really Want?

Page 29: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Sprites = textured triangles� Gather all sprite vertices� Make one list of triangles� Send them to GPU at once

� But stall on texture change� Reorder data on texture� Limits texture switches� Safe if there is no overlap

� Is there a name for this?� SpriteBatch!

Scene Graphs29

What Do We Really Want?

Page 30: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Sprites = textured triangles� Gather all sprite vertices� Make one list of triangles� Send them to GPU at once

� But stall on texture change� Reorder data on texture� Limits texture switches� Safe if there is no overlap

� Is there a name for this?� SpriteBatch!

Scene Graphs30

What Do We Really Want?

Page 31: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Sprites = textured triangles� Gather all sprite vertices� Make one list of triangles� Send them to GPU at once

� But stall on texture change� Reorder data on texture� Limits texture switches� Safe if there is no overlap

� Is there a name for this?� SpriteBatch!

Scene Graphs31

What Do We Really Want?

Page 32: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Sprites = textured triangles� Gather all sprite vertices� Make one list of triangles� Send them to GPU at once

� But stall on texture change� Reorder data on texture� Limits texture switches� Safe if there is no overlap

� Is there a name for this?� SpriteBatch!

Scene Graphs32

What Do We Really Want?

Page 33: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Animation is much easier!

� Can reduce filmstrips� Break asset into parts� Each has a coord system� Transform each separately

� Decouple animation loop� Update does not set frame� Node advances frame� Update switches animations

� Exception: ShipDemoScene Graphs33

So Why Use a Scene Graph?

Page 34: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Animation is much easier!

� Can reduce filmstrips� Break asset into parts� Each has a coord system� Transform each separately

� Decouple animation loop� Update does not set frame� Node advances frame� Update switches animations

� Exception: ShipDemoScene Graphs34

So Why Use a Scene Graph?

Page 35: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Animation is much easier!

� Can reduce filmstrips� Break asset into parts� Each has a coord system� Transform each separately

� Decouple animation loop� Update does not set frame� Node advances frame� Update switches animations

� Exception: ShipDemoScene Graphs35

So Why Use a Scene Graph?

Page 36: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Animation is much easier!

� Can reduce filmstrips� Break asset into parts� Each has a coord system� Transform each separately

� Decouple animation loop� Update does not set frame� Node advances frame� Update switches animations

� Exception: ShipDemoScene Graphs36

So Why Use a Scene Graph?

Page 37: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Touch handler requires� Which object touched� Location inside object

� Scene graph is a search tree� Check if touch is in parent� … then check each child� Faster than linear search

� But limit this to a search� No input control in node� Polling over callbacks

Scene Graphs37

Also Good for Touch Interfaces

Layer

Node

Node

NodeNode

NodeNode

Page 38: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Decouple scene & renderer� Update pass modifies scene� Render pass to SpriteBatch� Draw pass sends to GPU

� Renderer in second thread?� Can draw even update slow� Decoupled animation can

still look very smooth

� What Cocos2D 3.x does� Sort-of (textures only)� Wireframes are expensive!

Scene Graphs38

Scene Graphs + Performance?

SceneGraph

Update

Render

Page 39: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Can specify draw order� Give each child a z-value� Ties are permitted� Objects drawn by z-order

(ties broken by graph order)

� Controls texture switching� One texture = one z-value� Reduces it to one draw call� Example: RocketDemo

� Should do when no overlap� Big Cocos2d optimization

Scene Graphs39

Optimizing Performance: zOrder

Page 40: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Idea: Never switch textures� Film strip is many images � We can draw part of texture� One texture for everything?� Called a texture atlas

� Disadvantages?� Cannot tile textures� Can be tricky to pack

� Ideal for interface design� Images for UX widgets� Often small and compact

Scene Graphs40

Optimizing Performance: Atlases

Page 41: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Demos had custom nodes� Filmstrip (simple animation)� PolygonSprite (tiled shapes)

� Emulate existing classes� Sprite if need textures� DrawNode if no textures� See how they are written

� Two main methods needed� Static constructor� The draw method

Scene Graphs41

Making Custom Graph Nodes

All onegraph node

Page 42: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

� Demos had custom nodes� Filmstrip (simple animation)� PolygonSprite (tiled shapes)

� Emulate existing classes� Sprite if need textures� DrawNode if no textures� See how they are written

� Two main methods needed� Static constructor� The draw method

Scene Graphs42

Making Custom Graph Nodes

All onegraph node

In future lectures.See code samples.

Page 43: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

The Draw Commandvoid PolygonNode::draw(Renderer *renderer,

const Mat4 &transform, uint32_t flags) {

// Don't calculate culling if transform was not updated_insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ?

renderer->checkVisibility(transform, _contentSize) : _insideBounds;

if (_insideBounds) {_command.init(_globalZOrder, _texture->getName(),

getGLProgramState(), _blendFunc, *_triangles, transform);

renderer->addCommand(&_command);}

}

Scene Graphs43

Page 44: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

The Draw Commandvoid PolygonNode::draw(Renderer *renderer,

const Mat4 &transform, uint32_t flags) {

// Don't calculate culling if transform was not updated_insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ?

renderer->checkVisibility(transform, _contentSize) : _insideBounds;

if (_insideBounds) {_command.init(_globalZOrder, _texture->getName(),

getGLProgramState(), _blendFunc, *_triangles, transform);

renderer->addCommand(&_command);}

}

Scene Graphs44

Check if on screen

Cocos2dClass

OpenGLParameters

Send commandto renderer

Page 45: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Cocos2D Command Types

� QuadCommand� Can draw a textured rectangle� Batches quads together if possible� Used by the Sprite

� TrianglesCommand� Batched together, but not with quads� Used by PolygonNode (and others)

� CustomCommand� Give it a callback function� Can execute arbitrary OpenGL

Scene Graphs45

Page 46: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Using CustomCommand

void DrawNode::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) {

_customCommand.init(_globalZOrder);_customCommand.func =

CC_CALLBACK_0(DrawNode::onDraw, this, transform, flags);

renderer->addCommand(&_customCommand);}

void DrawNode::onDraw(const Mat4 &transform, uint32_t flags){auto glProgram = getGLProgram();// OpenGL Code…

} Scene Graphs46

Page 47: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Using CustomCommand

void DrawNode::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) {

_customCommand.init(_globalZOrder);_customCommand.func =

CC_CALLBACK_0(DrawNode::onDraw, this, transform, flags);

renderer->addCommand(&_customCommand);}

void DrawNode::onDraw(const Mat4 &transform, uint32_t flags){auto glProgram = getGLProgram();// OpenGL Code…

} Scene Graphs47

Methodto execute

Methodobject

Methodarguments

Draws triangle verticescreated by helpers.

Page 48: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Using CustomCommand

void DrawNode::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) {

_customCommand.init(_globalZOrder);_customCommand.func =

CC_CALLBACK_0(DrawNode::onDraw, this, transform, flags);

renderer->addCommand(&_customCommand);}

void DrawNode::onDraw(const Mat4 &transform, uint32_t flags){auto glProgram = getGLProgram();// OpenGL Code…

} Scene Graphs48

Draws triangle verticescreated by helpers.

Page 49: Scene Graphs - Cornell University · gamedesigninitiative at cornell university the 3 Scene Graphs Structure of a Cocos2D-x Application App Delegate Deployed Platform Director Scene

gamedesigninitiativeat cornell university

the

Summary

� Cocos2D uses scene graphs to draw� Tree of nodes with relative coordinate systems� Root node, Layer, processes all touch input

� Cocos2D has integrated too much into graph� Physics should be separate (RocketDemo)� Touch is useful, but separate listeners from node

� Cocos2D 3.x has made major improvements� Sprites and polygons are now batched together� But need to understand how to optimize

Scene Graphs49