https://github.com/crazii
开源的主要原因是一个人写不动了, 而且已经很久没更新代码了. 希望有人能够感兴趣, 提供贡献.
距离上次更新日志已经很久了, 中间大概加了以下feature: (mile stone 3: scene & effects)
- 放弃 MFC插件, 使用 Qt 插件 (DPI适应不用自己写了, 而且跨平台, 理论上编辑器也可以上Mac/Linux)
- 添加了CSM (shadow map)
- 加了PostFX框架, 加入了HDR, HBAO, TAA(仅静态).
- Android长时间未维护, 开源前把bug修了. 备注一些OpenglES上CSM遇到的bug:
- glViewport 不影响glClear的区域, 要用glScissor 还有depth/color mask会影响glClear
- 2. textureProj传入的z是和zbuffer比较的,所以应该在[0,1]范围内, 这和d3d不太兼容, 多一步NDC到zbuffer[0,1]的映射.
- 水, 草, 大气 等还没有时间实现
- 去除vsandroid, 去除vs2015之前的支持, 目前只支持vs2015和vs2017, 支持直接编译win32和android.
- Android改为static build, 只留一个.so, 安卓不是必须的, 以前是一堆so, 这次算是提前准备吧. 因为很多平台像iOS就禁止使用动态库,iOS8以后才允许,好像还有很多限制,比如要单独用framework啥的, 最新的不知道了. 遇到的问题是
- foundation库因为.so优先被加载的对象优先初始化就没了, 现在使用"__attribute__((init_priority(101)))"让foundation的对象优(比如内存管理)先初始化
- 所有插件都没有链接依赖, 所以.lib链接不进去, 使用"-Wl,--whole-archive"可以解决但是我不太喜欢, 所以现在用强制符号引用, 把lib链接进来. 强制的方法就像安卓ndk里native_app_glue.c 的 app_dummy(), 别的地方调用一下这个函数, 那么这个编译单元就被引用了, 会被链接到可执行目标,否则不进入.这个行为和解决方法, 对所有编译器都有效. 插件在构造的时候把自己放入全局插件列表, 加载插件的方式从加载dll/so,改为从全局列表里查找.
- 去掉了intel TBB,使用blade的thread库实现task分发. GLES遇到个问题, 就是随机分发, 导致shared context都不好用, 因为task可以在任意线程执行, 而shared conext在固定的线程下工作比较理想, 否则仍然有频繁的context切换,导致效率下降. 之前用tbb没有这个问题, 主要是因为tbb虽然也是随机分发任务,但几乎每次都是恰好把主线程给了渲染任务用, 偶尔在d3d9 debug layer会报多线程warning, 报warning的时候就是渲染task不在原来创建设备的线程, 但是因为blade可以保证任务的线程安全, 所以那个警告也可以忽略.
解决办法是加了task affinity, 可以把task绑定到一个固定的线程, 或者主线程. 目前简单的绑定到主线程, 当然也可以绑定到一个固定的线程,只要设备(API)创建/初始化推迟到任务异步执行的线程里就可以了,不过从运行性能上分析, 几乎没什么差距, 所以就选用最简单的方式. - 最后就是为了开源做的准备, 因为不太喜欢GPL, 想用MIT协议, 最后把iconv这个依赖去掉了, 幸好在加iconv的时候, 已经有宏隔离过了, 所以去的还算顺利. 查了FreeImage库, 除了GPL还有专门的商业license, FIPL, 所以还在用. runtime除了freimage, 已经没有大的依赖了, 还有一些小的依赖, 直接放到工程源文件里了, 具体引用了那些三方文件, 可以在git根目录下的LICENSE里查看.
后续计划:
mile stone 3: scene & effects:
iOS和vulkan
水,草,大气等
mile stone 4: tool pipeline & editor (not started)
编辑器太简陋,还有设计硬伤,希望后面会更新