游戏开发:关于cocos2d-x几种画图方法的用法与思考 - Inzaghi-iOS开发博客,互联网资讯,米兰新闻

游戏开发:关于cocos2d-x几种画图方法的用法与思考

 

CCRenderTexture

自己的理解

CCRenderTexture类似一张空白的“画布“,用户通过自定义笔刷(CCSprite*),在touch事件中把笔刷的移动痕迹“记录”起来,从而“画”出各种艺术效果。记录方法很简单,首先CCRenderTexture调用自己的begin()函数,开启“记录”功能,然后调用笔刷->visit()把自己”画“在这张画布上,最后CCRenderTexture调用end()结束记录,那就OK了。

这里我想CCRenderTexture是通过把笔刷的纹理叠加到自己的纹理(Texture)里,而不是不断创建新纹理,所以消耗比较低,即使画得很频繁,帧数也能保持稳定,是个很赞的类。

CCRenderTexture由于只要begin()开启“记录”功能后,任何之后的CCNode*对象只要调用了visit(),就能将自己“画”在其身上。所以,一般游戏的截屏功能,完全可以使用CCRenderTexture的来实现,具体可以看tests里例子,cocos2d-x已经提供了相关例子,看看源代码就能搞明白的。

优点

用CCRenderTexture可以很简单的实现出理想的画图效果(只要搞一张很小的笔刷图,然后用CCSprite载入来,再适当调用一个CCSprite的visit()就行了),帧数消耗低,还很方便实现出游戏的截屏功能,做《你画我猜》这种项目,第一想到的应该就是它了。

缺点

由于每个Android手机的硬件或者OpenGL版本不一样,导致有些手机用CCRenderTexture会出现花屏,比如HTC。就算是官方提供的tests例子也难逃一花屏,这个致命的缺点导致用它来实现的《你画我猜》不能跨手机,比较坑爹…

这个Bug我想不是cocos2d-x引擎的问题,有牛人说是因为Texture在重复画导致的(只画一次没问题,所以截屏功能应该不受影响),也许是每台Android手机的OpenGL不一样吧,所以问题一直没得到解决,只能等cocos2d-x或者有其他牛人以后可以把它Fixed掉。

因为花屏问题,现阶段不推荐使用(如果有牛人解决了花屏问题,请教教我,谢谢)

[ 花屏参考图 ]

例子

CCRenderTexture大概是大家比较熟悉的,tests里也有相关例子,要知道用法直接看tests的源代码就可以了,效果如图:

用OpenGL-ES实现画图

自己的理解

OpenGL-ES是OpenGL的精简版,由于太精简,很多OpenGL常用的函数都被“简”掉了,导致有很多网上一搜一大把的画图算法用不上。所以用OpenGL-ES画图,这个感觉难度非常高。

在cocos2d-x中,OpenGL-ES一般在draw()这个函数里面调用其相关函数。当然cocos2d-x也封装了几个常用的画图函数:ccDrawLine,ccDrawCircle等,当然cocos2d-x也提供了例子,在tests里可以轻松找到。

优点

暂时没想到,因为我本身对OpenGL-ES不熟…

缺点

实现难度大可以拦截一大批人了,感觉。因为不能像CCRenderTexture那样在touch事件中进行绘图,所以一般会把要画的CCPoint在touch事件的记录下来,然后在draw()这个函数里遍历之,以实现绘图效果。

移动过的点一般都要保存下来,注意的是要全部保存,如果只保存当前点的话,draw()就只会画一个点,画出来的效果就像一个“光点”跟随的鼠标移动,而不是绘图。一般画一幅画,鼠标都会拖动出N个点,如果只是简单的vector保存的话,vector会超大,draw中遍历它也很耗时,导致没一会帧数就掉光了。具体怎么保存看数据结构吧,同事以线段作为数据结构来记录点,这样消耗不大,帧数也能保持稳定。

另外一个缺点就是如果算法实现不好,画出来的效果很坑爹,同事的线段法虽然能很流畅的画线,但是锯齿问题很严重,开了OpenGL的抗锯齿也没效果。如果对OpenGL-ES很熟而且算法也很牛的话,也许draw()是最快最好的一种画图法了。

最后还一个超坑爹的缺点:draw()在Google那台三星手机上,始终画在最顶层显示,然后线条就会把游戏UI遮盖住了,无论怎么设置z-Order都没用,估计是Google的三星手机的OpenGL-ES做过什么特殊处理吧,导致“坑爹啊…”

 

 

 

发表评论

*

* 绝不会泄露


Design By Inzaghi | 京ICP备16047555号-1