手游开发遇到图形问题,有哪些开源图形渲染引擎分析工具可以使用

游戏开发常见岗位需求(参考乐动卓越)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
游戏开发常见岗位需求(参考乐动卓越)
&&游戏开发岗位介绍
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩9页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢渲染状态管理 -
渲染状态管理
文档简介:
  提高3D图形程序的性能是个很大的课题。图形程序的优化大致可以分成两大任务,一是要有好的场景管理程序,能快速剔除不可见多边形,并根据对象距相机远近选择合适的细节(LOD);二是要有好的渲染程序,能快速渲染送入渲染管线的可见多边形。
  我们知道,使用OpenGL或Direct3D渲染图形时,首先要设置渲染状态,渲染状态用于控制渲染器的渲染行为。应用程序可以通过改变渲染状态来控制OpenGL或Direct3D的渲染行为。比如设置Vertex/Fragment
Program、绑定纹理、打开深度测试、设置雾效等。
  改变渲染状态对于显卡而言是比较耗时的操作,而如果能合理管理渲染状态,避免多余的状态切换,将明显提升图形程序性能。这篇文章将讨论渲染状态的管理。
文档目录:
文档内容:
  我们考虑一个典型的游戏场景,包含人、动物、植物、建筑、交通工具、武器等。稍微分析一下就会发现,实际上场景里很多对象的渲染状态是一样的,比如所有的人和动物的渲染状态一般都一样,所有的植物渲染状态也一样,同样建筑、交通工具、武器也是如此。我们可以把具有相同的渲染状态的对象归为一组,然后分组渲染,对每组对象只需要在渲染前设置一次渲染状态,并且还可以保存当前的渲染状态,设置渲染状态时只需改变和当前状态不一样的状态。这样可以大大减少多余的状态切换。下面的代码段演示了这种方法:
&// 渲染状态组链表,由场景管理程序填充
&RenderStateGroupList groupL
&// 当前渲染状态
&RenderState curS
&// 遍历链表中的每个组
&RenderStateGroup *group =
groupList.GetFirst();
&while ( group != NULL )
&&&& // 设置该组的渲染状态
&&&& RenderState *state = group-&GetRenderState();
&&&& state-&ApplyRenderState( curState );
&&&& // 该渲染状态组的对象链表
&&&& RenderableObjectList *objList =
group-&GetRenderableObjectList();
&&&& // 遍历对象链表的每个对象
& && RenderableObject *obj = objList-&GetFirst();
&&&& while ( obj != NULL )
&&&&&&&& // 渲染对象
&&&& &&& obj-&Render();
&&&&&&&& obj = objList-&GetNext();
&&&& group = groupList.GetNext();&
&其中RenderState类的ApplyRenderState方法形如:&
&void RenderState::ApplyRenderState( RenderState &curState )&
&&&& // 深度测试
&&&& if ( depthTest !=
curState.depthTest )
&&&&&&&& SetDepthTest( depthTest );
&&&&&&&& curState.depthTest = depthT
&&&& // Alpha测试
&&&& if ( alphaTest != curState.alphaTest )
&&&&&&&& SetAlphaTest( alphaTest );
&&&&&&&& curState.alphaTest = alphaT
&&&& // 其它渲染状态
  这些分组的渲染状态一般被称为Material或Shader。这里Material不同于OpenGL和Direct3D里面用于光照的材质,Shader也不同于OpenGL里面的Vertex/Fragment
Program和Direct3D里面的Vertex/Pixel
Shader。而是指封装了的显卡渲染图形需要的状态(也包括了OpenGL和Direct3D原来的Material和Shader)。
  从字面上看,Material(材质)更侧重于对象表面外观属性的描述,而Shader(这个词实在不好用中文表示)则有用程序控制对象表面外观的含义。由于显卡可编程管线的引入,渲染状态中包含了Vertex/Fragment
