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

介绍

大家好,欢迎你踏上3D编程之旅~

本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程,探讨了在从0开始构建3D引擎和编辑器的过程中,每一个重要的功能点、设计方案的思考、讨论、总结和延伸。

本系列避免陷入细节的实现代码,使用伪代码代替。所以没有可直接运行的代码,取而代之的是经过抽象和提炼的伪代码/模式。

为什么要写这个系列

我有三个小目标:
1.完全创造
完全从0开始,创造一个有深度、有难度、有挑战的产品。
所以Wonder被创造出来了,并且会持续地发展。

2.完全纪录
完全纪录创造的过程,把我整个人生都沉淀下来。
所以有了打造3D引擎,第8000小时开始

3.完全分享
完全分享所有的创造、纪录,把我走过的路分享给需要的人。
所以有了Wonder开源

本系列为了完成第2个和第3个目标,会把开发Wonder的思考沉淀下来,进行提炼和升华,分享给世界,也分享给我自己。

希望对你有所帮助~

技术栈

本系列特色

1.完全从0开始,素材来自我们的产品Wonder

我们会一边开发Wonder,一边在本系列写文章分享。
因为Wonder在不断更新中,所以本系列也会不断更新。

2.完全、彻底地使用函数式编程。

现在3D领域使用函数式编程的资料很少,主流还是使用面向对象。
我以前也是用面向对象,不过自从我开始接触函数式编程,就拥抱了它。
面向对象很好,函数式编程也很好。使用哪一个,是每个人的自由。

本系列希望能扩展大家的视野和思维,展示函数式编程的魅力。

3.不仅探讨3D引擎,而且以编辑器作为主线。

讨论编辑器的资料很少,讨论3D引擎+编辑器的更少。

本系列完全基于我们的实战经验,以编辑器作为主线,3D引擎作为底层实现。

两者的关系如下图:

4.重点放在设计和思考上,避免实现细节

本系列希望展示来自于实战的思考和设计,在较高的层面进行探讨,所以会用伪代码作为实现的说明,避免细节的干扰。

5.类型驱动设计。尽量用Type和伪代码替代UML来探讨设计。

Curry-Howard 同构:

类型即命题,程序即证明

类型既然对应逻辑命题,那能用它来表示设计吗?
具体就是:
1)能表达领域模型吗?

2)能表达领域模型的交互关系吗?

3)能替代单元测试?

使用类型进行约束,然后在编译时检查和发现错误,从而不再需要单元测试。

4)能驱动设计吗?

这样就能快速验证设计方案:
通过定义类型来描述需求和设计,不需要具体实现;
验证通过后,再一一实现。

本系列使用Reason语言,大部分满足1和2,部分满足3和4。

这是因为Reason语言的类型没有Idris强大,所以3和4不能完全满足。。。。。。

或许以后可以使用Idris来重写。。。。。。

不过总的来说,我对Reason语言还是非常满意的,详见我们在知乎上的总结-如何评价 reasonml ?

  • 参考资料

程序与证明
Designing with types

能给你带来什么收益?

1.了解Wonder的技术内幕

2.学习从0开发3D引擎和编辑器

3.学习函数式编程及其在3D领域的应用

4.学习3D编程的功能实现,如纹理、光照、模型等功能的实现

5.学习设计和架构,如Data Oriented、多线程、管道job等设计

写作规划

Wonder目前开发到1.0版本,因此本系列对应Wonder 0.1 - 1.0版本的内容。
(随着Wonder不断更新新版本,本系列也会对应更新)

Wonder 1.0产品展示:

本系列目录

  • 函数式编程准备
  • 初步需求分析与设计
  • 搭建基础框架
  • 操作GameObject
  • 操作Component
  • Redo/Undo
  • 端对端测试
  • 输出
  • 多线程渲染
  • 运行/停止
  • 事件和CameraContronller组件
  • IMGUI
  • 增加资产Asset
  • 导入/导出
  • 发布本地包
  • 快捷键
  • Picking
  • Transform Gizmo
  • PWA

致谢

感谢你能读到这里,欢迎你提出各种建议或意见,为你服务是我的荣幸~感谢~

参考资料

Wonder-WebGL 3D引擎和编辑器
Curry-Howard 同构
程序与证明
Designing with types
Reason语言

原文地址:https://www.cnblogs.com/chaogex/p/10799388.html

时间: 2024-11-07 10:16:14

用函数式编程,从0开发3D引擎和编辑器(一)的相关文章

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

大家好,本文介绍了本系列涉及到的函数式编程的主要知识点,为正式开发做好了准备. 函数式编程的优点 1.粒度小 相比面向对象编程以类为单位,函数式编程以函数为单位,粒度更小. 正所谓: 我只想要一个香蕉,而面向对象却给了我整个森林 2.性能好 大部分人认为函数式编程差,主要基于下面的理由(参考 JavaScript 函数式编程存在性能问题么?): 1)柯西化.函数组合等操作增加时间开销 2)map.reduce等操作,会进行多次遍历,增加时间开销 3)Immutable数据每次操作都会被拷贝为新的

