Bubble引擎重构计划

我们目前的场景类Scene中不仅包含对场景节点的管理,还包含对场景中节点的绘制操作,也就是说当我们调用Scene::Update方法时:

scene->Update(time);

场景首先会遍历场景中的所有节点,更新场景中节点的位置信息,然后会找到场景中所有需要绘制的对象并执行渲染操作,伪代码如下:

void Scene::Update(float dt) {
    UpdateTransform(dt);
    RenderAll(dt);
}

void Scene::RenderAll(float dt) {
    PreRender(dt);
    vector<ModelPtr> models = GetModels();
    for (int i = 0; i < models.size(); i++) {
        ModelPtr model = models.at(i);
        MeshPtr mesh = model->GetMesh();
        VertexBufferPtr vertex_buffer = mesh->GetVertexBuffer();
        IndexBufferPtr index_buffer = mesh->GetIndexBuffer();
        MaterialPtr material->model->GetMaterial();
        // Render model
        // ......
    }
    PostRender(dt);
}

然而事实上,渲染作为渲染引擎中一个非常复杂的操作,将来由很大的变动空间。将管理场景和渲染场景这两项任务都写在一个类Scene类中,不符合单一职责原则。场景管理,包括节点位置信息以及相关状态的管理和更新和场景渲染是两个相对独立的功能。场景管理相对易于实现,功能也比较固定,场景渲染往往需要用到很多图形学技术,随着时间的推移,技术的进步,必然要不断的更新渲染模块。而当每次更新渲染模块式都需要修改并重新编译场景管理模块,无形中增加了维护和重构的困难。因此这里我们决定将场景管理和场景渲染模块解耦。这里简单介绍一下重构计划。

Component类表示节点的数据和行为。其中Model组件仅仅只是一个渲染数据的集合,只负责管理网格,材质等信息,不负责绘制,即移除Model::Render()方法,将渲染相关代码移动到Renderer中,让Renderer负责一切和渲染有关的操作,Component只负责维护数据。

Node类基本不变,Node::Update()只负责更新节点的位置信息等状态,不负责调用渲染函数。

Scene只负责场景管理,不负责场景渲染,Scene只是先场景的逻辑功能,渲染功能全部由Renderer实现。

新建Graphics类,将当前Renderer类的功能全部移动到Graphics中,Graphics类负责封装底层的图形API。Renderer类使用Graphics,负责实现场景的渲染逻辑。

Renderer类的实现参考Urho3d引擎的方法,在这里我们让Renderer包含一组Viewport,每个Viewport包含一个Scene对象,一个Camera对象,表示要绘制的场景和观察场景的摄像机,以及常见的(x, y, w, h)属性,用来表示窗口中的绘制区域。每次迭代将调用一次Renderer::Render()方法,该方法遍历所有的Viewport,读取Viewport中的Scene,Camera,查找Scene中的所有可渲染对象和灯光,并依次执行绘制。

这是就是本次重构计划。本次重构计划至少一周内完成。

时间: 2024-11-05 07:40:47

Bubble引擎重构计划的相关文章

从案例深入了解如何重构代码-重构计划

项目名称A,某公司重点项目,已经正式上线运行几年了,公司业务遍布全球,很多国家都有办事处或研发部门,也就需要使用该系统.并且随着公司的不断发展,业务流程也在不断地完善和变化. 技术上,项目是CS架构的,支持在线和离线两种操作方式,对于在线方式,数据访问是直连服务器上的Oracle数据库,离线的数据访问是连接本地的Access数据库;对于本地数据库,系统提供WebService来实现本地数据的同步. 目前项目代码的规模已经达到100多万行,负责项目开发和维护是由同一个团对来承担,其中的开发和设计人

DRDS分布式SQL引擎—执行计划介绍

摘要: 本文着重介绍 DRDS 执行计划中各个操作符的含义,以便用户通过查询计划了解 SQL 执行流程,从而有针对性的调优 SQL. DRDS分布式SQL引擎 - 执行计划介绍 前言 数据库系统中,执行计划是对 SQL 如何执行的形式化表示,往往由若干关系操作符构成,用户可以通过对应的 EXPLAIN 命令查看,并通过执行计划大致了解 SQL 的执行过程和执行方式,如全表扫描还是索引扫描,归并连接还是哈希连接等.执行计划可以为用户进行 SQL 调优提供重要依据. DRDS 执行计划 与多数数据库

