• About
    • Resume
A Game Developer also plays some guitar

Category Archives: 3d

[译]优化你的手机游戏(没有延迟的,才是健康的)- 一篇给游戏美术设计师读的文章

May 5, 2013 10:27 pm / Leave a Comment / Benny Chen

[译者的话(新浪微博@滚石,欢迎大家一起讨论)]
由于公司目前没有专业的技术美术(Technical Artist),在最近的项目开发中碰了不少壁。于是我就特地做了一些关于美术方面优化的研究,听了一些讲座,阅读了一些文章,你即将阅读的这篇就是其中之一,我觉得不错,并在阅读中获得了共鸣,所以也就决定将这片文章翻译为中文。一来希望在公司中,对于我们的美术设计师作为一个参考,另外分享出来也希望,如果能有那么一点点帮助到跟我们遇到同样困扰的团队或者美术或者任何同仁们,我将万分荣幸。

由于我是一个程序猿,所以翻译中难免有些话或者美术专业术语译的比较二的地方,还请谅解。

原文地址:Optimising Your Mobile Game (Less Lag, More Awesome)

———————————————————————-

你是否曾经开发了一个手机游戏,在你把它递交给reviewer时,本来满心希望它像百米冲刺一样高速运行,结果却步履蹒跚,甚至最后慢得跟爬行一样。

这很烂,不是么?我们意识到这本来是可以避免的,但很多小的错误和疏忽不断堆积,最终造成了程序的瘫痪:它太慢了!

介于我们一直这么粗心犯错,我们一定是忘了给自己的”角色属性表“加上预知未来的能力了 🙂

如果一直这样,那我们开发的游戏——AlieNation,将变得根本不能玩。幸运的是,我们停止了错误,并开始搜集大家的想法,对游戏进行优化(优化成为了我们开发中的新王牌武器!)

alienation

为什么我们从2D转向3D

考虑到从测试玩家和本地媒体获得的认可,我们决定创建一个3D摧毁型游戏(destruction game),以填补市场上的空白。很惊讶大多数的摧毁型游戏都是2D的,但3D才是摧毁型游戏应该的样子,因为3D版本的感觉是如此的棒。当然,你需要做更多的工作来优化你的美术流水线(art pipeline)。

高效和优化让我在一些甚至不知晓的领域中感觉到从容温暖,所以在这里有一些事情要和你们分享,我铭记它们于脑中,并且一直提醒我的团队遵循它们,以保证我们的3D游能够持续运行流畅。

何时选择3D(何时保留2D)

作为一个3D游戏美术,我得到的第一个关键教训就是,让所有的东西尽可能的保持低模——不要使用额外的不必要的顶点,如果你确实要让你的模型拥有精度,把它放置在贴图中。比如说,我们的建筑物都是用简单的方块创建而成,然后贴上带有质感的细节纹理。

当我们要为Vogel教授(它只在我们游戏的GUI和HUD中出现)建模时,首先尝试的是3D模型,但是最终,我们还是把它分解为像Flash中那样的多层2D平面。它运行非常流畅,看上去也更棒,事实最终的结果比用3D模型赞非常多!使用带有动画的2D平面,可以很容易的创造细节,使得Vogel教授看起来非常酷,并吻合整个游戏的艺术风格。

