由于Unity的iOS版本需要為了運(yùn)行效率手负,需要應(yīng)用il2cpp模式。
但是RakNet該網(wǎng)絡(luò)庫(kù)的一些接口通過(guò)il2cpp導(dǎo)出之后,會(huì)出現(xiàn)bug犯祠。
最開(kāi)始的方案是想導(dǎo)入libRakNet.a靜態(tài)庫(kù)紊浩,該庫(kù)通過(guò)xcode編譯成iOS版本窖铡。
該libRakNet.a庫(kù),應(yīng)用于原生的ObjectC工程是沒(méi)問(wèn)題坊谁,但是應(yīng)用到unity通過(guò)il2cpp之后费彼,就出現(xiàn)連接不成功的情況。
進(jìn)一步分析:在服務(wù)器上單步之后口芍,發(fā)現(xiàn)服務(wù)器可以接收到請(qǐng)求連接的消息箍铲,但是接收到的消息頭解析是錯(cuò)亂的。
也在stackOver上找到了別人也有遇到過(guò)類(lèi)似問(wèn)題鬓椭,詳細(xì)颠猴;
修改方案是將 DatagramHeaderFormat 結(jié)構(gòu)體中的 serialize 方法名字重命名下聋庵,在文件ReliabilityLayer.cpp 重新編譯成靜態(tài)庫(kù)之后,發(fā)現(xiàn)請(qǐng)求協(xié)議頭解析是改正確了芙粱。
但是連接還是不成功祭玉。
繼續(xù)分析,發(fā)現(xiàn)是服務(wù)器在請(qǐng)求處理連接請(qǐng)求的時(shí)候春畔,會(huì)把該客戶(hù)端還沒(méi)完成三次握手的情況下脱货,將該客戶(hù)端判定為超時(shí),直接關(guān)閉該連接律姨。
懷疑還是在connection_time的指通過(guò)il2cpp導(dǎo)出的C++代碼中還存在問(wèn)題振峻。因?yàn)橐谋容^急,就沒(méi)有繼續(xù)研究下去择份,基本上可以確定是il2cpp的bug扣孟。
放棄了使用靜態(tài)庫(kù)方案。
因?yàn)閕l2cpp本身導(dǎo)出就是C++代碼荣赶,那就直接將raknet的源碼導(dǎo)入到Plugin/iOS/Raknet/ 目錄下凤价,果然可行。
一拔创、在加入前需要加入兩部分代碼:
1利诺、RakNet->Source下的全部加載
2、通過(guò)Swig導(dǎo)出的導(dǎo)出接口文件也需要放進(jìn)去剩燥,但是需要將RakNet_wrap.cxx 的后綴修改成cpp慢逾,RakNet_wrap.cpp 和RakNet_wrap.h兩個(gè)文件也需要加入,否者在C#中是獲取不到接口的灭红。
二侣滩、導(dǎo)出成xcode工程之后,開(kāi)始編譯变擒,
因?yàn)橛袆?dòng)態(tài)類(lèi)型轉(zhuǎn)換的應(yīng)用君珠,所以編譯時(shí)會(huì)報(bào)錯(cuò),在XCode的 build setting中將Enable C++ runtime Types 修改yes
如果是使用xcodebuild編譯的話赁项,就帶上 GCC_ENABLE_CPP_RTTI = YES 編譯選項(xiàng)就不會(huì)報(bào)錯(cuò)葛躏。
打包導(dǎo)出ipa測(cè)試網(wǎng)絡(luò)連接ok了。
修改之后的代碼連接 在此