Unityclient通信測试问题处理(一)

近期在測试程序的通信模块时。遇到了一个问题:Unity的API函数仅仅能在主线程中调用。而作为client程序,我单独启用了一个监听线程来接收服务端发送的消息,消息接收后的解析函数也由该线程一并调用。那么问题来了。在解析函数之中,我将不能调用Unity的不论什么API函数。

之前由于没有意识到这个问题。很多处理都是直接放在消息解析函数中做的,程序一经測试首先就报出了下面错误:

CompareBaseObjectsInternalcan only be called from the main thread…

看到这条信息,自己寻思是怎么回事,像是对象的比較推断上出了问题,于是開始查看代码。

后来发现是由于在解析函数中。收到消息后调用了一个管理者类中的方法。这个管理者类使用单例模式实现,而且继承了MonoBehaviour类。在获取单例对象时,涉及了对象的判空操作。代码例如以下所看到的:

if ( null ==_uniqueInstance ){...}

正是这个Operate == 的调用。引发了这个错误。由于管理者类继承了MonoBehaviour类。而MonoBehaviour类重写了Operate ==。所以在获取单例对象时,调用的是Unity自己的实现。而这时的代码运行逻辑位于监听线程之中,并不是Unity3D 的主线程,于是就报出了这个CompareBaseObjectsInternalcan
only be called from the main thread的错误信息。那么该怎么解决问题呢?自己到网上搜索了一下。找到了网友提供的一个方法。就是用.Net中的Object.ReferenceEquals函数来进行对象的推断操作,替换掉Operate ==的方式。

经过測试,这样的方法确实可行。

在查看ReferenceEquals函数的文档后得知,由于ReferenceEquals函数是不能被重写的。所以不会由于这是Unity自己实现的版本号,而限定了仅仅能在主线程中调用。所以问题得以解决。另外还要注意的一点是,使用ReferenceEquals函数比較两个对象是否同样,当这两个对象为值类型时。会运行装箱操作,要注意一下。

以下是自己改动后的获取单例的方法:

public static SceneMng GetInstance()

{

if (ReferenceEquals( null, _uniqueInstance
) ) {

lock (_lock ) {

if (ReferenceEquals( null, _uniqueInstance
) ) {

//_uniqueInstance= ( SceneMng )GameObject.FindObjectOfType(

// typeof( SceneMng ) );

}

}

}

return _uniqueInstance;

}

攻克了这个错误,随之而来的是自己的实例无法初始化的问题,由于被凝视掉的函数是不能在此调用的(监听线程)。

解决的办法也好说。直接在Awake函数中进行单例的初始化:

void Awake( )

{

//singleton initialize

_uniqueInstance = this;

}

场景载入,当Awake函数运行时。单例对象就初始化完毕了。OK,能够投入使用了。也不用操心线程的问题了。

在測试过程中。另一些地方的处理也由于受到了这个主线程的限制。而做出了一些改动,待自己整理过后,再继续写上来。有不正之处欢迎大家指出,一起交流讨论。

本文出自杜晓萌的博客。未经特殊表明皆为本人原创,请勿用于不论什么商业用途,转载请保持完整性并标明出处:http://blog.csdn.net/haohan_meng