现在每次我看到它时(下图的左下角就是Vogel教授),还会忍不住幸福热泪 ;-(

vogelingame

不要在贴图(纹理)优化上偷懒!

贴图大小是最容易被大多数美术设计师忽视优化的,要知道,贴图会占用非常非常多的空间!

通过跟几个设计师聊天,我发现他们中很多人都习惯于创建他们觉得舒适的尺寸,比如512×512,这符合常理,没什么错误,但唯一的问题就是,设计师不会在导出贴图之前,将它们降低到一个更加合理的尺寸。

一个更小更高效的贴图文件,在放置到游戏中后,可以和一个超大的贴图文件看起来效果一样好!但是如果设计师所有的工作都是在错误的贴图尺寸中进行的,很不幸,所有设计师花费了大量时间绘制的漂亮美术细节,在游戏中被降低尺寸后,会被无情的抹杀 🙁

为了完全避免这个问题,我建议设计师应该在降低尺寸后对贴图做一些额外处理,亦或者是在创建时直接使用和在游戏中一样的分辨率。因为这样的话,设计师才能够精确掌控贴图中的每一个像素点。

文件格式,贴图重用和Shaders

PNG相比于其它很多格式没那么“邪恶”。相比于JPEG的有损压缩,它的压缩是无损的;它虽然对于Alpha透明的处理不像TGA那么出色,但是它既压缩文件同时又能保证足够好的Alpha映射,确实比其它的格式胜出一筹。

texfilesize

很多团队的教训是类似的:

不合理的贴图尺寸 + 不合理的文件格式 = 占用了太多的纹理空间 = 更慢的游戏 = 找到纹理并降低尺寸 = 丢失细节 = 浪费时间 = 非常沮丧的美术设计师 = 非常愤怒的美术总监 🙁

另外一个关于贴图非常有用的建议是——尽可能的重用它们。很显然,这个不光对贴图,对其它任何游戏资源都应该如此。在我们创建Alienation的过程中,我们没有创建新的贴图用于几乎很难被看到的武器和金属物体上,而重用了建筑物的贴图用在这些非常小而琐碎的物体上。只需要一点UV技巧,你永远不会发觉它们的贴图其实是被重用的。

非常重要的一点,你要选择合适的Shader程序。当然,法线高光Shader(Bumped Specular Shader)用到物体上时,看起来太他妈的赞了,但是应该使用特定的手机定制shader,让游戏更高效。在Unity中,这比较容易做到,因为Unity内置了一整套专门针对手机的shader。

什么时候采用Alpha贴图,什么时候使用Mesh(网格模型)

Alpha贴图的卓越优点是它可以让一个物体的部分透明,非常容易,并且也相对的比较经济(cheaply)[作者注:这里说“经济”是相对的,是从处理消耗(processing cost)的角度说的。每一个像素,多边形,shader,light,粒子和骨骼,都会消耗你的游戏的处理性能。]

然而,在有些情况下,mesh比alpha贴图要更高效。举例说,当我们为汽车创建一个轮子时,为了表现轮子中间的缺口,建立轮子的网格模型要比使用贴图+透明的方式,来得高效的多。

我意识到,在这里我有点自相矛盾了,因为之前我说过,要把更多的细节放在贴图中,而不是网格模型上。记住一点,没有绝对的优化技术,如果你拥有这样的能力可以在特定时候选择使用最合理的优化技术,就造就了你不仅仅是一个游戏美术设计师,而且是一个伟大的牛逼的设计师 😀

thumbsup

粒子系统,draw calls,还有物理

对于任何游戏,视觉上的反馈(visual feedback)对于吸引玩家是异常重要的。如果对于玩家的操作缺少反馈,游戏会变得非常无聊,令人昏睡。

说到反馈:粒子效果是一个非常好的给玩家传递信息的方式。可能是一个子弹打到墙上产生的火花粒子效果,又或者是子弹射击一个纳粹分子的血溅粒子效果。

但是对于粒子,有些事情很容易犯错。第一点是对于粒子的贴图大小,对于贴图大小问题,本文的前半部分已经提到,如果你跳过了那部分,强烈建议你回到前面去看一看,我保证那部分内容能让你马上在贴图优化上变成一个更性感的人(而不是一个胡乱贴图的人):D

对于粒子系统的第二点是,很多人没有意识到,增加粒子个数,根本不会增加粒子效果的牛逼度——只会让游戏变得更慢。一个人可以用两种方式创建粒子效果:第一种是用尽可能少的发射数量,来达到一个最好的效果;另一种人就是搞2000个粒子,然后…慢慢跑吧…

你很少在现实游戏中见到过一个发射器包含2000个粒子效果,唯一的原因就是draw calls。

draw call是针对场景中每一个不同的物体而创建的(多一个draw call就会多增加一点游戏的处理时间)。对于粒子系统而言,在draw call上,很容易超载。

我喜欢制作一些粒子效果,但是每当我看到一些初级的设计师,看到一个漂亮而高效的粒子效果问:“只有10个粒子?太少了,这个如果用2000个粒子会更好”,我就巨他妈的沮丧,甚至肉体难受 🙁

particles

对于上图,厄….这…..你为什么要这么搞,非常差劲的初级美术。

物理

没有什么比准确的射击到一个建筑物,并看到它优雅壮丽的倒下更酷了。

为什么会这样?所有的这一切都是因为甜美而性感的物理系统。

当说到物理系统时,程序猿可是这方面的专家。所以接下来的一段话,可能是一种程序猿专用的非常难以解析的语言,所以如果您是一位美术,在这里就忍忍吧 😉

在每一帧,物理系统都会更新很多次,物理会更新受其影响物体的位置,速度和其他一切跟运动相关的属性。每一帧物理的更新次数会直接影响到游戏的运行速度。所以加快游戏运行的一个方式就是减少每一帧物理系统被更新的次数。

这当然是一种可以尝试的方式,但是带来的坏处是会影响你的物理系统的准确性,所以平衡好每帧的更新次数,以获得最佳并最高效的物理效果是非常重要的。

一个例子,当我们减少了每帧物理更新的次数时,我们游戏中的一个球体可能穿过了一道墙,这…我觉得球穿墙可是不真实的,你呢?

所以要调节到一个最优的物理更新帧率是不容易的,这可花了我们公司的程序猿们好一段时间。

光照和天空盒

两件事情我会快速过下——光照和天空盒。

关于天空盒,很称奇的一点是其实你根本不需要使用它们作为天空!(我对吗?!?!)

一个非常棒的方式是在天空中包含背景艺术(background art),这使得能很经济简单的加入非常多的背景艺术和气氛到游戏中。

光照有点神秘,所以我直接了当,对于手机,最好使用平行光(directional light),或者如果你够幸运,加几盏点光(point light)也可以。在Alienation游戏中,在对light做了日以继日的研究后(我撒谎了,其实我就是google了一下unity light;-)),我发现聚光灯(spotlight)在手机游戏上是最消耗性能的光源,慎用。

