这是关于项目代码结构和一些功能实现说明, 普通用户酌情阅读.
Win10+
Visual Studio 2022
C++14
spine-runtime
jsoncpp
其中 spine-runtime
和 jsoncpp
均是以源码方式引入并编译的, 内部有一些相应的适配性修改.
spine-runtime
版本固定了是 v3.6.53
, 所以几乎只支持碧蓝航线导出的小人资源.
flowchart
WA(WinApp)
PM(PerfMonitor)
AC(AppConfig)
MW(MainWnd)
CD(ConfigDlg)
SW(SpriteWnd)
SC(SpineChar)
SR(SpineRenderer)
WA --> MW
PM -.- MW
PM -.- SW
MW --> CD
CD --> AC
MW --> SW
SW --> SC
SW --> SR
SR --> SW
SC --> SR
(仅展示了一部分核心关系)
性能数据使用 PDH 进行收集, 数据与任务管理器看到的会有一些不同, 但是和性能监视器 perfmon.msc 的数据是一样的.
有关数据收集的内容见 perfmonitor.cpp
.
桌宠使用 2D 图形库绘制, 具体实现原理参考 spine-c 运行时文档, 标准实现需要使用纹理映射等计算机图形学操作但是我不会, 所以纹理映射是通过 2D 库的纹理笔刷来实现的.
创建纹理笔刷之后, 在绘制顶点三角形时, 需要自己手动计算纹理到模型的仿射矩阵, 然后设置笔刷的变换矩阵, 就能完成纹理映射. 关键函数是这个 GetAffineMatrix
:
void GetAffineMatrix(
float x1, float y1, float x2, float y2, float x3, float y3,
float u1, float v1, float u2, float v2, float u3, float v3,
Matrix* m
);
能够计算两个平面三角形 UV
到 XY
的仿射矩阵. 与渲染有关的详细实现见 spinechar.cpp
.
由于开发过程原因, 程序的主窗口其实是性能浮窗, 因此为了避免阻塞窗口消息循环, 渲染的过程是放在子线程里完成的. 因此在跨线程调用的时候, 要视情况考虑调用互斥锁操作 SpineRenderer::Lock
和 SpineRenderer::Unlock
来避免数据同步错误.