文章目录:
- 1、cocos creator 2.4.0 渲染流程详解(七:ForwardRender)
- 2、手游引擎Unity和Cocos各有什么优劣
- 3、合并并文件中info.json和bin
- 4、cocos2d开发的游戏怎么反编译资源
- 5、Cocos Creator怎么使用安卓手机相册中的图片,最好有示例源码
cocos creator 2.4.0 渲染流程详解(七:ForwardRender)
全文共5000+字,分为8个章节,由本人历时一周整理而来。由于篇幅问题,将本文分为8个章节分开发布。全文 ( 不 ) 详细描述了cocoscreator 引擎的2.40版本中,web平台的js部分引擎的渲染流程。请将文章配合源码一起食用!
由于我尚在学习引擎源码中,文章可能有不正确的部分,所以我会不断更新内容。如有错误或补充,请留言交流!
全部章节链接:
一: 渲染流程中用到的核心类
二 : 渲染流程详解
三: RenderFlow 的运行逻辑
四: Assembler 的作用
五: ModelBatcher 数据合批
六: 材质系统
七: ForwardRender
ForwardRender 继承于 Base, 是与底层渲染最靠近的类型,当上面的流程处理完毕后,会在ForwardRender 的 render() 中处理当前场景的渲染状态,材质,光照,通道,着色器,更新着色器的统一变量。并在 _draw() 中调用 device.draw()方法,进行绘制。
部分重要的继承于 Base 的成员变量:
_device:根据运行平台对应的绘制图形对象 gfx.Device 的实例,用于绘制图形到屏幕,类型定义于 cocos2d\renderer\gfx\index.js。
_programLib : 管理 shader 定义,获取,检查等相关的变量。类型定义于 cocos2d\renderer\core\program-lib.js。
_stage2fn:保存有不同渲染通道的名称与其对应的不同渲染方法。ForwardRender 中设置有 shadowcast, opaque, transparent 三种渲染通道。
_viewPools:单个相机的描述数据类(View) 的对象池。一个View对应一个相机。
_drawItemsPools:渲染数据类的对象池,保存有每个渲染批次需要的model,effect 等数据。
_stageItemsPools:单个渲染通道需要渲染的数据的对象池,本质是对 _drawItemsPools 中的数据按照不同通道进行了分类。
ForwardRender 中定义的成员变量:
_lights:保存所有灯光数据。
_shadowLights:保存所有阴影灯光数据。
类名 ForwardRender 翻译为前向渲染,泛指传统上只有 Opaque 和 Transparent 两个通道的渲染技术。cocos有三个渲染通道,渲染通道方法定义在 _stage2fn 中。
渲染管线具体详解请参考unity官方文档(对的,真要学cocos还得看unity的文档):
内置渲染管线中的渲染路径
相关链接
手游引擎Unity和Cocos各有什么优劣
一、3D游戏(包含2.5D)
只能:Unity3D
作品:职业棒球、星际陆战队等
分布:欧美国家用Unity3D的较多。商业化引擎中,3D游戏占比最高
原因:
就像 @朱云所说。Cocos2d-x目前还不支持3D。相比而言,U3D就是你唯一的选择了。
二、大型2D游戏(可以指安装包上百兆的)
推荐:Unity3D
作品:捣蛋猪、冰雪奇缘、天天飞车、绝代双骄等
分布:欧美国家用Unity3D的较多,国内用Cocos2D-X的多
原因:
1、游戏这东西,就是要跟“直觉”打交道的
我的想法有点极端,我感觉在游戏世界里,代码似乎更像是“妥协”的产物。
如果能做到“所见即所玩”,那真的是一个非常惬意的事。到时候,或许一个8岁小孩就能独立自主的开发一款游戏。
而这一点,Unity3D的王者地位,当之无愧!
2、Unity3D提供了超赞的设计工具,让你感觉像是在用3DMax和Flash来做游戏
3、适合大型团队,美工、动画更容易上手
U3D可以让美工、动画、码农在同一个平台上各司其职。这点从目前来看,Cocos2D-X望尘莫及。
三、中小型2D游戏(百兆以内的)
推荐:Cocos2D-X
作品:捕鱼达人、我叫MT、2048等
分布:东亚游戏多出自Cocos2D-X,尤其中国。但大多为小型游戏
原因:
1、Unity3D比Cocos2D-X的APK包要大了近十倍
仅以Android手机为例,同样的一个2D版HelloWorld,两者的安装包大小:
Unity3D:约为9.27M
Cocos2D-x:约为1.67M
解开包后发现,里面除了两个一共占据近12M的SO库(libmono.so和libunity.so),还有一票的DLL文件。其中System.dll、Assembly-CSharp.dll和mscorlib.dll这三个核心文件就占了5M。虽然它们压缩比约为50%,但仅这些文件就占了这么多。心疼啊。
而这,在“寸土寸金”的中小型游戏面前是多么可怕的数字。
2、Cocos2D-X比Unity3D快很多
即使不用测试工具,也可以轻易的发现这一点。
主要因为Unity3D用了Mono架构,它移植自微软的.Net。每次启动都会加载Mono框架和Unity3D引擎,再加载.Net Assembly(一堆DLL文件),这可比Cocos2D-x这种纯C++(包括Lua和JS)实现要慢很多。
3、独立开发者更喜欢“码”游戏
独立开发者大多是“技术达人”(不然怎么开发游戏)。U3D会让他们有“无所适从”感,从而影响了对U3D的灵活运用。对这些人而言,这是赤裸裸的时间成本。在游戏开发中,这点尤为重要。还是Cocos2D-X让他们更感到“亲切”,更有成就感。
也许你会问:“你怎么知道?”
因为我就是搞技术的。
4、中国游戏多出自Cocos2D-X
Cocos2D-X是正宗国产货,又是优秀的开源项目,国外用户群也不少。
也正是因为这个原因,C2D天生就对中国用户很“偏爱”。比如社区,我在上面问了两个问题,基本上当天问当天答,而且非常热心。从这一点我就对C2D产生了不错的好感。
5、Unity3D要收费
对大型2D游戏团队来说或许还不算什么。
初步算一下,Pro要1500$,手游怎么至少也得兼容iOS和Android吧,各自1500$,再加个Team套装,加一块儿,5000$,两万多银子。
Cocos2D-X免费、开源。遇到问题可以研究源码或向社区求救。
四、微型游戏(指争取安装包在1M以内的)
推荐:AndEngine、Cocos2D-iPhone
作品:Flappy Bird、小球快跑、五子棋等
分布:不需要跨平台的超小游戏用的多。
原因:
如果只想在一个平台上开发游戏,无疑上述两种是最好的选择
其中AndEngine开发出来的游戏最小才400多KB,大名鼎鼎的Flappy Bird就是用它做出来的。
另外,iPhone的Cocos2D划到这里似乎不太合适,但仔细想想,现在有更成熟的Cocos2d-x方案,Cocos2D划到微型游戏一列,相信是早晚的事(个人看法,轻拍)。
五、总结
1、Unity3D:如果你需要开发大型游戏,或需要开发3D游戏的,请选这个。
2、Cocos2D-x:如果你开发的是中小型游戏,对安装包大小比较在意的,请选这个。
3、Andengine、Cocos2D-iPhone:如果你只为开发单平台游戏,又非常在意速度和安装包大小,请选这个。
最后。俗话说:没有最好的,只有最适合自己的。我想这句话同样适用于开发游戏。
转载自知乎张炅轩。
合并并文件中info.json和bin
修改cocos源码。
将生成的所有json文件内容合并成一个大的json object,格式:{"json1文件名":"json1文件内容", "json2文件名":"json2文件内容" 。
将这些json文件内容合并,然后将合并后的内容预置到main.js中,修改cocos源码,判断如果请求的是asset json则从预置的main.js中读取出来,避免网络请求;
cocos2d开发的游戏怎么反编译资源
如果只需要查看java类库里面的代码 可以简单的添加java类库的源代码就行 方法是,随便点开一个没有添加源代码的类,比如 arraylist, 弹出一个页面,有一个attach sourse按钮, 点击,选择中间的那个(从归档文件中获取)
Cocos Creator怎么使用安卓手机相册中的图片,最好有示例源码
android 将drawable中的图片保存到系统相册中的原理比较简单,获取到的bitmap,然后通过的compress方法写到一个fileoutputstream中. 再通知MediaScannerService有图片文件加入就可以了.
保存图片的核心代码如下:
Bitmap bitmap= BitmapFactory.decodeResource(getResources(), R.drawable.icon);
MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, name, "");
或者
FileOutputStream fos = openFileOutput("image", Context.MODE_PRIVATE);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
//发送系统通知消息
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
另一种方法是直接使用文件流读写:
InputStream is = mContext.getResources().openRawResource(PicID);
FileOutputStream fos = new FileOutputStream(LogoFilePath);
byte[] buffer = new byte[8192];
int count = 0;
while((count=is.read(buffer)) 0)
{
fos.write(buffer, 0, count);
}
fos.close();
is.close();
这里要注意目录权限问题:在应用程序AndroidManifest.xml中的manifest节点中加入android:sharedUerId="android.uid.system"这个属性。然后放在源码环境中编译,并通过adb install 的方式进行安装。mk文件中的属性改为LOCAL_CERTIFICATE :=platform。
D划到微型游戏一列,相信是早晚的事(个人看法,轻拍)。五、总结1、Unity3D:如果你需要开发大型游戏,或需要开发3D游戏的,请选这个。2、Cocos2D-x:如果你开发的是中小型游戏,对安装包大小比较在意的,请选这个。3
rdRender 中设置有 shadowcast, opaque, transparent 三种渲染通道。 _viewPools:单个相机的描述数据类(View) 的对象池。一个View对应一个相机。 _drawItemsPools:渲染数据类的对象池,保存有每个渲染批次需要的model,e