结束这一切

本文中提到的所有建议,独立采纳其中的一条并不会让你的游戏马上得到改观。

但是如果你综合采纳所有的这些优化,你的游戏品质一定会马上得到质的提高,到时候,嗯哼,等着幸福的哭吧~

——————————————————————————

[译者的话]
个人觉得,这些建议非常好,并在游戏开发中时刻提醒自己遵循它们。但是因为大家开发的游戏都是各式各样的,使用的引擎也完全不同。不要把某种优化建议当成教条,应该选择最适合你们团队的。尽量多使用游戏引擎的profiling,以及时观察分析游戏中影响游戏系能的因素,而不要教条式的麻木follow各种优化建议。

Posted in: 3D, Game Programming, Some Experiences, Uncategorized, Unity

3ds-max-exporter-plugin

June 15, 2011 9:50 pm / 1 Comment / Benny Chen

把两年前的那个3ds max导出插件项目上传到了google code,代码基本上已经能嗅到铁锈的味道了。现在再上传,一来作备份,二来open source是一件光荣的事情,或许会有人需要它。

地址:

http://code.google.com/p/3ds-max-exporter-plugin/

介绍:

This project was developed with 3DS Max 9 SDK in C++, Visual Studio 2005. This exporter plug-in is aimed to export 3D mesh data from 3DS Max into a predefined file format. These mesh data includes vertices, texture, normals, skeletal animation, etc.

The project was kinda old and becoming a legacy. I developed it in 2009, but never have any update since that. Recently, I am more and more realizing the importance of being open source. So this is why after such a long time I decided to upload it onto Google Code.

I uploaded all the related docs and source code here, for anyone in need. And I would feel extremely flattered if anyone thinks it helpful.

Articles from my blogs about this plugin:
1st part: My Footsteps of Programming 3DS Max Exporter Plug-in (1)
http://www.bennychen.cn/2009/11/my-footsteps-of-programming-3ds-max-exporter-plug-in/
2nd part: My Footsteps of Programming 3DS Max Exporter Plug-in (2)
http://www.bennychen.cn/2010/05/my-footsteps-of-programming-3ds-max-exporter-plug-in-continued/

