游戏引擎设计系列13-声音系统
声音系统就是对Fmod做了简单的封装.Fmod不只在Windows上,后面在移动平台使用也表现相当出色.
声音系统就是对Fmod做了简单的封装.Fmod不只在Windows上,后面在移动平台使用也表现相当出色.
引擎的物理系统,简单的封装了Physix.
动画系统,包括基础的位置信息,骨骼节点信息,骨骼,Pose.制作导出模型的T Pose模型和骨骼的信息,再通过动画导出的骨骼信息值按帧计算出骨骼的当前Pose信息,通过SkinedMesh(一个顶点一般最多和四个骨骼节点相关)的双四元数算法,计算实际mesh的顶点信息.
以Widget作为基本的UI单元,所有子Widget会被父Widget剪裁,父Widget先绘制,同级Widget按顺序绘制,后面的会覆盖前面的,
占位 Texture、Mesh、StaticMesh、SkinedMe… 游戏引擎设计系列9-渲染系统
引擎需要使用一些系统工具类,比如Clock、加密的CRC、GUID、Console、LogSystem等等,其中比较重要的就是Clock了。
为了更好的管理引擎中的文件路径,比如同一路径根据不同访问权限或不同优先级指向不同目录,引擎中设计了虚拟文件系统VFS,
为了更好的降低引擎各个模块之间的耦合性,同时可以根据实际需要动态的加载实际需要的模块,引擎中设计了模块管理,具体代码如下,
/// 模块接口,所有模块需要继承
引擎为了更方便的使用多线程Thread,我们把所有需要在线程上执行的操作分解成任务Task,并且在Thread上生成一个任务队列TaskQueue,Thread根据TaskQueue的顺序和时间依次执行。需要在Thread上执行的任务,只要调用Thread上的Send和Post就可以将任务插入相应TaskQueue中,其中Send是阻塞的,Post是非阻塞的。
上文回顾了反射系统,有了反射系统,脚本引擎实现起来就简单很多,不需要类似LuaBind的机制就可以实现。
Lua和C交互需要使用下列3个伪索引
LUA_REGISTRYINDEX // 注册表,只有C代码可以访问的全局表,使用时要注意Key,一般使用C地址以light userdata的形式做键。
LUA_ENVIRONINDEX // 当前模块的环境表,同lua_getfenv,lua_setfenv,类似于Lua中的_ENV, 相对于LUA_REGISTRYINDEX,不需要共享数据时,更推荐使用这个表,只作用于当前模块,可以增加安全性。
LUA_GLOBALSINDEX // 全局表,类似于Lua中的_G