Program,这些小程序可以控制物体的渲染,所以我觉得将封装的渲染状态称为Shader更合适。这篇文章也将称之为Shader。
  上面的代码段只是简单的演示了渲染状态管理的基本思路,实际上渲染状态的管理需要考虑很多问题。
 消耗时间问题
  改变渲染状态时,不同的状态消耗的时间并不一样,甚至在不同条件下改变渲染状态消耗的时间也不一样。比如绑定纹理是一个很耗时的操作,而当纹理已经在显卡的纹理缓存中时,速度就会非常快。而且随着硬件和软件的发展,一些很耗时的渲染状态的消耗时间可能会有减少。因此并没有一个准确的消耗时间的数据。
  虽然消耗时间无法量化,情况不同消耗的时间也不一样,但一般来说下面这些状态切换是比较消耗时间的:
Vertex/Fragment Program模式和固定管线模式的切换(FF,Fixed
Function Pipeline)
Vertex/Fragment Program本身程序的切换
改变Vertex/Fragment Program常量
顶点和索引缓存(Vertex & Index Buffers)切换
  有时需要根据消耗时间的多少来做折衷,下面将会遇到这种情况。
 渲染状态分类
  实际场景中,往往会出现这样的情况,一类对象其它渲染状态都一样,只是纹理和顶点、索引数据不同。比如场景中的人,只是身材、长相、服装等不同,也就是说只有纹理、顶点、索引数据不同,而其它如Vertex/Fragment
Program、深度测试等渲染状态都一样。相反,一般不会存在纹理和顶点、索引数据相同,而其他渲染状态不同的情况。我们可以把纹理、顶点、索引数据不归入到Shader中,这样场景中所有的人都可以用一个Shader来渲染,然后在这个Shader下对纹理进行分组排序,相同纹理的人放在一起渲染。
 多道渲染(Multipass Rendering)
  有些比较复杂的图形效果,在低档显卡上需要渲染多次,每次渲染一种效果,然后用GL_BLEND合成为最终效果。这种方法叫多道渲染Multipass
