Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ISSUE-023

CRIWARE多线程死锁问题

常见表现

加载过程中卡死,程序转圈无响应。

原因分析

CRIWARE启用SonicSYNC后出问题。

解决方法

初始化CRIWARE时不要启用SonicSYNC。

方法一:修改resources.assets中的CriWareIntializer(仅适用于Unity游戏)。

  1. 使用UABEA打开resources.assets。
  2. Filter只保留MonoBehaviour,找到CriWareIntializer。
  3. 选择Export Raw。
  4. 打开UABEA导出的文件,修改iosEnableSonicSync为false,即\x01\x00\x00\x00修改为\x00\x00\x00\x00。但是对于不同版本的CriWare插件,数据位置可能不一样。以圆哆啦为例,数据位置在0xDC,所以可以在0xDC往前往后4个字节查找\x01\x00\x00\x00,逐一尝试替换。
  5. 选择Import Raw。
  6. 保存resources.assets。

方法二:写入二进制补丁。

查找字符串The linked library version is more recent than CRI Atom Ex header version,所在函数即为criAtomEx_global.ocriAtomEx_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。