ISSUE-023
CRIWARE多线程死锁问题
常见表现
加载过程中卡死,程序转圈无响应。
原因分析
CRIWARE启用SonicSYNC后出问题。
解决方法
初始化CRIWARE时不要启用SonicSYNC。
方法一:修改resources.assets中的CriWareIntializer(仅适用于Unity游戏)。
- 使用UABEA打开resources.assets。
- Filter只保留MonoBehaviour,找到CriWareIntializer。
- 选择Export Raw。
- 打开UABEA导出的文件,修改iosEnableSonicSync为false,即\x01\x00\x00\x00修改为\x00\x00\x00\x00。但是对于不同版本的CriWare插件,数据位置可能不一样。以圆哆啦为例,数据位置在0xDC,所以可以在0xDC往前往后4个字节查找\x01\x00\x00\x00,逐一尝试替换。
- 选择Import Raw。
- 保存resources.assets。
方法二:写入二进制补丁。
查找字符串The linked library version is more recent than CRI Atom Ex header version,所在函数即为criAtomEx_global.o的criAtomEx_CalculateWorkSizeInternal函数,其中thread_model控制是否启用SonicSYNC。
typedef struct CriAtomExConfigTag {
int thread_model;
// ...
} CriAtomExConfig;
typedef struct CriAtomExConfigTag_IOS {
CriAtomExConfig atom_ex;
CriAtomExAsrConfig asr;
CriAtomExHcaMxConfig hca_mx;
// ...
} CriAtomExConfig_IOS;
int criAtomEx_CalculateWorkSizeInternal(CriAtomExConfig_IOS *config, void *a2) {
if (config) {
// 必定进入此分支
// ...
} else {
// ...
}
}
把 if 判断的CBZ指令改成STR WZR, [X0],即可将thread_model改为0,从而不启用SonicSYNC。