Introduction to Source Directory:

– CSMExporter is the 3dmax exporter project;
– RenderCSM is a MFC project used to render a CSM file exported from CSMExporter;
– CrowdSimulationModelExporter.dle is the generated 3ds max plugin file outputted from CSMExporter project;
– Doxygen_Docs is the html documentation generated by Doxygen for both projects ‘CSMExporter’ and ‘RenderCSM’;

Posted in: 3D, Computer Graphics, Game Programming, My Projects / Tagged: 3dsmax, exporter, plugin

[译]3D为互联网准备好了么?

June 17, 2010 11:31 pm / Leave a Comment / Benny Chen

原文:Is 3D Finally Ready for the Web?
作者:Sixto Ortiz Jr.
来源:Computer archive, Volume 43, Issue 1 (January 2010) table of contents, Pages: 14-16, 2010

Introduction 介绍

最初的互联网是以一个简陋的鼠标点击环境开始的,但如今,互联网上已经到处是各种眼花缭乱的页面,充满着各种丰富的应用程序,有的用来娱乐,有的用来提高生产率,等等等等。用户可以在互联网上完成各式各样的任务,不管是购买商品,还是与全世界的用户实时交互。然而,一个关键的元素却迟迟没有在互联网上打上自己的烙印——3D。

在今天,3D的在线应用主要是游戏和虚拟世界,这些都需要强大的电脑和特殊的软件来支撑。然而,商业,工程企业和其他一些用户同样也需要3D,他们同样也需要3D所带来的真实感和更多细节。用户希望他们能够在浏览器中获得和在PC中一样的体验。并且由于3D技术在电影、游戏和其他各种娱乐行业中的广泛应用,消费者已经对它习以为常。因此,对于互联网上更多且更易于访问的3D内容的需求变得越来越强烈。况且更好的浏览器体验同时也意味着更多潜在的收入。

然而,互联网3D还处于一种很不成熟的状态,因为很难在典型的PC和浏览器上广泛使用这种复杂的技术。事实上,一般浏览器也无法承载复杂的3D内容,更无法提供高帧率或全屏的图形效果。并且,在实时的合作程序和其他应用程序中包含3D让本来已经很繁琐的开发过程会变得更加复杂。

尽管如此,现在是有一些组织在为网络3D技术而努力工作的。他们尝试将浏览器转为一种更为强大的计算平台,以在该平台上获得如PC上一样的体验,例如3D内容的展示。这些工作将会为网络衍生出更多的应用程序,包括产品建模,展示和配置;3D在线会议和工人协作;对于手术或机械过程的模拟;虚拟旅游;增强现实等等。

不管怎样,在互联网3D技术变得可依赖和成为主流之前,仍然有重重的困难需要克服。

3D on the web 网络上的3D

早期的网络是没有图形界面的,直到NCSA(美国国家超计算应用程序中心)在1993年发布了Mosaic,这是首个可以同时展示图片和文字的浏览器。

当前在互联网上,已经有一些为3D服务的技术在使用,他们基本使用同样的方式工作,但是使用不同的文件格式。

VRML和X3D
网络3D开始于1994年,在这一年,VRML组织发布了虚拟现实标记语言(Virtual Reality Markup Language)。然而,VRML从未流行过,因为它限制开发者只可以写3D相关的内容。为了创建完整的引人注目的应用程序,开发者必须能够同时开发3D,2D,视频和音频。在处理器和软件能够支持图形之前,VRML表现还是不错的,因为它能支持图形。但是VRML太慢,并且没有能力渲染复杂高仿真的模型和场景。

在1997年,Web3D联盟推出了X3D,它是一种基于XML的文件格式,同时也是VRML的扩展,以用来表现3D图形。X3D同样也没有流行过。游戏和3D开发人员广泛忽视了X3D,X3D只被极少数的商业工具所支持。

其他方法
3D工业论坛于2003年推出的Universal 3D技术,是一种压缩的3D图形文件格式。然而,它的推崇者也只是推动Universal 3D使其成为了一种主要使用在制造业或建筑业相关应用程序的文件格式。