Unityclient通信測试问题处理(一)的更多相关文章

  1. Unityclient通信測试问题处理(二)

    Unityclient通信測试问题处理(二) 在client的通信測试过程中.场景载入的问题给自己带来了不小的麻烦.由于消息的解析方法在单独的监听线程中调用,这也就意味着无法在消息的解析方法中调用Un ...

  2. Robotium双client測试框架

    互联网的本质就是信息交换.移动互联网更是如此, 所以很多移动互联网的服务类应用中有着身份地位不同的两种用户(比如:交易中的买家和卖家, 教学中的老师和学生, 打车中的车主和乘客).近期的工作是给公司的 ...

  3. 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例

    第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...

  4. 基于RYU控制器(controller)上的simple-switch 的APP做的測试-SDN/OpenFlow

    近期一直在学习RYU控制器,在使用的过程中,发现有下面几方面的长处:RYU控制器全然使用Python语言编写,在理解起来和上手速度上是挺快的:RYU控制器的总体架构清晰明了,在日后有时间我会整理一个关 ...

  5. 玩转Linux网络namespace-单机自环測试与策略路由

    上周有厂商到公司測试,拿了一块据说非常猛的网络处理加速PCIe板卡,拎在手里沉甸甸的非常有分量,最让人意淫的是那4个万兆光口,于是我迫不及待的想要一览光口转发时那种看不见的震撼. 可是,仅凭4个光口怎 ...

  6. ESP8266学习笔记1:怎样在安信可全功能測试板上实现ESP-01的编译下载和调试

    近期调试用到了安信可的ESP-01模块,最终打通了编译下载调试的整个通道,有一些细节须要记录,方便兴许的开发工作. 转载请注明:http://blog.csdn.net/sadshen/article ...

  7. 淘宝分布式 key/value 存储引擎Tair安装部署过程及Javaclient測试一例

    文件夹 1. 简单介绍 2. 安装步骤及问题小记 3. 部署配置 4. Javaclient測试 5. 參考资料 声明 1. 以下的安装部署基于Linux系统环境:centos 6(64位),其他Li ...

  8. 星云測试- Android应用深度体检专业平台

    星云測试-给你的Android应用做个深度体检   星云測试- Android应用深度体检专业平台 星云在线云測试(简称星云測试www.teststars.cc)是全球第一个公布并商用的数字化精准软件 ...

  9. PCI OP WiFi 測试(二):PCI对OP的要求

    PCI OP WiFi 測试(二):PCI对OP的要求 每次看PCI的文档.都一头雾水,本来就非常抽象.看英文就感觉更抽象.泛泛而谈的要求,看一次忘一次.仅仅好翻译成中文.没事就看看,知道指导思想. ...

随机推荐

  1. 搭建Mysql双机热备 (主从同步)

    准备两台centos7主机:10.0.18.132 master 10.0.18.136  slave 先把selinux关闭,iptables关闭  或者添加端口 132 master安装好Mysq ...

  2. BZOJ 1797 网络流的可行边&必须边

    求完网络流以后 tarjan一发 判一判 //By SiriusRen #include <queue> #include <bitset> #include <cstd ...

  3. java9新特性-6-多版本兼容jar包

    1.官方Feature 238: Multi-Release JAR Files 2.使用说明 当一个新版本的Java出现的时候,你的库用户要花费数年时间才会切换到这个新的版本.这就意味着库得去向后兼 ...

  4. PostgreSQL Replication之第四章 设置异步复制(4)

    4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...

  5. 《剑指offer》反转链表

    一.题目描述 输入一个链表,反转链表后,输出链表的所有元素. 二.输入描述 输入一个链表 三.输出描述 返回逆转后的链表 四.牛客网提供的框架 /* struct ListNode { int val ...

  6. vue.js技巧小计

    //删除数组索引方法01 del (index) { this.arr.splice(index ,1); } //删除数组索引方法01 del (index) { this.$delete(this ...

  7. BAPC 2014 Preliminary(第一场)

    D:Lift Problems On the ground floor (floor zero) of a large university building a number of students ...

  8. exsi主机之间使用scp拷贝文件超时问题

    exsi主机之间使用scp拷贝文件直接连接不上报错超时: 解决: 防火墙勾选ssh选项

  9. php八大设计模式之工厂模式

    简单点来说,就是用到什么类,就去实例化对应的类.比如:php 可能连接 mysql,可能连接 sqlserver,也可能是 oracle 数据库,可以动态的去链接. 书籍<php权威编程> ...

  10. 推荐《R数据可视化手册》高清英文版PDF+中文版PDF+源代码

    绝大多数的绘图案例都是以强大.灵活制图而著称的R包ggplot2实现的,充分展现了ggplot2生动.翔实的一面.从如何画点图.线图.柱状图,到如何添加注解.修改坐标轴和图例,再到分面的使用和颜色的选 ...