#1RenderCommand 在以前的时候,Cocos2dx的刷新界面的方式是直接将GL刷新frameBuffer对象的方法都写在对应的DrawCall方法里,现在为了更好地提升渲染性能,现在各自显示对象的draw方法里调用的是一个全新的API visit系列函数,在这些函数里面试根据显示对象的一系列属性创建对应的RenderCommad渲染命令,添加到相应的RenderCommandQueue中,最后使用总的渲染调用对渲染队列的各个command进行渲染。在添加时可以把使用同一个纹理对象的显示对象的RenderCommand添加到同一队列中,opengl的实现原理和状态机类似,相同批次的渲染可以在不改变状态的同时大量显示相同的图形,大大提高了渲染效率。 ##1.1 属性及方法
class CC_DLL RenderCommand
{
public:
/**Enum the type of render command. */
/**各种类型RenderCommand的枚举值 */
enum class Type
{
/** Reserved type.*/
UNKNOWN_COMMAND,
/** Quad command, used for draw quad.*/
/** 矩形*/
QUAD_COMMAND,
/**Custom command, used for calling callback for rendering.*/
CUSTOM_COMMAND,
/**Batch command, used for draw batches in texture atlas.*/
/* 批次渲染命令(相同纹理及相同着色器对象)*/
BATCH_COMMAND,
/**Group command, which can group command in a tree hierarchy.*/
/** 组渲染(包含的渲染命令 有节点层次关系)*/
GROUP_COMMAND,
/* 网格渲染 (主要用于模型渲染, terrian 地图渲染)*/
/**Mesh command, used to draw 3D meshes.*/
MESH_COMMAND,
/** 图元渲染 划线啊 三角形 啊点啥的(opengl提供的三种基础图元)*/
/**Primitive command, used to draw primitives such as lines, points and triangles.*/
PRIMITIVE_COMMAND,
/**Triangles command, used to draw triangles.*/
TRIANGLES_COMMAND
/* 嘿呀没有发现曲面细分相关的, 不知道opengles2.0 有没有tesselation*/
};
/**
Init function, will be called by all the render commands.
@param globalZOrder The global order of command, used for rendercommand sorting.
@param modelViewTransform Modelview matrix when submitting the render command.
@param flags Flag used to indicate whether the command should be draw at 3D mode or not.
*/
void init(float globalZOrder, const Mat4& modelViewTransform, uint32_t flags);
/** 获取全局z值 主要用于深度测试和组渲染时的显示问题*/
/** Get global Z order. */
inline float getGlobalOrder() const { return _globalOrder; }
/** 获取具体是什么Command*/
/** Returns the Command type. */
inline Type getType() const { return _type; }
/** 判断是不是透明的不是的话RGBA的A值直接设为1.0(255 or 127)*/
/** Returns whether is transparent. */
inline bool isTransparent() const { return _isTransparent; }
/** Set transparent flag. */
inline void setTransparent(bool isTransparent) { _isTransparent = isTransparent; }
/**
Get skip batching status, if a rendering is skip batching, it will be forced to be rendering separately.
*/
/** 如果为false 则作为单独批次处理,true 则加入到当前批次中一起渲染*/
inline bool isSkipBatching() const { return _skipBatching; }
/**Set skip batching.*/
inline void setSkipBatching(bool value) { _skipBatching = value; }
/**Whether the command should be rendered at 3D mode.*/
/** 是否作为3D对象 渲染(3D 渲染 和2D渲染还是有很大区别的)*/
inline bool is3D() const { return _is3D; }
/**Set the command rendered in 3D mode or not.*/
inline void set3D(bool value) { _is3D = value; }
/**Get the depth by current model view matrix.*/
/**获取以当前视锥体为基础的 depth 值 做丢弃处理, 避免不必要的刷新 */
inline float getDepth() const { return _depth; }
protected:
/**Constructor.*/
RenderCommand();
/**Destructor.*/
virtual ~RenderCommand();
//used for debug but it is not implemented.
void printID();
/**Type used in order to avoid dynamic cast, faster. */
Type _type;
/** Commands are sort by global Z order. */
float _globalOrder;
/** Transparent flag. */
bool _isTransparent;
/**
QuadCommand and TrianglesCommand could be auto batched if there material ID is the same, however, if
a command is skip batching, it would be forced to draw in a separate function call, and break the batch.
*/
bool _skipBatching;
/** Is the command been rendered on 3D pass. */
bool _is3D;
/** Depth from the model view matrix.*/
float _depth;
};
复制代码
一些需要讲解的地方已在上面代码里通过注释的方式说明 PS:等到后面记录完几个重要的RenderCommand后, 会写一篇关于Cocos2dx 完整渲染流程的说明