大家好,现在开始本系列的第三部分,按照以下几个步骤来搭建引擎雏形:
1、分析引擎的需求
2、实现最小的3D程序
3、从中提炼引擎原型
4、一步一步地对引擎进行改进,使其具备良好的架构
5、实现与架构相关的功能,如“多线程渲染”、“延迟渲染”等功能

本文进行第一步,分析引擎的需求。

业务目标

1.手把手教读者如何从0开发3D引擎
2.学习函数式编程及其在3D领域的应用
3.学习3D编程中基础的功能实现,如纹理、光照、模型等
4.学习引擎的设计和架构,如Data Oriented、多线程等

本系列开发的引擎属于最简化的引擎,读者可以根据自己的需要在此基础上对引擎进行扩充,满足自己的应用场景。

范围

  • 简单渲染
    引擎只有最基础的光照和纹理功能。
  • 简单交互
    引擎只能通过“操作相机”来交互。
  • 适当的扩展
    引擎支持主要的扩展方式,如使用脚本组件来插入用户逻辑,实现动态场景。

Feature

  • 最小功能
  • 完全函数式的架构
  • 支持良好的扩展性
  • 优秀的性能

上下文

  • 开发者
    开发者是直接使用引擎来开发Web 3D应用的程序员。
  • 编辑器
    编辑器属于对引擎的二次开发。它对引擎进行封装,以“所见即所得”的方式向用户提供对Web 3D场景编辑的界面,从而使用户可以很方便地开发Web 3D应用。

功能性需求

  • GameObject和Component
    引擎是ECS架构,场景是由多个GameObject组成,而每个GameObject又由多个组件(Component)组成。
    其中,组件包括Transform、Geometry等。
  • 多线程渲染
    如果浏览器支持Shared ArrayBuffer和OffscreenCanvas,那么引擎可以打开多线程渲染,使用两个线程:主线程和渲染线程。
  • 前向渲染和延迟渲染
    引擎支持前向渲染和延迟渲染,用户可以选择其中一种进行渲染。
  • 光照
    引擎只支持方向光。
  • 纹理
    引擎只支持最基本的纹理。
  • Scene Graph
    引擎使用自定义的wdb格式保存场景数据,并支持它的导入和导出。
  • 相机
    引擎支持用相机与场景交互,包含几个子功能点:

    • 支持透视投影相机
    • 事件
      引擎绑定和封装了事件,统一了pc端和移动端的事件。
    • 支持相机控制,如漫游相机
  • 扩展
    引擎支持用扩展来实现自定义功能,包含几个子功能点:

    • 自定义渲染管道
    • 脚本组件
    • 自定义材质

非功能性需求

引擎对于“质量”要求高,因为它是需要长期开发和维护的项目,而且具有很高的技术复杂度。

开发期质量

  • 高可扩展性
    因为本系列开发的引擎属于通用引擎,需要支持各种应用场景,所以要求引擎便于扩展。
    本系列主要通过脚本组件等功能来支持扩展。
  • 高可维护性
    引擎需要长期维护,所以需要引擎代码健壮,易于维护。
    本系列主要通过契约检查、强类型语言Reason自带的编译检查、代码重构来确保可维护。
  • 低可测试性
    照理说,引擎需要很高的可测试性,这样在长期的开发中能显著降低错误率,提高效率。但是本系列为了节省篇幅,没有写自动化测试用例,而是通过“运行测试”来验证正确性。
    建议读者在实际开发中,保证较高的自动化测试覆盖率。

运行期质量

  • 高性能
    因为使用引擎渲染的3D应用,特别是3D游戏,至少需要每秒30帧才能流畅运行,所以引擎对于性能要求很高。
    本系列在搭建引擎雏形时,会进行多次性能测试,从而保证使用最佳性能的方案来构建引擎底层。

