团结1.4.4+鸿蒙5.0 平台兼容性问题

2025/06 04 11:06

现象描述:

进入游戏后,断开网络连接,游戏闪退

NETMANAGER_BASE: [network_module.cpp 59] Subscribe is called
NETMANAGER_BASE: [network_exec.cpp 116] ExecSubscribe
Tuanjie: Could not allocate memory: System out of memory!
Tuanjie: Trying to allocate: 398659429081B with 16 alignment. MemoryLabel: String
Tuanjie: Allocation happened at: Line:525 in 
Tuanjie: Memory overview
Tuanjie: [ ALLOC_TEMP_TLS ] used: 4507B | peak: 0B | reserved: 6455296B 
Tuanjie: [ ALLOC_DEFAULT ] used: 76851824B | peak: 0B | reserved: 184561664B 
Tuanjie: [ ALLOC_TEMP_JOB_1_FRAME ] used: 0B | peak: 0B | reserved: 0B 
Tuanjie: [ ALLOC_TEMP_JOB_2_FRAMES ] used: 0B | peak: 0B | reserved: 0B 
Tuanjie: [ ALLOC_TEMP_JOB_4_FRAMES (JobTemp) ] used: 71B | peak: 0B | reserved: 20971520B 
Tuanjie: [ ALLOC_TEMP_JOB_ASYNC (Background) ] used: 442B | peak: 0B | reserved: 12582912B 
Tuanjie: [ ALLOC_GFX ] used: 1903336B | peak: 0B | reserved: 33554432B 
Tuanjie: [ ALLOC_CACHEOBJECTS ] used: 74064092B | peak: 0B | reserved: 85213184B 
Tuanjie: [ ALLOC_TYPETREE ] used: 17014696B | peak: 0B | reserved: 20971520B 
MUSL-SIGCHAIN: signal_chain_handler call 2 rd sigchain action for signal: 5 sca_sigaction=5a32bbb810 noreturn=0 FREEZE_signo_5 thread_list_lock_status:-1 tl_lock_count=0 tl_lock_waiters=0 tl_lock_tid_fail=-1 tl_lock_count_tid=642 tl_lock_count_fail=-10000 tl_lock_count_tid_sub=642 thread_list_lock_after_lock=32291 thread_list_lock_pre_unlock=32291 thread_list_lock_pthread_exit=32295 thread_list_lock_tid_overlimit=-1 tl_lock_unlock_count=0 __pthread_gettid_np_tl_lock=0 __pthread_exit_tl_lock=0 __pthread_create_tl_lock=0 __pthread_key_delete_tl_lock=0 __synccall_tl_lock=0 __membarrier_tl_lock=0 install_new_tls_tl_lock=0 set_syscall_hooks_tl_lock=0 set_syscall_hooks_linux_tl_lock=0 fork_tl_lock=0 

追查发现出在网络接收数据这块有问题

private void AsyncReadCallback(IAsyncResult ar)
{
    StateObject state = (StateObject)ar.AsyncState;
    TcpClient tc = state.client;
    if (!tc.Connected)
    {
        return;
    }
    NetworkStream ns = tc.GetStream();
    int num = ns.EndRead(ar);
    if (num > 0)
    {
        // ... process data
        ns.BeginRead(buffer, 0, buffer.length, new AsyncCallback(AsyncReadCallback), state);
    }
}

在Unity2021.3.X的Android平台上,若Wifi断开连接,则 num 返回 <=0,连接中止

但在Tuanjie1.4.4的鸿蒙平台上,若Wifi断开则会产生异常,如果不处理异常,中发生内存溢出

private void AsyncReadCallback(IAsyncResult ar)
{
    StateObject state = (StateObject)ar.AsyncState;
    TcpClient tc = state.client;
    if (!tc.Connected)
    {
        return;
    }
    NetworkStream ns = tc.GetStream();
    int num = 0;
    try
    {
        num = ns.EndRead(ar);
    }
    catch
    {
    }
    if (num > 0)
    {
        // ... process data
        ns.BeginRead(buffer, 0, buffer.length, new AsyncCallback(AsyncReadCallback), state);
    }
}