| 越 的个人资料三无之徒照片日志列表 | 帮助 |
|
三无之徒11月16日 重构 Dream Engine2 资源管理开发完 MMO Demo 之后,开始重构引擎了,首要解决的就是之前 Artists 对资源文件管理复杂的问题,而从这个问题,逐渐引伸出资源管理的问题,最后演变成为一个大规模的重构方案。 首先说明 DE2 之前的资源管理设计,在开发 DE2 初始时,并没有对资源管理进行详细的设计,所以 DE2 的资源管理基本上延用了 DE3D 的方式。具体分为以下几点: 1.资源文件结构。典型的资源有几种,比如纹理、几何数据、动画、材质、场景图节点等等,资源文件都是单独存储成文件的,这样的设计初衷是为了实现更大的灵活性,例如:不同的材质文件可以引用相同的纹理文件,不同的场景图节点描述文件可以引用相同的几何数据或者材质数据等等,但事实上在实际的游戏开发中并没有设想的那样美好,稍后将详细描述实际使用中存在的问题。 2.资源引用关系。资源和资源之间往往存在着引用关系,例如材质使用了一张纹理,场景图节点使用了一个几何数据或者是材质等,在 DE3D 中我们使用了最直观也是最容易想到的方式:资源文件中直接记录所引用资源的相对资源总目录的文件路径。 3.资源对象的管理,由每个资源管理器自己管理。资源对象的查找和生命周期管理也是由各自的资源管理器完成。资源对象是通过引用计数来控制生命周期的,当引用计数为零时,自动释放资源对象。每个资源对象在引用其他资源对象时是直接设置的,比如材质对象中包含了对纹理对象的引用,在材质中直接使用纹理对象指针。 4.异步资源加载,是通过多线程完成的。在多线程中实现资源从磁盘到 RAM,从 RAM 到 Build 资源对象的过程,当异步加载资源时指定资源创建的回调。引擎在资源加载和创建完成时进行回调。 以上基本上就是之前引擎资源管理的设计。那么,这样的设计都有哪些问题?为什么要重构?重构的方案是什么?下面一一叙述。 问题 1.资源文件数量过多。每个资源都是单独的资源文件,这种方式看似灵活,实则管理麻烦。在实际开发中,美术要面对多种类型的资源文件,纹理、几何数据、材质、动画、骨骼、场景图节点,在 DE2 中,资源类型又增加了,美术就更头大。举个例子来说,一个骨骼动画模型在 max 导出时要导出至少 5 个文件,一个骨骼动画节点描述,一个骨骼文件、一个蒙皮几何文件、一个蒙皮节点描述文件,和至少一个动画文件。在开发中需要将导出的这些资源导出到引擎指定的目录下,并且提交到服务器中,如果漏掉任意一个,都导致资源不能正常加载。当资源越来越多时,资源文件数量爆炸性增长,文件管理上的复杂性就可想而知了。这对比较感性的美术们来说,是很痛苦的事情。即使是程序员的我,在实际的使用过程中,也感觉到非常麻烦。另外,之前设计方案中的资源文件复用的灵活性,其实在开发中也体现不明显,比如为了实现纹理的复用性,美术需要将几张贴图合并为一张,但是有这几张贴图可能属于完全不同的关卡,甚至不可能同时出现在一个场景中,这样导致渲染物体的显存资源浪费,还有像复用几何文件这种情况几乎就没有发生过。其实资源的复用完全可以通过编辑器中对象级别的复用来实现,这样资源文件级别的复用在开发中显得微不足道,甚至有时因为考虑资源复用增加了美术的资源管理的复杂度。 2.记录引用资源路径的方式不灵活。这种直接记录资源路径的方式,导致资源文件路径发生改变时,引用这个资源的资源很难做出相应的调整,进而无法加载改变路径后的资源。尽管我们可以要求美术在一开始就设定好资源存储路径,但是依然不能防止这种情况的发生,而且有时侯处于项目管理的考虑,资源路径的改变是很有必要的。虽然我用了一些实现技巧,但还是没有彻底解决。 3.不能预读引用的资源信息。由于在资源文件的数据中记录了引用的资源文件路径,只能在解析资源数据过程中(或者称之为 Build 资源对象的过程中)才能知道引用的是哪个资源,这种方式,外部无法控制资源的加载顺序。此外,这种方式还造成了异步加载资源时,外部无法设置引用资源的加载方式的问题(相对于当前的加载线程是同步还是异步?)。 4.没有实现统一资源管理,缺少统一的资源对象信息描述。由于每种类型的资源由自己的管理器管理,导致资源不能用统一的方式访问和操作。 5.多线程异步加载的实现复杂。比如要求在异步读取资源时,必须指定回调函数,接口上过于严格,应用程序显示的知道了多线程资源加载的实现机制,没有做到屏蔽细节,而且回调还打乱了游戏的代码流程,需要游戏客户端单独处理回调后的流程,导致客户端实现复杂。还有些异步加载资源时的特殊情况没有处理,例如当异步读取某个资源时,主线程同步的需要这个资源对象等等。另外,由于在多线程中创建资源对象,导致资源的管理必须是线程安全,线程同步过多,降低了多线程并行的能力,这一点在 MMO 开发中表现的非常明显。 Dream Engine2 资源管理解决方案 根据上述讨论,制定出新的资源管理解决方案。 目标 1.降低资源文件管理复杂度,减少资源文件数量。 2.提供灵活的资源文件管理,当资源路径发生变化时,引擎能自动识别变化并作出相应的调整。 3.提供灵活的资源引用机制,快速获取引用资源的信息,以及资源被引用的信息。 4.实现统一的资源管理,统一资源信息描述。 5.降低多线程资源加载复杂性,提高多线程加载性能,降低线程同步次数,对游戏层屏蔽实现细节,实现灵活的加载机制。 实现 1.使用统一资源数据存储文件:资源包。资源包内部可以容纳任何资源数据,多个资源可存在于一个包内,在资源包头记录包内资源的信息,以及包内资源引用的资源信息。包内资源可继续分组,类似于文件系统机制,通过名字区分。例如包名是A,资源是 texture1,这个资源的完整名字就是 A.texture1,如果在 Group1 分组下,则为 A.Group1.texture1,如果Group1下还有分组,则以此类推,在引用资源时直接使用这个资源名。由于资源存在于包内,资源的生成只能在引擎编辑器中完成,资源的存储控制就完全交由引擎编辑器完成,这样当引用的资源存储位置发生变化时,实际上是名字发生了变化,可以通过引擎编辑器自动完成相应的改变,实现了当资源路径发生变化时能自动识别变化并作出相应的调整,无需人工干预的目的。由于在包头记录了包内资源的基本信息以及包内资源的引用资源的信息,这样只需要解析包头就可获取相关的资源信息,也实现了快速获取引用资源信息的目的,游戏逻辑可以预读资源包信息即可构建完整的资源信息。同时,资源包的设计实现了降低资源文件管理的复杂度和减少文件数量的目的。 2.资源数据库。引擎中实现资源数据库机制。通过分析发现,资源和资源之间往往存在着引用关系,这种关系实际上是构成了 DAG(有向非循环图)这样的数据结构,每个资源节点都可以引用多个资源,同时又会被多个资源引用,但不会形成循环引用关系,所以我在引擎中实现了这样的资源数据结构,我称之为 Resource Info DAG,图中每个节点并不是资源对象,而是资源描述,因为资源可能随时被使用,资源描述可以一直存在于整个游戏过程中而不必被删除(当然想删也可以,只是需要这个资源时还要重新读一次资源包头)。资源信息是轻量的数据,只是记录了资源的类型、名字(我们实现了名字系统,一个整形即可代表一个完整的名字)、资源大小、在资源包中的数据偏移(用于资源加载)、所在的资源包、所引用的资源名字列表以及真正的资源对象指针。同时,为了快速索引到需要的资源,只有这样一个 DAG 是不够的,还需要一个名字和资源信息的映射列表,这样,Resource Info DAG 和资源映射表,就形成了引擎中的资源数据库。资源信息的出现实现了统一资源信息描述的目的,而且为实现统一资源管理铺平了道路。 3.改进资源的异步加载框架。异步资源加载可以是单线程也可以是多线程,无论在哪个线程,流程应该是一致的。在引擎中存在一个资源预读列表,以及资源预读管理器,当预读一个资源时,通过资源数据库可以立即知道资源是否存在,如果不存在则先加载其引用的资源(在资源信息中已经记录)。预读可以是阻塞的,也可以使分时间片的方式,具体的方式允许外部在预读资源时设置。时间片方式目前只是实现到资源的粒度,如果一个资源超过了读取限制的时间,则继续读直到完成为止,如果没有超过则预估下一个预读的资源时间,如果够则读,不够则进入到下一帧。游戏层可以自己设定预读资源,真正需要资源时直接通过资源数据库获取,而且往往此时资源已经被创建好,如果没有,则同步创建。应用层也可以预读一些基础资源,比如玩家相关的模型、动画等等,和逻辑数据相关的最好能预读,无关的即使需要时再读都可以,而且是完全异步,比如纹理、声音等。这样的改进带来的好处就是游戏层不需要关心资源加载的实现细节,甚至不需要向引擎提供回调(需要时也可以设置回调),需要资源时直接通过资源数据库接口获取,简化程序的复杂性。而且游戏层可以根据自己的需要预读资源,资源的调度上也很灵活。 资源的多线程加载只是完成从磁盘到内存的过程,并不包含资源对象的创建过程,引擎规定所有资源对象的创建都是在主线程中完成的,不允许在其他线程创建资源对象,这样就完全消除了资源创建中线程同步的问题。实际上我们知道,最耗费时间的往往是磁盘 IO 读取操作,而资源数据一旦进入到内存,资源的解析和构建过程是很快的,即使放在逻辑线程中同步创建资源对象,开销也不大。而且在渲染线程独立的情况下,逻辑线程的负担就更少了,同步创建游戏对象已经不是主要的性能瓶颈。多线程只是 IO 读取的话,实现上就简单了许多,首先就不需要考虑资源对象管理上的线程同步问题,其次可以利用引擎已有的基于 Ring Buffer 生产者/消费者线程机制实现一个完全无锁的多线程 IO 读取框架。不过有种情况还是要特殊处理:当多线程 IO 读取某个资源数据时,主线程同步的需要创建这个资源对象,这种情况下需要同步IO读取。但实际上这种情况属于低概率事件,即使偶尔发生用户也能接受。 10月7日 Dream Engine 2 开发近况这是参加 CGDC 之后写的,断断续续写了几个月,是我历史上跨时最长的日志了,最近很忙,十一长假才得空闲放上来,希望以后不要这样了。这段时间我们公司遇到了前所未有的困难,希望曾经在这里工作过的人和了解我们公司内部情况的人嘴下留情了,无论怎样,绩思思对待游戏、对待研发的态度是认真的,对待技术的态度是极其负责的,在此谢过。
1. 又是 3 个多月没有更新了,这段时间发生了许多事情,但DE2的开发依然有条不紊的进行着,其中渲染系统支持了 Lighting Pre-Pass(也称 Deferred Lighting),这是 《ShaderX7》中提出的渲染技术。其主要思想从 Deferred Shading (DS)演化而来,但同时改善了 DS存在的问题。为了更好的说明LPP,首先要了解 DS,简单来说 DS 是一种光照的后期计算,在每帧开始时先生成光照所需要的几何体的数据缓冲--屏幕空间区域的大小--我们称之为 Geometry-Buffer,也就是通常所说的 G-Buffer,接下来计算光照时,在 PS 阶段通过纹理采样的方式采样之前生成的 G-Buffer,用这个数据和光源参数计算每个屏幕象素的光照值,由于被光照的物体的光照数据已经生成在 G-Buffer 中,所以不需要重复绘制物体,只需将光源作为模型(点光源、聚光灯等)或者屏幕大小的四边形(方向光、天光等)绘制即可,在多光源的情况下,整个光照过程只渲染一次物体,极大的减少了绘制上的重复。由于G-Buffer 的数据比较多,例如 Diffuse、Emissive、Specular、Sp Power、Normal、Depth 等,需要多张RT来保存,这就意味着需要占用很多的显存来保存这些数据,即使通过一些合并数据的压缩技巧,对显存的占用量还是不小。为了解决这个问题,《Shader X》系列的编写者 Wolfgang Engel 提出了Light Pre-Pass Renderer技术,实际上就是 Pre-Pass Lighting,主要的思想是:在G-Buffer的生成阶段,只输出光照计算的必要参数,比如 Sp Power、Normal、Depth等,在光照阶段通过前一步生成的 G-Buffer和光源参数生成屏幕空间Lighting RT,最后再绘制一遍物体,在绘制物体时获取物体表面的材质的 Diffuse、Emissive、Specular Color,以及前一步生成的Lighting RT,计算最终的颜色。由于在 G-Buffer 阶段会生成 Depth Buffer,所以在渲染物体时可以利用图形硬件的 Early-z Culling 机制剔除大量的无效像素,提高一定的PS阶段的性能。相对于 DS,这个方案的优点是减少了显存的占用,缺点是多渲染一遍物体。在传统的 FS 和 DS 之间,这是个比较折中的方案。Crytek 在 CryEngine3中加入了这个技术 (presentation),用于在 Xbox360 这样显存资源比较稀缺的平台上实现多动态光照的效果。PS3 平台上的《抵抗2》是首款使用该技术的次世代游戏,这是它的技术文档Insomniac Prelighting - Game Developers Conference 2009。在实现的过程中有几个细节需要注意:
4月16日 Dream Engine 2 的一些事(二)最近在忙着优化游戏,除了用到的第一代引擎本身的优化外,美术也在资源制作上开始优化,减面、合并材质、模型、减关键帧、合理使用粒子模块...这些规则即使在我看来也不容易把握好,可苦了这些很感性的美术了。同时策划也尽可能做些优化工作,比如增加场景布局结构的合理性等,游戏客户端和服务器端也在优化,总之全民皆兵。可以预见到今后 CL 游戏场景将会更复杂,所以我也在积极推进美术工具的使用,以提高他们的生产效率,比如 Light Map Editor,CL 是基于静态光照来表现游戏场景的,之前都是美术在 3dsMax 中手工去调节整个场景的顶点色,费时费力,上周美术试用引擎提供的 LME 之后,提出一些反馈意见,我们也在改进之中。
说到静态光照,不得不说 DE2 的光照方案,在开始阶段我并没有确定开发 DE2 的静态光照技术,直到上个月的 GDC09,我了解到,UE3 这次的改进主要在静态光照系统:增加了称之为 LightMass 的系统,可以实现静态的全局光照,这样可以节省大量设置场景灯光的时间,使用这套系统可以可以告别以往一个 Level 要上百个光源的历史了。CryTeck 也推出了 CE3,实际上是 CE2 的低配置版,但游戏开发本身的功能也增强了。无论怎样,从这两款引擎的变化来说,引擎开发商们更务实了,渲染技术的发展也不像以前那样激进了,甚至还有些倒退,也许是考虑到金融危机的影响,PC的硬件发展将会放缓,从这方面来说是也许个正确的选择。根据这些信息,DE2 的静态光照系统也基本定型了:支持全局和局部静态光照,支持 Normaled LightMap 和普通的 Light Map,支持 Vertex LightMap 和 Texture LightMap。实际上 DE3D 早已经实现了局部静态光照,流程也已经完善,所以在此基础上开发 DE2 的静态光照系统是相对容易的。首先我实现的是 Normaled Light map,在翻阅了 HL2 渲染技术文档之后动手试了一下,基本都实现了,值得注意的是 bump basis 是在 tangant space 定义的,生成 lightmap 时要在 tangant space 生成光照信息,另外还要注意和引擎定义坐标系、Matrix 的行列优先级、旋转手相性要一致。Diffuse 光照好了,接下来是 Specular,HL2 中的静态 Specular 是通过 Envorment Map 来实现的,这种方法比较麻烦,而且需要预生成额外的纹理,我仔细研究了一下 UE3 的静态 Specular 的方式,通过简单的 Normal 和 bump basis 的 Dot 计算出 Specular 的系数,即可得到效果不错的静态 Specular,其实本质上也不算是静态,因为计算是实时的。接下来是全局光照,我希望用 Radiosity 来实现,参考了一篇 GPU 实现 Radiosity 静态光照的文章,完成了基本框架,已经交给同事去细化。
最近 Aion 挺火,我玩了一下,对其中可以生成 Alpha 物体的静态阴影很感兴趣,遂想如何实现,首先想到用 GPU 生成 LightMap 阴影,因为可以通过 texkill(clip) 过滤掉指定 alpha 值的像素。也曾想过用现在的 CPU 方式,但问题是第一是借用物理引擎的射线检测实现的阴影,当场景复杂光源较多时生成时间很长,第二就是很难生成 Alpha 物体的阴影(比如树叶),即使做到,实现上比较复杂,而且不灵活(比如无法获取美术在 Material Editor 中设定的自定义 Alpha Ref Value)。前段时间在 MSN 上和一位朋友 http://ixnehc.spaces.live.com/ 聊起这个话题,他与我分享了他的实现方案,给我很大启发:这是一种类似于 Deferred Shader 的方式,将需要光照计算的 LightMap Sampler 记录在浮点纹理上,通过 DS 方式计算光照,得到最后的 LightMap 数据,Shaow 采用和 Shadow Map 类似的方式生成,但存在精度问题,但仔细想会发现,对于方向光源,可以采用类似于分段 ShadowMap 的方式提高精度,对于点光源或者聚光灯,一般范围不会非常大,在大多数情况下也能满足要求。周一和同事们讨论了这个技术方案,认为可行,并制定了详细的技术实现细节,目前正在开发中。这样 DE2 将实现以 GPU 为主导、CPU 辅助的静态光照生成技术,将进一步提高静态光照的生成效率。另外,我们还讨论了 UE3 LightMass 系统的一些静态光照的技术细节,例如 Emmisive Lighting 等,这些也将在 DE2 中实现。
资源管理,整个三月份主要是在做这部分功能,由于之前的设计方案考虑到资源查找的优化,引入了资源ID 的概念,但这个优化增加许多复杂性,从结构到实现,从底层到高层,同时还牵扯出多人编辑资源的 ID 同步问题,以及 AutoPatch 时的 ID 同步问题,为了解决这些问题,我们还需要开发辅助的模块和工具来完成整个功能,甚至差点搞出个 C/S 结构的分布式编辑器模式。但即使这样,我们还是把整体设计方案确定了下来,包括所有的技术细节。某天晚上加班,引擎的同事问我:我们的资源管理是不是太复杂了?这让我陷入了沉思:我的初衷是什么?为什么现在会这样复杂?这样带来的性能提升和开发复杂度以及后期维护的成本是否平衡?经过一个周末的思考之后,痛定思痛,我决定去掉这个包袱,虽然性能没有提升,但是系统变得简单明了(Kiss 原则 )。周一我和同事们又仔细分析,最后决定丢弃之前的设计,轻装上阵。只是没想到这个决定得到了大家的一致认可,不约而同的都松了一口气。
逻辑编辑器,前几天我们讨论 DE2 的对象管理,讨论到最后就讨论到逻辑编辑器上来,由于之前对于网游逻辑的 Deploy 的问题一直悬而未决,使得我一直都在怀疑 Logic Editor 的实用性,因为这将改变既有的游戏开发模式,这种改变需要一段时间来适应。会议开完我的思绪仍然停不下来,抓住公司的 Server Engine 的主程序继续讨论,从开发模式的改变到实现的技术细节,我们讨论的比较深入,甚至可以肯定第一个用这种方式开发的游戏一定比传统的方式要慢,但从长远来看,是改进了游戏开发模式,提高生产率。所以,基本上确定了技术方案以及新的游戏逻辑开发模式,尽管还是有几个不确定因素。
上周把 DE2 的开发计划提交给了 CEO,这是一个粗略的计划,除了 DE2 的开发,还包含对 DE3D 的维护以及 Support 游戏项目的工作。DE2 的开发是我主动提出来的,作为公司的 CTO,我始终认为技术是游戏研发公司的核心竞争力,没有这个基础,在开发上很难走的更远。网游也在不断发展,玩家的需求会越来越多,游戏的功能也越复杂,对技术的要求也越高,虽然一款游戏的成功是多方面决定的,但是至少在技术层面,如果可以做好足够的基础保证,甚至走在业界的前端,将是保证公司持续竞争力的重要因素。
虽然,这条路难走,障碍很多,但我依然会继续前行。 2月24日 Dream Engine 2 的一些事(一)从今年初 DE2 开始开发到现在已二月有余,进度还算顺利,这次除了次世代的 3D 引擎之外,我们还开始了对象引擎和逻辑引擎的开发,同时对引擎的资源管理的设计也做了进一步的改进。实际上所谓的对象引擎就是基于 RTTI 的可扩展的对象系统,游戏可以根据引擎的 RTTI 规则来扩展自己的逻辑对象,无需重新编译引擎即可在引擎编辑器和游戏中使用游戏对象,同时这套机制也作为引擎核心对象的管理和反射机制。逻辑引擎实际上是一个可扩展的游戏逻辑框架结构,它基于对象引擎,在其内部存在一个逻辑驱动核心,这个核心主要的工作就是不停的更新当前的逻辑序列--更新每个逻辑序列的状态,每个逻辑序列由一系列的逻辑片段构成,逻辑片断通过某种机制关联在一起,形成完整的游戏逻辑流程,在每个逻辑片段内部都可以实现特定的逻辑,通过结合对象引擎的 RTTI 机制可以对游戏对象进行控制,这样就可以实现大部分的游戏对象间的交互。与此同时,通过提供可视化的逻辑编辑工具代替传统的手工编写游戏脚本逻辑,可以提高游戏开发效率,缩短迭代周期。实际上这种机制并不是什么革命性的技术,从本质上来说和传统的 脚本 + CPP = 游戏逻辑 的方式没有什么区别,只不过是提供了一个可扩展的框架结构,将所有用 DE2 开发的游戏的逻辑纳入其中来驱动。但是,目前还有些问题没有完全解决,比如:对于 Online Game 的 Server 和 Client 逻辑如何编辑和部署? 众所周知,网络游戏的逻辑分散在 S/C 两端,而且还不可避免的存在时序和验证问题,如果是单机游戏这种方式可以工作得很好,但是网络游戏的情况就比较复杂。而且这里还有两个细节的问题,一个是策划如何通过逻辑编辑器决定哪部分逻辑是运行在客户端,哪部分逻辑是服务器端?第二就是性能问题,RTTI 也好,逻辑引擎也好,天下没有免费的午餐,要做到可扩展,就要付出性能的代价,高度的抽象和游戏对象的运行时动态查找以及编辑势必带来性能开销,所以,在性能和扩展性上找到平衡点也是摆在我面前的一个难题。 3D引擎方面,DE2 重新设计的渲染架构在开发的过程中感觉到比 DE1 要好许多,因为它完全不需要关心渲染核心以外的数据结构,同时 SG 也实现了在只知道很少量的渲染信息的情i况下向渲染核心发送渲染请求的功能,这样 SG 和 Render Pipeline 就被隔离开来,实际上在系统中存在一个中间层,我们称之为 Render Primitive Manager, 它负责在 SG 和 Render Pipeline 之间沟通,也就是说这个 manager 同时知道两者,但它不需要太多细节就可完成渲染数据的构建工作。为了更好的适应今后的多核心平台,多线程渲染架构也是我一开始就考虑的功能。由于在开发之前做了充足的准备,以及在去年实现的多线程资源管理的基础之上,再加上新的 Render Pipeline 和 SG 的完全分离,我大概用了 2 天左右的时间就完成了开发及测试工作。为了做到和逻辑线程完全并行,渲染线程完全是 lock-free 模式,对渲染线程数据结构的操作完全是异步方式,同时提供方便的回调机制满足特定的渲染以及渲染结果查询需求。 材质系统是变化最大的系统之一,第一代引擎的材质系统完全被废弃,为了更好的扩展性,我们重新设计了 Shader 系统,这样做的前提是整个引擎的着色机制完全基于可编程管线,只保留 D3D 10 还保留的固定管线设置,在固定管线的数据结构实现上参考了 D3D10 的架构,这样将来在迁移到 D3D10 或者后续版本会更加容易。同时我们还设计了一套 Shader 编译机制,实现了在不同着色环境下的动态 Shader 生成,而且做到了和顶点生成结构无关,在这方面我们参考了 UE3 的材质系统和材质模板。目前已经开发完成了可视化的材质编辑器,基本上做到了 UE3 能实现的材质效果我们都可以实现。 12月31日 我的2008“从今天的结果来看,引擎的材质系统和核心渲染流程的调整比我们预想的要快。” “嗯,因为我们经过了详细的设计和思考,想的比较全面,所以实现起来也就比较快” “对,其实二年多的引擎开发过程也积累了很多经验教训,为这次第二代引擎的开发打下基础,虽然之前走了不少弯路,但也并不白做。” 以上是我和引擎开发组的同事在2008年12月31日晚上10点钟的对话,今天我们加班,明后天还要加班,加班的目的是尽快完成Dream Engine 2的材质系统和渲染核心,为全面开展第二代引擎的开发铺平道路。正是公司的新的游戏项目促进了第二代引擎的开发,次世代游戏的标准对引擎提出了更高的要求,由于第一代引擎兼容固定管线和低配置硬件,如果继续在其上开发次世代引擎,结构上会变得很复杂,实现上也很复杂,实际上从十月份开始的次世代渲染技术的尝试过程中已经显现出这一点,同时实现针对更高硬件平台特性的功能,比如新的图形硬件架构、多核架构等,原有的引擎更加难以适应。其实在几个月前我就已经有开发下一代引擎的想法,只是没有想到会这样快。实际上Dream Engine 2将是一款游戏引擎,图形引擎只是其中一部分,它将包含网络、物理、脚本等网络游戏开发相关的内容,它还会集成更多的可视化编辑工具,为游戏开发提供便利,成为次世代网络游戏的集成开发环境。程序同事们对开发次世代引擎是热情高涨,美术和策划同事们也希望能使用更强大的引擎编辑器来制作游戏,公司希望能制作出顶级的游戏,我也希望再一次挑战自己的极限,这些是我们的希望和期盼,是2009年的最重要的工作之一,这次的开发时间会很长,还有许多的技术需要研究和探索,我非常荣幸能有机会开发这样一款引擎,我相信我们能再一次超越自己,走向更加精彩的2009年! |
|||
|
|