开源的网络3D标记语言(3DMLW,3D Markup Language for Web)是一种基于XML的文件格式,它用于创建网络上的3D和2D内容。3DMLW由3D Technologies R&D于2009年推出,它可以通过插件工作在大多数流行的浏览器中。

Technical Developments 技术开发

今天的硬件能力能够比过去更好的处理3D。更快的CPU,更快的图形处理器和显卡,以及四处可见的3D图形加速器,这些都为网络3D的出现提供了可能。

JavaScript和HTML 5.0
开发者使用JavaScript语言开发各种网络应用程序。浏览器的 JavaScript引擎性能的提升,使得网络3D成为可能。比如说,IE9中的JavaScript引擎将可以使用宿主机器的图形处理器来快速的处理图形相关的任务。同样的,Mozilla也增强了其Firefox浏览器的JavaScript引擎,他们使用了一种追踪( tracing )技术,该技术通过优化代码的执行方式来提升性能。

JavaScript的访问HTML 5.0的能力可以让开发者更加方便的将视频,音频,3D和2D内容无缝合并到应用程序中。HTML5.0中的画布(canvas)元素同样也会促成互联网3D。该元素使得浏览器可以通过它们的JavaScript引擎,本能(无需插件技术)且动态的渲染位图图片,使得渲染3D变得更加容易。

WebGL
Mozilla 基金会是一个创建和支持开源应用程序的组织,Khronos是一个为并行计算,图形和动态媒体设计标准的联盟。它们俩正在开发WebGL。该技术可以在不需要插件的情况下为网络带来硬件加速的3D图形效果。任何支持Khronos的OpenGL或OpenGL ES规范的浏览器都可以运行WebGL。

跨语言跨平台的OpenGL定义了一组API,以供开发出提供2D和3D图形效果的应用程序。而OpenGL ES(Embedded Systems)规范为从简单元素(或者成为图元,比如线或者多边形)绘制3D场景提供了编程工具。OpenGL ES可以工作在智能手机这样的小型设备上。然而,这些能力不能离开插件的支持。许多用户倾向于不使用插件,因为它们不易安装,且难于排除故障和管理。

WebGL使得浏览无需插件便可渲染3D内容。该技术提供可以让软件通过编程访问PC机3D渲染硬件的API,从而扩展了OpenGL。本质上,WebGL提供了JavaScript应用程序和OpenGL软件库之间的连接,而后者负责访问宿主系统的图形处理器。这可以充分利用硬件的能力来渲染3D内容。

Khronos已经建立了一个WebGL工作组,该工作组将在今年上半年发布 WebGL的第一个release版本。但是程序人员已经开始把WebGL构建到Firefox的开发版和Webkit开源浏览器引擎中,该浏览器引擎被苹果的Safari和Google的Chrome浏览器所使用。

O3D
Google也是 WebGL工作组的成员,但同时Google也开发了一款基于浏览器的3D图形技术,O3D,如下图所示。

O3D Software Stack

图片来源:http://code.google.com/apis/o3d/docs/techoverview.html

O3D是一个基于IE,Firefox,Safari 和Chrome这些浏览器的插件。Google现在正在把该技术构建到Chrome中,并希望未来能够直接构建到其它的浏览器中。O3D可以在Windows,Mac,Linux上运行,它是一套开源的JavaScript API,用于开发互动的3D图形应用程序,比如游戏,广告,或者虚拟产品展示,都运行在一个浏览器里。该API为基于JavaScript的程序提供了接口,使得JavaScript应用程序可以与包含在O3D插件中的O3D核心软件进行通信,从而直接利用计算机的图形硬件。

Google 发言人说O3D是一个保留模式(retained-mode)的技术,因为它只设置场景一次,然后每帧只绘制场景改变的部分。与WebGL这样的立即模式(immediate-mode)技术不同,O3D不会每次都重新绘制整个场景。这提供了更好的性能,但却弱化了开发者的控制能力。

Adobe Flash
Adobe正在将更强的3D能力加入到它所属的Flash浏览器插件中。Adobe是在2008年Flash Player 10的发行版中推出了3D能力。该技术通过加入新的类和方法,从而包含了对于3D效果的支持,尤其可以通过Flash的 ActionScript编程语言在三维空间中设置一个物体的位置。通过这种方法,即便是没有丰富3D经验的开发者也可以通过在2D中设计物体来制作3D内容,并能通过新加入的类和方法修改它们。Flash Player 10.0,现在是beta版,将会为智能手机和其他移动设备带来3D效果。

