Skip to content

Latest commit

 

History

History
77 lines (51 loc) · 2.43 KB

README.dev.md

File metadata and controls

77 lines (51 loc) · 2.43 KB

DesktopSprite | Developer

←README

这是关于项目代码结构和一些功能实现说明, 普通用户酌情阅读.

环境

其中 spine-runtimejsoncpp 均是以源码方式引入并编译的, 内部有一些相应的适配性修改.

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
Loading

(仅展示了一部分核心关系)

注意事项

性能监视器部分

性能数据使用 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
);

能够计算两个平面三角形 UVXY 的仿射矩阵. 与渲染有关的详细实现见 spinechar.cpp.

多线程

由于开发过程原因, 程序的主窗口其实是性能浮窗, 因此为了避免阻塞窗口消息循环, 渲染的过程是放在子线程里完成的. 因此在跨线程调用的时候, 要视情况考虑调用互斥锁操作 SpineRenderer::LockSpineRenderer::Unlock 来避免数据同步错误.