天天酷跑cocos源码_天天酷跑源代码

hacker|
120

文章目录:

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。

2条大神的评论

  • avatar
    访客 2022-09-24 上午 06:06:24

    D划到微型游戏一列,相信是早晚的事(个人看法,轻拍)。五、总结1、Unity3D:如果你需要开发大型游戏,或需要开发3D游戏的,请选这个。2、Cocos2D-x:如果你开发的是中小型游戏,对安装包大小比较在意的,请选这个。3

  • avatar
    访客 2022-09-24 上午 07:03:19

    rdRender 中设置有 shadowcast, opaque, transparent 三种渲染通道。 _viewPools:单个相机的描述数据类(View) 的对象池。一个View对应一个相机。 _drawItemsPools:渲染数据类的对象池,保存有每个渲染批次需要的model,e

发表评论