从0开发3D引擎(八):准备“搭建引擎雏形”的更多相关文章

  1. 从0开发3D引擎(三):搭建开发环境

    本系列使用Reason语言,因此需要搭建它的开发环境. 上一篇博文 从0开发3D引擎(二):准备预备知识 搭建开发环境 建议使用VSCode编辑器来开发Reason,因为它的插件支持得最好. 具体搭建 ...

  2. 从0开发3D引擎(四):搭建测试环境

    目录 上一篇博文 了解自动化测试 单元测试 集成测试 端对端测试 通过打印日志来调试 了解运行测试 断点调试 通过Spector.js测试WebGL 通过log调试Shader 移动端测试 了解性能测 ...

  3. 从0开发3D引擎(九):实现最小的3D程序-“绘制三角形”

    目录 上一篇博文 运行测试截图 需求分析 目标 特性 头脑风暴 确定需求 总体设计 具体实现 新建Engine3D项目 实现上下文 实现_init 实现"获得WebGL上下文" 实 ...

  4. 从0开发3D引擎(补充):介绍领域驱动设计

    我们使用领域驱动设计(英文缩写为DDD)的方法来设计引擎,在引擎开发的过程中,领域模型会不断地演化. 本文介绍本系列使用的领域驱动设计思想的相关概念和知识点,给出了相关的资料. 上一篇博文 从0开发3 ...

  5. 用函数式编程,从0开发3D引擎和编辑器(一)

    介绍 大家好,欢迎你踏上3D编程之旅- 本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程,探讨了在从0开始构建3D引擎和编辑器的过程中,每一个重要的功能点.设计方 ...

  6. 用函数式编程,从0开发3D引擎和编辑器(二):函数式编程准备

    大家好,本文介绍了本系列涉及到的函数式编程的主要知识点,为正式开发做好了准备. 函数式编程的优点 1.粒度小 相比面向对象编程以类为单位,函数式编程以函数为单位,粒度更小. 正所谓: 我只想要一个香蕉 ...

  7. 从0开发3D引擎(一):开篇

    介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.最小功能集合(MVP)" 的3D引擎. 本系列的素材来自我们的产品 ...

  8. 从0开发3D引擎(五):函数式编程及其在引擎中的应用

    目录 上一篇博文 函数式编程的优点与缺点 优点 缺点 为什么使用Reason语言 函数式编程学习资料 引擎中相关的函数式编程知识点 数据 不可变数据 可变数据 函数 纯函数 高阶函数 柯西化 参考资料 ...

  9. 从0开发3D引擎(七):学习Reason语言

    目录 上一篇博文 介绍Reason Reason的优势 如何学习Reason? 介绍Reason的部分知识点 大家好,本文介绍Reason语言以及学习Reason的方法. 上一篇博文 从0开发3D引擎 ...

随机推荐

  1. MFC 封装类为静态链接库

    mfc自带的基本控件都不怎么美观,所以一般开发者都会自定义类对控件进行重绘.手里也积累了不少控件的重绘,对对话框.静态文本.列表框等. 但是每次都要把这些类重新导入到新的工程里,比较麻烦,而且我也不想 ...

  2. 判断移动端还是PC端

    window.onload=function(){ var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUserAge ...

  3. codeforces 11D(状压dp)

    传送门:https://codeforces.com/problemset/problem/11/D 题意: 求n个点m条边的图里面环的个数 题解: 点的范围只有19,很容易想到是状压. dp[sta ...

  4. sybase的存储过程编写经验和方法

    1.如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨 ...

  5. Linux使用expect和rsync实现密码自动输入无人值守自动同步备份

    我们常用sudo,ssh.ftp命令操作服务器或者修改权限的时候都会要求输入password,但是shell脚本运行中该如何交互实现自动输入密码呢? 下面总结三种实现方法. 一.重定向:用重定向方法实 ...

  6. java的package和import机制

    在说package.import机制前我们先来了解下java的CLASSPATH. CLASSPATH顾名思义就是class的路径,当我们在系统中运行某个java程序时,它就会告诉系统在这些地方寻找这 ...

  7. 014 Ceph管理和自定义CRUSHMAP

    一.概念 1.1 Ceph集群写操作流程 client首先访问ceph monitor获取cluster map的一个副本,知晓集群的状态和配置 数据被转化为一个或多个对象,每个对象都具有对象名称和存 ...

  8. Unity3D小游戏开发之两个我踩过的坑

    最近在开发一个植物大战僵尸小游戏,今天写了一早上的代码,踩了两个坑,这两个坑的位置分别位于触发器和数据转换,写这篇博文以此来让其他程序员不要再去踩这两个坑. 1.我在做简易僵尸模型的时候,这个僵尸模型 ...

  9. 《带你装B,带你飞》pytest修炼之路1- 简介和环境准备

    1. pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介 ...

  10. 从零开始のcocos2dx生活(四)ActionManager

    文章目录 初始化构造函数 析构函数 删除哈希元素 分配存放动作对象的空间 通过索引移除动作 暂停动作 恢复动作 暂停所有的动作 恢复所有的动作 添加动作 移除所有的动作 移除target中的所有动作 ...