微风IM重构计划

微风IM是从项目中提取出来的IM模块,带有原项目的诸多额外信息,不方便大家的理解和学习,计划对微风IM进行重构. 重构将基于networkcomms v3 c#通信框架. 重构源码将对已经在networkcomms.cn中文站获取到networkcomms v3源码的朋友开发. 新的版本号定为 微风IM 5.0 www.networkcomms.cn编辑

NodeJS服务端重构计划

不知不觉做node开发已经半年时间了,这期间写尝试着去解决了一些问题,实现了一下想法,也遇到过一些坑.是时候来梳理一下代码,规划一下接下来的工作. 现阶段我们的node服务器端代码结构是这样的: 乍一看好像没有什么问题,其实这其中充斥着一些重复代码,以及一些没有测试的模块,代码组织也不够合理.这些问题都是需要处理的. 先来说说几个常用的术语 router 路由模块负责请求的分发,把请求转给具体的controller.controller是每个请求进来之后处理的逻辑,而route则定义了请求应该进

Bubble更新

本次Bubble引擎的重要更新: 项目重构,创建独立的渲染系统Renderer处理渲染逻辑,Renderer与Graphics交互,Graphics是底层图形API的封装 完善材质系统,区分材质参数和自动参数,自动参数为引擎内置,无需用户指定,引擎自动为其传递参数 完善场景树,完善树节点的插入,删除操作 实现天空盒功能 渲染效果图: 图中分别用不同的方法渲染人头,其中最右边直接使用纹理,其余使用各种材质,依次为:塑料,铜,铬,金. 背景使用了天空盒技术. 天空盒添加方法如下: SkyboxPtr

架构之重构的12条军规

原文地址:http://m.yuedu.163.com/reader/news/content.do?source_uuid=6a06e2c0-5865-4658-b609-c92ed95fadbd_1&content_uuid=4a0b1390a22e439ab8c28d5ddff14a87_1&isappinstalled=1&from=timeline 5月11日 00:00    来源:InfoQ中文站 [注]架构之重构的12条军规(上)发布以后,一些读者着急要下篇,所以在

大话重构连载首页

<大话重构>这本书是我写的第一本书,从今天起我将通过连载的形式逐渐跟大家分享. 这本书让你: 告别游击队转变为正规军. 远离劣质代码走向精妙设计 真正明确专业级的软件开发是如何的 真正明确重构是如何一步一步进行的 高效重构七步曲.面对实践不卡壳 让遗留系统维护不再是你的梦魇 读完这本书以后: 需求变更不再纠结.重构让你润物细无声地容纳它们 超越代码级的重构,从各个层面深度领略重构之美 自己主动化測试不再是梦想.重构让自己主动化測试走你 又一次审视熟悉而陌生的技术.将碎了一地的它们又一次铆合在一

TinyTemplate模板引擎火热出炉,正式开源了

涉水模板引擎领域,纯属不小心.在此对以下人员表示强烈感谢与致敬:@sub jetbrick作者@sept@webit webit作者@罗格林 rythm作者@闲.大赋 beetl作者以及许许多多虽然没有列出来,但是在我写tinytemplate时帮助过我的人. 序言 本来是没有自己写一个模板引擎的计划的,因为按我的理解,一直认为这种“语言”级的引擎,难度是非常大的.总感觉自己的水平不够,因此不敢有这个念头.直到大量使用Velocty的时候,碰到velocty诸多不尽如人意的地方,但是又无能为力,

Unity 5引擎公布:提供完整功能且不收分成

[狗刨学习网专稿,转载请注明出处] 狗刨学习网报道/Unity今天推出了Unity 5引擎发布计划,同时宣布将会调整该引擎的业务模式.和此前的产品一样,Unity 5同样会推出个人免费版,以及一个月费75美元的专业版和1500美元的永久版授权. 最大的不同似乎是付费版本,在Unity 4引擎中,开发商们必须付费获得3D纹理支持或者优化的视觉效果,比如景深或者动态模糊.而在Unity 5引擎中,这些功能和编辑器都将向个人版和专业版用户推出.而且,专业版用户会获得更多的功能,比如来自Unity Cl