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,能够投入使用了。也不用操心线程的问题了。

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

时间: 2024-10-20 00:17:32

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

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

在client的通信測试过程中.场景载入的问题给自己带来了不小的麻烦.由于消息的解析方法在单独的监听线程中调用,这也就意味着无法在消息的解析方法中调用Unity自身的API了.本来是打算在接收到场景切换的消息后,直接在解析方法中调用协同程序StartCoroutine.来实现场景的异步载入,但是如今一旦调用就会提示下面错误: StartCoroutine_Auto can only be called from the main thread... 不能直接在监听线程中调用,那就仅仅能另想办法了

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

文件夹 1. 简单介绍 2. 安装步骤及问题小记 3. 部署配置 4. Javaclient測试 5. 參考资料 声明 1. 以下的安装部署基于Linux系统环境:centos 6(64位),其他Linux版本号可能有所差异. 2. 网上有人说tair安装失败可能是由于gcc版本号问题,高版本号的gcc可能不支持某些特性导致安装失败.经过实验证明.该说法是错误的,tair安装失败有各种可能的原因但绝对与gcc版本号无关,比方我的gcc開始版本号为4.4.7,后来tair安装失败,我又一次编译低版

LINPACK測试

1简单介绍 LINPACK是线性系统软件包(Linear system package) 的缩写. Linpack如今在国际上已经成为最流行的用于測试高性能计算机系统浮点性能的benchmark.通过利用高性能计算机.用高斯消元法求解一元N次稠密线性代数方程组的測试.评价高性能计算机的浮点性能. Linpack測试包含三类,Linpack100.Linpack1000和HPL. Linpack100求解规模为100阶的稠密线性代数方程组.它仅仅同意採用编译优化选项进行优化.不得更改代码,甚至代码

蓝牙压力測试报抛android.os.TransactionTooLargeException异常分析总结

1.从main日志中找到异常点,例如以下: 08-20 11:05:19.754 5023 5023 E AndroidRuntime: FATAL EXCEPTION: main 08-20 11:05:19.754 5023 5023 E AndroidRuntime: Process: com.android.bluetooth, PID: 5023 08-20 11:05:19.754 5023 5023 E AndroidRuntime: java.lang.RuntimeExcept

让你提前认识软件开发(42):性能測试

第3部分 软件研发工作总结 性能測试 [文章摘要] 对于通信领域的某些中间模块,其主要功能是对收到的消息进行处理然后发送,在两个模块之间充当了一个"桥梁"的作用.因为消息的条数有多有少,这就对其性能提出了要求. 本文结合作者的实际项目经验,描写叙述了性能測试的整个过程,并对性能測试过程中的一些常见问题进行了简单的介绍. 1. 前言 在完毕项目新需求的编码之后,对代码进行自測以验证功能的正确性是在所难免的.一般说来,花在測试上面的时间要很多其他一些.通过对自己所编敲代码的具体測试,开发者

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

每次看PCI的文档.都一头雾水,本来就非常抽象.看英文就感觉更抽象.泛泛而谈的要求,看一次忘一次.仅仅好翻译成中文.没事就看看,知道指导思想. 例如以下,是翻译PCI的<Modular Derived Test Requirements>的OP部分,这样直接翻译不知道是不是有侵权的问题(⊙﹏⊙)b 正文開始: DTR 模块3: 开放协议的需求 F-发现与定义协议和接口 DTR F1:接口的定义 设备所用到的公开的协议和接口.应该清晰地写在<开放协议模块-协议声明表格>(原文摘录:O

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

近期一直在学习RYU控制器,在使用的过程中,发现有下面几方面的长处:RYU控制器全然使用Python语言编写,在理解起来和上手速度上是挺快的:RYU控制器的总体架构清晰明了,在日后有时间我会整理一个关于RYU控制器的架构性的文章供大家參考:RYU控制器本身是一个功能强大的网络实验平台,能够和openstack非常好的兼容,对于openstack我不是非常熟悉,就知道通过openstack能够实现的数据中心云计算方面的功能:RYU控制器本身自带非常多编写好的APP,通过对这些APP的熟悉,能够非常

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

近期调试用到了安信可的ESP-01模块,最终打通了编译下载调试的整个通道,有一些细节须要记录,方便兴许的开发工作. 转载请注明:http://blog.csdn.net/sadshen/article/details/46776663 一.硬件准备 安信可的相关资料没有一个非常好的收集.费了非常大劲才从QQ群中下载到了測试板电路图,最终搞明确了拨码开关的含义.另外ESP-01的flash大小也没地方标明.问了QQ群里的人才知道手头的这个黑色版本号模块的flash大小是1M. 通过对电路的了解,大

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

星云測试-给你的Android应用做个深度体检   星云測试- Android应用深度体检专业平台 星云在线云測试(简称星云測试www.teststars.cc)是全球第一个公布并商用的数字化精准软件測试平台,与其它软件云測试平台相比.它更关注软件最核心的功能測试.简单的说,我们把软件视同一个生命,为它做全面的X光扫描,而后给出具体体检报告.每个报告数据后面均有精准.无损.可追溯的数据为依托,协助您高速推断软件是否健康.还是须要立马切除病灶. 星云測试使软件測试从过度依赖人工记录.验证,转换为机