JavaScript函数式编程(0):函数基础 arguments、this、apply()、call()

1 函数参数 函数的实参和形参个数可以不等,之所以会这样,原因是 ECMAScript 中的参数在内部是用一个数组来表示的.函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话).如果实参个数大于形参个数,多余的实参不传递值,但是在arguments中可以访问:如果形参个数大于实参,没有传递值的实参将自动被赋予 undefined 值. 2 arguments和this 所有的函数调用都会传递两个隐式参数:arguments和this.实际上,在函数体内可以通过 argume

万圣节福利:红孩儿3D引擎开发课程《3ds max导出插件初步》

红孩儿3D引擎开发课堂 QQ群:275220292 国内最详尽教授怎样开发3D引擎的地方!揭开3D引擎开发最不为人知的秘密! 万圣节福利,国内最详尽的3ds max导出插件编程指南0基础篇免费发放!            前言:今天网易的<乱斗西游>上线AppStore ,将继完美世界<黑暗黎明>后再次证明自研引擎的实力!假设你想成为引擎研发高手,那么,一切,将从3ds max导出插件起步~ 第九章课程<3ds max导出插件初步> 一.3ds max导出插件简单介绍:

Java8 那些事儿(一):Stream 函数式编程

前言 Java8(又称为 Jdk1.8)是 Java 语言开发的一个主要版本.Oracle 公司于 2014 年 3 月 18 日发布 Java8,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的 Stream API 等.Java8 API 添加了一个新的抽象称为流 Stream,可以让你以一种声明的方式处理数据.Stream API 可以极大提高 Java 进程员的生产力,让进程员写出高效率.干净.简洁的代码. Java8 新特性 Lambda 表达式 ? Lamb

JavaScript:了解一下函数式编程

一.简介 在JavaScript中,函数就是第一类公民,它可以像字符串.数字等变量一样,使用var修饰并作为数据使用.它可以作为数值.可以作为参数.还可以作为返回结果.可以说JavaScript就是函数式编程.ES6新语言特性中,箭头函数.扩展运算符会极大地帮助开发者利用函数式编程技术进行开发. //定义一个箭头函数 var print = (message) => console.log(message) 1.函数作为数值使用 //将函数作为数值使用 const array = ["XY

函数式编程的类型转换

1.基础类型转换为高阶类型(monad),以便使用函数式编程的特性:map.reduce,pipeline.业务组织.异步编程等: 2.高阶类型转化为基础类型:以便使用基础类型的态射(计算)功能. 3.高阶类型的内部转换(泛型类型转换)--类型关乎复合--以便业务的组织. 高阶类型起到桥接的功能. 函数式编程的类型系统开发的首要任务是搞清楚类型转换的规则: 高低层的双向转换(升降阶): 同级类型间的计算转换. 原文地址:https://www.cnblogs.com/feng9exe/p/104

如何学好游戏3D引擎编程

注:本文是网上看到的一篇文章,感觉写的很好,因此收藏了下来 <如何学好游戏3D引擎编程>此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰--阿哲VS自己 QQ79134054多希望大家一起交流与沟通 这篇文章是我一年半前,找工作时候写的,那时是发到学校的BBS上.现在我工作了,想法和以前也有不同,但对游戏引擎编程理念还是基本差不多.在我没遇到U3以前,一直研究WILDMAGIC,可以说是GAMEBRYO的前身吧,他们基

【原创】Linux环境下的图形系统和AMD R600显卡编程(10)——R600显卡的3D引擎编程

3D图形处理流水线需要流经多个硬件单元才能得到最后的渲染结果,流水线上的所有的硬件单元必须被正确编程,才能得到正确的结果. 总体上看,从图形处理流水线的源头开始,需要准备好vertex和index,在立即模式下,index可以直接编程在命令中,通过配置寄存器告诉GPU vertex buffer的位置,在启动GPU流水线之前,还需要将vertex shader程序和pixel shader程序加载到vram 中,并通过配置寄存器告示GPU shader程序的位置,在vertex shader和p

一个人独立开发 3D 游戏引擎可能吗?

作者:孙志超链接:https://www.zhihu.com/question/24733255/answer/42000966来源:知乎著作权归作者所有,转载请联系作者获得授权. 当然可以,但难道有个引擎,就可以做出真正商业化的游戏么?而且国产游戏大部分是网游啊. 几年前的老文--<一个人的服务器端>(只是为了说明游戏开发难度,不是针对题主问题.) 技术准备 能够做这个MMO的触发点是通过某些途径得到了某个大公司使用的一款3D引擎,其他的都是白手起家.当时大家还不知道有"分布式服务