Rendering,渲染一次就是一个pass。比如做逐像素凹凸光照,需要计算环境光、漫射光凹凸效果、高光凹凸效果,在NV20显卡上只需要1个pass,而在NV10显卡上则需要3个pass。Shader应该支持多道渲染,即一个Shader应该分别包含每个pass的渲染状态。
&&& 不同的pass往往渲染状态和纹理都不同,而顶点、索引数据是一样的。这带来一个问题:是以对象为单位渲染,一次渲染一个对象的所有pass,然后渲染下一个对象;还是以pass为单位渲染,第一次渲染所有对象的第一个pass,第二次渲染所有对象的第二个pass。下面的程序段演示了这两种方式:
&以对象为单位渲染
&// 渲染状态组链表,由场景管理程序填充
&ShaderGroupList groupL
&// 遍历链表中的每个组
&ShaderGroup *group = groupList.GetFirst();
&while ( group != NULL )
&&&& Shader *shader = group-&GetShader();
&&& &RenderableObjectList *objList =
group-&GetRenderableObjectList();
&&&& // 遍历相同Shader的每个对象
&&& &RenderableObject *obj = objList-&GetFirst();
&&& &while ( obj != NULL )
&&&&&&&& // 获取shader的pass数
&&&&&&&& int iNumPasses = shader-&GetPassNum();
&&& &&&& for ( int i = 0; i & iNumP i++ )
&&& &&&& {
&&&&&&&&&&&& // 设置shader第i个pass的渲染状态
&&&&&&& &&&& shader-&ApplyPass( i );
&&&&&&&&&&&& // 渲染对象
&&& &&&&&&&& obj-&Render();
&&& &&&& }
&&&&&&&& obj = objList-&GetNext();
&&&& group = groupList-&GetNext();
&以pass为单位渲染
&// 渲染状态组链表,由场景管理程序填充
&ShaderGroupList groupL
&for ( int i = 0; i & MAX_PASSES_NUM; i++
&&&& // 遍历链表中的每个组
&& & ShaderGroup *group =
groupList.GetFirst();
&&&& while ( group != NULL )
&&&&&&&& Shader *shader = group-&GetShader();
&&&&&&&& int iNumPasses = shader-&GetPassNum();
&&&&&&&& // 如果shader的pass数小于循环次数,跳过此shader
&&&&&&&& if( i &= iNumPasses )
&&&&&&&& {
&&&&&&&&&&&& group = groupList-&GetNext();
&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& // 设置shader第i个pass的渲染状态
&&&&&&&& shader-&ApplyPass( i );
&&&&&&&& RenderableObjectList *objList =&
&&&&&&&&&&&& group-&GetRenderableObjectList();
&&&&&&&& // 遍历相同Shader的每个对象
&&&&&&&& RenderableObject *obj = objList-&GetFirst();
&&&&&&&& while ( obj != NULL )
&&&&&&&& {
&&&&&&&&&&&& obj-&Render();
&&&&&&&&&&&& obj = objList-&GetNext();
&&&&&&&& }
&&&&&&&& group = groupList-&GetNext();
  这两种方式各有什么优缺点呢?
  以对象为单位渲染,渲染一个对象的第一个pass后,马上紧接着渲染这个对象的第二个pass,而每个pass的顶点和索引数据是相同的,因此第一个pass将顶点和索引数据送入显卡后,显卡Cache中已经有了这个对象顶点和索引数据,后续pass不必重新将顶点和索引数据拷到显卡,因此速度会非常快。而问题是每个pass的渲染状态都不同,这使得实际上每次渲染都要设置新的渲染状态,会产生大量的多余渲染状态切换。
  以pass为单位渲染则正好相反,以Shader分组,相同Shader的对象一起渲染,可以只在这组开始时设置一次渲染状态,相比以对象为单位,大大减少了渲染状态切换。可是每次渲染的对象不同,因此每次都要将对象的顶点和索引数据拷贝到显卡,会消耗不少时间。
  可见想减少渲染状态切换就要频繁拷贝顶点索引数据,而想减少拷贝顶点索引数据又不得不增加渲染状态切换。鱼与熊掌不可兼得 :-(
  由于硬件条件和场景数据的情况比较复杂,具体哪种方法效率较高并没有定式,两种方法都有人使用,具体选用那种方法需要在实际环境测试后才能知道。
 多光源问题
 阴影问题
  现在很多图形程序都会自己定义一种脚本文件来描述Shader。
  比如较早的(Object-oriented
Graphics Rendering Engine,面向对象图形渲染引擎)的Material脚本,的Shader脚本,以及刚问世不久的Direct3D的Effect
File,nVIDIA的CgFX脚本(文件格式与Direct3D
Effect File兼容),ATI
使用的xml格式的脚本。OGRE
Material和Quake3 Shader这两种脚本比较有历史了,不支持可编程渲染管线。而后面三种比较新的脚本都支持可编程渲染管线。
&OGRE Material
封装各种渲染状态,不支持可编程渲染管线
&Quake3 Shader
封装渲染状态,支持一些特效,不支持可编程渲染管线
&Direct3D Effect
封装渲染状态,支持multipass,支持可编程渲染管线
&nVIDIA CgFX脚本
封装渲染状态,支持multipass,支持可编程渲染管线
RenderMonkey脚本
封装渲染状态,支持multipass,支持可编程渲染管线
  使用脚本来控制渲染有很多好处:
可以非常方便的修改一个物体的外观而不需重新编写或编译程序
可以用外围工具以所见即所得的方式来创建、修改脚本文件(类似ATI
RenderMonkey的工作方式),便于美工、关卡设计人员设定对象外观,建立外围工具与图形引擎的联系
可以在渲染时将相同外观属性及渲染状态的对象(也就是Shader相同的对象)归为一组,然后分组渲染,对每组对象只需要在渲染前设置一次渲染状态,大大减少了多余的状态切换
本站中所有文章以及图形均为作者本人、公司所有,本站所有资讯仅供参考,若有任何损失本站概不负责,请自行斟酌。
Copyright &
? 中国游戏开发技术资源网() All Rights reserved.
This site is optimized for at least
resolution (hi-color) viewing
with a browser that supports style sheets.您当前的位置:菜鸟在线教育& &
手游开发培训
如今72%的游戏开发类别工作者会选择Unity3D作为他们的首选开发工具,在这之外,应用Unity3D目标定位于桌面平台开发又占据了一半的数值,显然这比均值高出很多。另外一些例如垂直功能,视觉结构,教育,军事仿真等Unity3D都十分迎合广大用户的需求。在开发上,Unity3D可谓及其的全面,其简单易学的特性也是广大开发者们最喜欢的一点,百分之66%的Unity3D使用者均投票表示,在一个月就可以轻松掌握Unity3D开发,而这么高的数值,显然是其他开发工具所无法做到的。
一次开发,多平台发布
Unity3D引擎是跨平台开发引擎,开发时只需要写一套代码,就可以在多个平台发布游戏,平台包括:IOS、Android、苹果电脑、Windows和浏览器
框架式开发,上手容易
Unity3D是当下最流行的3D游戏开发框架,框架设置本身就面向一半学习者,所以学习容易,并且、unity3D学习资料丰富,一同学习的人多,方便交流
行业前景广阔,薪资高
游戏行业随着技术的进步也在不断进步,本身行业前景就十分广阔,而且Unity3D不仅可以开发游戏,还可以涉猎影视、虚拟现实、增强现实等行业
菜鸟在线 8 大优势
行业专家,不仅教授你专业知识和技能,还能讲在企业的工作经验传授给你
先就业后付款
入学前与学员签订就业保障协议,保障学员的就业,就业后才付款
零基础入学
由浅入深的课程体系,循序渐进的教学模式,让无基础的学员也轻松学会
班主任与任课教师会管理学员饮食起居与学习状况,确保学员安全、健康、学习好
学习效果评估
任课教师会时时了解学员的学习结果,还会定期考试、评测来考察学生情况
智能学习系统
利用互联网最新技术,实现因材施教,让学员使用更适合自己的学习方式和进度
免费线上课程
面授学员不仅可以由高级教师带领,而且能免费学习菜鸟在线的所有线上课程
实战化教学
讲师均为资深的多年从业人员,课程设置中也以案例教学贯穿始终
循序渐进的教学体系&&& 无论你何种基础都能学习
零基础入学,循序渐进的学习体系,快速提升转变。强化、科学的管理方式,全日制高效学习
BAT人才素质体系,行业公认的能力结构评测。
第一章:C#语言基础
1. 开发工具介绍
2. 语言基础:类型,标识符,语句,表达式,变量,常量,枚举,操作符,方法,流程控制,预处理
3. 面向对象编程:类,this关键字,封装,继承与多态,静态成员,序列化
4. 字符串:创建,比较,插入,删除,查找
5. 数组:一维数组,二维数组,创建,遍历,插入,删除,查找,排序
6. I/O操作:写文件,读文件删除文件,读写bytes
7. 委托:委托与事件,泛型委托,Action
第二章:Unity编辑器使用
1. 界面布局
4. 项目视图(Project)
5. 层级视图(Hierarchy)
6. 检视视图(Inspector)
7. 游戏视图(Game)
8. 场景视图(Scene)
9. 控制台视图(Console)
第三章:Unity游戏物体
1. 游戏物体(GameObject)
2. 基本几何体
3. 2D物体(Sprite)
4. 摄像机(Camera)
5. 灯光(Light)
6. 音频(Audio)
7. 粒子系统(Particle System)
8. 预设体(Prefab)
第四章:飞机大战,3D桌球
1. 导入美术资源:模型(.fbx),贴图(.png)
2. 创建场景
3. Unity游戏物体
4. 创建材质(Material)
5. 创建动画(Animation)
6. 设置摄像机和灯光
7. 创建脚本:MonoBehaviour内置方法介绍,Vector3类使用
8. Transform组件使用9. 键盘操作(Input)
10. 鼠标操作(Input)
只有实战出身的老师才能帮你上岗提薪
魏老师 Unity技术专家
8年游戏开发经验,曾是遨游世界(FWG)在中国研发基地核心成员,国内知名IT培训机构担任高级培训讲师,乐动汇智主要项目负责人,参与游戏《波曼大陆》《Birdies》《Bahamnut》《极限狂飙》《暴走亚瑟王》等多款大型游戏的制作。
杨老师 游戏美术专家
从事行业7年,曾是北京金山炼金工作室美术骨干,星燃灵动科技有限公司制作组组长。后期转入培训担任水晶石数字科技学院游戏美术组高级讲师。参与作品:《极品飞车》,《FIFA》,《上古神殿》,《明天ol》,《星动世界》等多款大型单机和网游制作。
Unity3D开发学员作品
3D设计学员作品
游戏开发学员作品
HTML5学员作品
游戏原画学员作品
虚拟现实学员作品
抓住机会享受入学优惠
请选择城市北京广州南京
详情请进入
查看,文章来源:
开班时间: 滚动开班
课程费用:咨询
咨询电话: 咨询QQ:
刚开始写这篇文章的时候选了一个很土的题目。。。《Unity3D优化全解析》。因为这是一篇临时起意才写的文章,而且陈述的都是既有的事实,因而给自己“文(dou)学(bi)”加工留下的余地就少了很多。但又觉得这块是不得不提的一个地方,平时见到很多人对此处也给予了忽略了事,需要时才去网上扒一些只言片语的资料。也恰逢年前,寻思着周末认真写点东西遇到节假日没准也没什么人读,所以索性就写了这篇临时的文章。题目很土,因为用了指向性很明确的“Unity3D”,让人少了遐(瞎)想的空间,同时用了“高大全”这样的构词法,也让匹夫有成为众矢之的的可能。。。所以最后还是改成了现在各位看到的题目。话不多说,下面就开始正文~正所谓“草蛇灰线,伏脉千里”。那咱们首先~~~~~~
匹夫印象里遇到的童靴,提Unity3D项目优化则必提DrawCall,这自然没错,但也有很不好影响。因为这会给人一个错误的认识:所谓的优化就是把DrawCall弄的比较低就对了。
对优化有这种第一印象的人不在少数,drawcall的确是一个很重要的指标,但绝非全部。为了让各位和匹夫能达成尽可能多的共识,匹夫首先介绍一下本文可能会涉及到的几个概念,之后会提出优化所涉及的三大方面:
drawcall是啥?其实就是对底层图形程序(比如:OpenGL ES)接口的调用,以在屏幕上画出东西。所以,是谁去调用这些接口呢?CPU。
fragment是啥?经常有人说vf啥的,vertex我们都知道是顶点,那fragment是啥呢?说它之前需要先说一下像素,像素各位应该都知道吧?像素是构成数码影像的基本单元呀。那fragment呢?是有可能成为像素的东西。啥叫有可能?就是最终会不会被画出来不一定,是潜在的像素。这会涉及到谁呢?GPU。
batching是啥?都知道批处理是干嘛的吧?没错,将批处理之前需要很多次调用(drawcall)的物体合并,之后只需要调用一次底层图形程序的接口就行。听上去这简直就是优化的终极方案啊!但是,理想是美好的,世界是残酷的,一些不足之后我们再细聊。
内存的分配:记住,除了Unity3D自己的内存损耗。我们可是还带着Mono呢啊,还有托管的那一套东西呢。更别说你一激动,又引入了自己的几个dll。这些都是内存开销上需要考虑到的。
好啦,文中的几个概念提前讲清楚了,其实各位也能看的出来匹夫接下来要说的匹夫关注的优化时需要注意的方面:
所以,这篇文章也会按照CPU―->GPU―->内存的顺序进行。
上文中说了,drawcall影响的是CPU的效率,而且也是最知名的一个优化点。但是除了drawcall之外,还有哪些因素也会影响到CPU的效率呢?让我们一一列出暂时能想得到的:
物理组件(Physics)
GC(什么?GC不是处理内存问题的嘛?匹夫你不要骗我啊!不过,匹夫也要提醒一句,GC是用来处理内存的,但是是谁使用GC去处理内存的呢?)
当然,还有代码质量
DrawCalls:
前面说过了,DrawCall是CPU调用底层图形接口。比如有上千个物体,每一个的渲染都需要去调用一次底层接口,而每一次的调用CPU都需要做很多工作,那么CPU必然不堪重负。但是对于GPU来说,图形处理的工作量是一样的。所以对DrawCall的优化,主要就是为了尽量解放CPU在调用图形接口上的开销。所以针对drawcall我们主要的思路就是每个物体尽量减少渲染次数,多个物体最好一起渲染。所以,按照这个思路就有了以下几个方案:
使用Draw Call Batching,也就是描绘调用批处理。Unity在运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们。具体下面会介绍。
通过把纹理打包成图集来尽量减少材质的使用。
尽量少的使用反光啦,阴影啦之类的,因为那会使物体多次渲染。
Draw Call Batching
首先我们要先理解为何2个没有使用相同材质的物体即使使用批处理,也无法实现Draw Call数量的下降和性能上的提升。
因为被“批处理”的2个物体的网格模型需要使用相同材质的目的,在于其纹理是相同的,这样才可以实现同时渲染的目的。因而保证材质相同,是为了保证被渲染的纹理相同。
因此,为了将2个纹理不同的材质合二为一,我们就需要进行上面列出的第二步,将纹理打包成图集。具体到合二为一这种情况,就是将2个纹理合成一个纹理。这样我们就可以只用一个材质来代替之前的2个材质了。
而Draw Call Batching本身,也还会细分为2种。
Static Batching 静态批处理
看名字,猜使用的情景。
静态?那就是不动的咯。还有呢?额,听上去状态也不会改变,没有“生命”,比如山山石石,楼房校舍啥的。那和什么比较类似呢?嗯,聪明的各位一定觉得和场景的属性很像吧!所以我们的场景似乎就可以采用这种方式来减少draw call了。
那么写个定义:只要这些物体不移动,并且拥有相同的材质,静态批处理就允许引擎对任意大小的几何物体进行批处理操作来降低描绘调用。
那要如何使用静态批来减少Draw Call呢?你只需要明确指出哪些物体是静止的,并且在游戏中永远不会移动、旋转和缩放。想完成这一步,你只需要在检测器(Inspector)中将Static复选框打勾即可,如下图所示:
至于效果如何呢?
举个例子:新建4个物体,分别是Cube,Sphere, Capsule, Cylinder,它们有不同的网格模型,但是也有相同的材质(Default-Diffuse)。
首先,我们不指定它们是static的。Draw Call的次数是4次,如图:
我们现在将它们4个物体都设为static,在来运行一下:
如图,Draw Call的次数变成了1,而Saved by batching的次数变成了3。
静态批处理的好处很多,其中之一就是与下面要说的动态批处理相比,约束要少很多。所以一般
校区分布Related schools
师资介绍|教学环境|学员评论
教学点: 3个独立游戏开发者分享2D手游制作该用哪些工具及经验-游戏技术媒体-Dogame游戏兵工厂
DOGAME游戏兵工厂-中国游戏行业第一游戏技术媒体门户|游戏美术|游戏模型|游戏资讯|游戏招聘
找工作?--个人用户
缺人才?--企业用户
要高薪?--高级人才
论坛会员登录--个人求职
论坛会员登录--企业招聘
论坛会员登录--高级人才
独立游戏开发者分享2D手游制作该用哪些工具及经验
【编辑:游戏兵工厂】&&发布日期:日   点击率:4027
游戏兵工厂新闻报道:
随着2015年全球手游行业规模将突破250亿美元,越来越多的开发者开始进入手游研发领域,而作为一名菜鸟,很多时候,如果没有其他开发者的建议,我们会走很多弯路,分享了进入手游研发到如今四年多以来积累的经验,希望可以给新入行者提供一些帮助。
一开始进入游戏研发领域的时候,你很难知道该选择什么工具、什么程序语言以及哪些框架,你会面临许许多多的选择和建议,我和我的团队总能发现其他游戏公司的经验是有用的,所以这里提供一些我们的经验,希望给做手游的新手们一些帮助。
初入手游行业
虽然在其他行业有过10多年的编程和策划经验,但当我开始做手游研发的时候,依然觉得自己是一只菜鸟。我们的第一个游戏Furdiburb(宠物冒险游戏)最初是在2009年开始研发的,当时是专门为Android而做的。对于毫无游戏研发经验的我们来说,Java是唯一可用到编程语言。作为一个2D游戏,我们非常不明智的没有使用OpenGL就开始进行非硬件加速图形开发。随着Furdi受到了更多人的欢迎,我们的游戏项目也得到更多的注意,最终我们遇到了性能和移植问题。如果我们此前学习了其他开发者的经验,很多问题都是可以完全避免的。
找到更好的方法
在完成了Furdiburb的研发,并且使用playn缓慢的把游戏移植到了iOS平台之后,我们决定开始第二款游戏(Eras of Alchemy)的研发。我们当时希望摆脱Java语言,找到可以广泛使用的跨平台研发工具,最好是未来还可以支持主机游戏平台。
随后我们开始了搜索,我用了将近一个月的时间对框架、工具以及引擎进行对比,最后,我和我的团队非常满意新的研发方式,直到现在也非常不错。这里我不会说为什么要选择这些,框架是经常变化的,一年前选择它的理由可能到现在就已经不再是考虑的主要因素了。所以,这篇文章的其余部分只会对我们选择某个工具的原因进行简单的描述。以下就是我们当初选择并对比了一个月之后的结果:
我们所列举的都是在研发我们游戏的时候用到的,而且只是我们做游戏的方式而已,很多工具和框架的结合也是非常完美的,需要开发者们自行发现。
我们选择的所有架构,要么是开源的,要么就是有开放的代码。这是非常好的,因为我们在必要的时候可以进行紧急修改和优化。
Cocos2d-x:我们所有的跨平台研发都是使用开源Cocos2d-x框架完成,在Eras Of Alchemy的研发过程中,我们使用了版本2,我们的下一个游戏正在使用的是版本3,进行了大幅度的API以及性能提升。整体来说,Cocos2d-x的2D表现非常好,而且文件管理非常方便。
Spine:我们使用Spine做了动画,所以我们加入了C语言为基础的Cocos2d-x插件。
Box2D:我们还没有发布一款使用该引擎的游戏,但我们的下一款游戏A Quiver Of Crows将会使用,我们目前研发就使用了这个工具。
SQLite:Cocos2d-x本身也提供数据存储方案,但我们更喜欢使用SQLite,因为它的读写速度和表现更好。
编程语言:
C++:Cocos2d-x支持多种语言编程,但我们选择了C++,因为我们觉得目前该语言是最合适做跨平台研发的。
C:你经常会想要加入一些开源的API,其中有一些就是C语言编程的。
Java:我们依然需要用到Java,但也只是在Android平台做游戏内IAP、广告以及特殊系统功能的时候。语言之间的切换可以通过JNI来完成。
Objective-C:选择它的理由和Java一样,我们使用Objective-C是为了使用iOS系统的特定功能。
Scripting:这包括程序化脚本和其他脚本语言,所有的开发者们都要时不时的写脚本,但我们却很少会谈论这个问题。这个问题是非常容易的,但如果你和我一样而且由于不常使用而不记得一些语法的话,这个工作有是非常耗时间的,我们要给维护代码、自动音频转换以及纹理打包写脚本。
Xcode:所有人都告诉我们说Xcode非常好,所以我进行了尝试,而且我不得不说的是,这是目前我最喜欢的开发环境。这里我并不想说太多具体的原因,因为我不想引发集成开发环境(IDE)争论,我们使用Xcode做跨平台研发,也为苹果平台做专门的编程。
Eclipse:对于IDE来说慢的可怕,但我看来却非常好用。我们用Eclipse做了所有的Java和Android研发,包括适配和修复bug。Android目前在推Android Studio而不是Eclipse,但我们没有那么多的时间,也没有什么特别的理由去转换到新的工具。
Visual Studio:也是个非常优秀的IDE,我们用它来做左右和微软相关的编程、Bug修复以及适配。
即便你的团队只有一个人,你也应该使用版本控制。所有人都会犯错,而且任何一次大改都可能导致游戏神秘的死亡。我们的团队只有3个人,因此从第一天做手游开始,版本控制就是非常必要的。目前有非常多的方案可以选择,但我们使用的有以下几个:
SVN:我个人喜欢SVN,因为可以做到所有我需要的功能,比如合并、同步、恢复等等,但学习起来比较困难。
Git:我们使用的很多开源框架都使用Git。我们使用Git就是为了保持与框架同步,当需要的时候可以进行快速修复。
很明显,你做游戏是需要使用电脑的。最初所有的研发都是在Linux机器上完成的。但我们开始了iOS平台的研发之后,用两三台电脑变得效率非常低,所以我们买了一些iMac,而且我们都非常喜欢用它来做游戏研发。幸运的是,OSX的很多指令与Linux相同,所以我们的很多脚本都没有做改变。
Adobe CS:相信这个没有人觉得奇怪,我们的美术师最常使用的是Illustrator和Photoshop。
Spine:非常推荐这个工具制作骨骼动画,和传统的帧到帧动画相比,骨骼动画可以节约硬盘空间,还可以节约大量的研发时间,提供强大的功能,比如动画混合、蒙皮技术以及网格变形。
Texture Packer:你或许会想要把图片进行打包获得更大的图像以获得更好的游戏表现。我们选择Texture Packer来完成这项工作,而且我们还使用它的指令功能进行自动化打包处理
关卡编辑器
我们使用的关卡编辑工具包括:
没有编辑器:如果可以不用的话,我们绝不会使用编辑器。我们可以用代码解决,这听起来非常疯狂,而且有点浪费时间,但如果你的团队非常小的话,有时候为了节约时间可以不必为了一次性的任务专门用代码写一个编辑器。
定制化编辑器:有时候我们写了一个非常不好用的游戏内编辑器来做图形或者关卡,我的意思是未经优化的,恐怕也只有我们会这么做。
R.U.B.E:对于我们的下一个游戏,我们在使用R.U.B.E(Really Useful Box2D Editor)之前,几乎自己研发了一个游戏内编辑器,这个非常强悍的工具节约了我们大量的时间,但如果我们决定要做关卡编辑器的话,我们必须自己研发。
音乐和视频
Ffmpeg:我个人非常喜欢ffmpeg,这个工具非常好用,我们通常使用脚本用它把我们的视频变成各个平台需要的格式。
Cakewalk Sonar:这是个非常强悍的音乐制作软件,一开始的学习会比较困难。
GArritan Personal Orchestra:如果你想给自己的游戏加入管弦乐,Garritan可以带来非常高质量的音乐,我们通常和Sonar混合使用。
Audacity:一个非常不错的视频编辑和录制工具。
以下2个是我们已经不再使用的工具,但可能对于新手来说依然具有推荐意义:
Anvil Studio:如果你熟悉乐器而且乐意学一些音乐知识,并且想要做MIDI格式的音乐,这是个非常不错的软件。
Linux Multaimedia Studio:这是个非常不错而且简单的软件,可以制作非常不错的音乐,而且不需要你阅读很多的音乐知识。
目前做游戏的工具非常多,以上的这些工具只是我们在做2D游戏的时候选择的工具,目前为止,我们对这些工具非常满意,我们最新的游戏发布到了iOS、Android和Windows Phone平台。我们还打算在下一款游戏发布的时候,用同样的工具把游戏扩展到PC、Mac以及Linux平台。
DOGAME游戏兵工厂()打造游戏技术媒体平台。游戏开发专业网站,集合了、游戏开发与商务合作、Dogame、下载、游戏技术论坛等板块。每天游戏媒体资讯,实时更新,掌握游戏行业动态。
&关注DOGAME游戏兵工厂微信获赠VIP会员
最新游戏行业动态、活动请关注
DOGAME游戏人才招聘HNYU GAME

我要回帖

更多关于 图形渲染失败 的文章

 

随机推荐