Standing in the Way 在路上

在3D Web真正成熟之前,它还需要克服重重的障碍。

比如说,插件,在某些情况下,时常会导致浏览器崩溃或者其他的问题。让浏览器能够天生就有渲染3D的能力,并且克服当前3D技术不能和所有的浏览器、操作系统和应用程序兼容的问题,这些都是很大的挑战。另外,缺乏标准化也是一个问题。如果没有标准化,网络将会出现各种不同的互不兼容的格式和技术,这使得开发者为了在不同的浏览器上运行需要创建很多版本的程序。同时,开发网络上的3D内容需要很长的开发时间,并且很少的开发者对该方法很熟悉。

对于上网本和智能手机使用的迅猛增长,这些具有较慢的处理器,意味着更多的人在使用无法运行3D内容的设备。技术硬件能力和网络带宽已经大幅度的提升了,但它们仍然不能满足高度复杂的3D模型的需求。并且网络3D技术的推崇者们并没有为普通用户设计在线3D技术,这是在犯和VRML一样的错误。

Conclusion 结论

WebGL是一个非常有趣的网络3D开发技术,因为它无需插件。一旦WebGL推出,我们将在网络上看到3D内容的迅速增多。然而,3D在10年内是很难成功的,直到迅猛增长的流行上网本和智能手机拥有足够强大的处理器能力来播放数据密集的内容。不过总有一天,3D将在网络上做到像现在视频所做到的一样,网络3D的时代终会到来。

Posted in: 3D / Tagged: 3D, web, 浏览器, 网络

LinkedIn

Milan Petrovic

Categories

  • In My Life (25)
    • A Day in the Life (8)
    • English Learning (2)
    • Learn a Word (7)
    • Something In The Way (8)
  • Music Heaven (8)
    • Guitar (1)
    • In Concert (1)
    • Lyrics (3)
  • OK Computer (54)
    • 3D (3)
    • C++ (10)
    • Computer Graphics (15)
    • Game Programming (23)
    • iOS (6)
    • Linux (1)
    • Lua (9)
    • My Projects (3)
    • Some Experiences (9)
    • Talking in Code (2)
    • Unity (2)
  • Quotations (2)
  • Uncategorized (1)
  • Visca Barça (24)
    • FCB BJ (5)

Recent Posts

  • [译]优化你的手机游戏(没有延迟的,才是健康的)- 一篇给游戏美术设计师读的文章
  • 新浪微博API for MOAI
  • 稍后继续
  • Unity Developer ++
  • Another Thread @ Moai Forum
  • 1st Day of Golden Week
  • 为SyntaxHighlighter添加新语言
  • 基于Lua的State Pattern
  • Class Diagram of Pacman
  • 基于Moai的Pacman

Recent Comments

  • 约修亚_RK on 为SyntaxHighlighter添加新语言
  • 爱装的小男孩 on 小心DLL链接静态库时的内存错误
  • happyfire on Game Loop的几种实现方式
  • William on 新浪微博API for MOAI
  • Benny Chen on 新浪微博API for MOAI
  • your man on 新浪微博API for MOAI
  • 你家男人 on 稍后继续
  • 逍遥 on 关于对std::vector的遍历
  • papa on Unity Developer ++
  • T客网 ︱ Techpot » Blog Archive » iOS开发与OpenGL ES相关问题整理(1) on iOS开发与OpenGL ES相关问题整理(1)

Tags

2d 3D 3dsmax 3ds max air Apply architecture Asia tour barca Beijing bilbao binary search blocked bob boost bruce springsteen C++ capo CGContextDrawImage Champions League Change DLL DX10 eval exporter flash framework frustum culling game game engine iniesta ios linux lua Moai opengles pacman plug-in plugin 北京 导出插件 崩溃 巴萨 游戏引擎 踢球
© Copyright 2026 - A Game Developer
Infinity Theme by DesignCoral / WordPress