其中使用了该项目.NET的Async Socket代码。后来不知道什么时候这个奇怪的错误的出现:

CompareBaseObjectsInternal can only be called from the main thread.

Constructors and field initializers will be executed from the loading thread when loading a scene.

Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.

怪异是由于报错并没有影响程序运行,而是正确地接收了server返回的信息,而且通过回调正确显示出来。说明回调被运行了。可是从回调再调用一个解析器却一直不运行。是不是上面的错误导致的?

搜索百度CompareBaseObjectsInternal关键词仅仅有8个结果,http://blog.csdn.net/jixuguo/article/details/26693977相对有些意义,可是博文为转载。后来看到原文,大致的意思是假设从子线程调用主线程的callback。须要给回调加一个interface。

这个和我的情况不太一样,參考意义不大。

然后google。非常不幸古大哥一直载入载入。

。。

于是去yahoo,竟然还没有抽筋。

最前面搜索出来的几篇文章就是unity论坛上的。大致看出一些眉目。

http://forum.unity3d.com/threads/comparebaseobjectsinternal-error.184069/#post-1258700

http://forum.unity3d.com/threads/comparebaseobjectsinternal-can-only-be-called-from-the-main-thread-annoying.195902/http://forum.unity3d.com/threads/comparebaseobjectsinternal-can-only-be-called-from-the-main-thread-annoying.195902/

http://community.kii.com/t/error-comparebaseobjectsinternal-can-only-be-called-from-the-main-thread/378#!

http://answers.unity3d.com/questions/704284/comparebaseobjectsinternal-can-only-be-called-from-1.html

分析出来我的问题大概是在主线程里面注冊了回调,

//注冊全部事件的响应代码

        NetEventManager.GetInstance().netMessageReceived_event += OnNetMessageReceived;

        NetEventManager.GetInstance().gateServerConnected_event += OnGateServerConnected;

        NetEventManager.GetInstance().errorMessageOccured_event += OnErrorReceived;

然后socketclient对象是异步的,所以做了多线程处理,当socketclient接收到消息时,回调了主线程的函数(继承自monobehaviour),这时候就导致了报错。上面第一篇unity论坛博文解释得比較清楚,大概就是unity对于API调用主线程做了限制:

“Unity chose to limit API calls to main-thread, to make a simple and solid threading model that everyone can understand and use.”

依据这个解释,我把上面的代码凝视掉。程序就不报错了。

预计这些事件响应代码要放到非monobehavior的类里面去。就能够避免上面说的线程安全问题。

因为我感兴趣的多线程编程的基本或白色,上面的解释是正确的、有没有更好的解决办法。也希望你有种。

版权声明:本文博主原创文章。博客,未经同意不得转载。

Unity3d报告奇怪的错误CompareBaseObjectsInternal can only be called from the main thread.的更多相关文章

  1. Error: CompareBaseObjectsInternal can only be called from the main thread

    Posted: 01:39 PM 06-17-2013 hi, we're working on a project where we need to do some calculations on ...

  2. could not build module 'XXXXXXXX'或者error: expected identifier or '(' 。一堆奇怪的错误————错误根源

    一堆奇怪的错误:1⃣️could not build module 'XXXXXXXX' 2⃣️error: expected identifier or '(' 3⃣️EDIT Setting Pr ...

  3. Unity3d导入工程出现错误“Creating unique file”的解决方法

    Unity3d导入工程出现错误“Creating unique file:creating file Temp/tempFile failed.Please ensure there is enoug ...

  4. .net操作oracle,一定要用管理员身份运行 visual studio 啊,切记切记,免得报奇怪的错误。

    .net操作oracle,一定要用管理员身份运行 visual studio 啊,切记切记,免得报奇怪的错误.

  5. Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出

    Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出 package com.test; import org.apach ...

  6. 请教前辈:关于JS的一个奇怪的错误,不知是解析顺序造成的,还是什么原因。。

    各位前辈好,如题,不知道是HTML解析顺序造成的,还是JS预编译的结果(见注释). 烦请各位前辈进行指导. <!DOCTYPE html> <html> <head> ...

  7. celery 错误相关:Monkey-patching not on the main thread; threading.main_thread().join() will hang from a greenlet

    /Users/wangpingyang/.pyenv/versions/3.7.2/lib/python3.7/site-packages/httprunner/__init__.py:5: Monk ...

  8. [原]Unity3d中奇怪的编译错误

    整理项目,重新build时出现一些问题,这些代码在原项目中都是可以运行的. 错误信息如下: Assets/XXXXX.cs(79,35): error CS0103: The name `NNNNNN ...

  9. Java错误:很奇怪的错误。。。

    刚刚调试java web中出现了一个很奇怪的现象,前端有一个页面通过ajax调用后台的servlet,当我把后台的servlet代码修改后(将返回值由a修改为b),前端页面仍然获取的是a.调试跟踪se ...

随机推荐

  1. 关于Altium Designer中的搜索图纸上的元件

    一开始以为Altium Designer搜索完成的pcb上的元件用ctrl+f 但是错了,应该是j,c

  2. Html animation by css(Sequence Js Tutorial)

    In sequence js,the javascript make load css definitation and make animation. 1.Start state #sequence ...

  3. 【Codeforces Round #185 (Div. 2) C】The Closest Pair

    [链接] 链接 [题意] 让你构造n个点,去hack一种求最近点对的算法. [题解] 让x相同. 那么那个剪枝就不会起作用了. [错的次数] 在这里输入错的次数 [反思] 在这里输入反思 [代码] # ...

  4. freemarker导出图片到word

    1.word模版制作: 在word中添加图片,第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码: <w:binData w:name=" ...

  5. c#编程:给定一个正整数求出是几位数并逆序输出

    <span style="color:#FF0000;">第一步:把输入的数字转为字符串n.ToString() 第二步:求出字符串的长度即为正整数的位数 第三步:从后 ...

  6. js进阶课程ajax简介(ajax是浏览器来实现的)

    js进阶课程ajax简介(ajax是浏览器来实现的) 一.总结 1.ajax使用需要服务器支持,比如phpstudy 2.ajax是浏览器支持的功能:ajax有个核心对象XMLHttpRequest, ...

  7. linux下FAT32格式u盘只读的问题及解决方法

    以下是网上看到的解决办法:http://blog.csdn.net/heqiuya/article/details/7870554 其实是掉电保护,之前挂在的SD变成了制度文件,只需要将SD卡重新挂载 ...

  8. Struts(22)标签库具体解释

    要使用Struts2的标签,仅仅须要在JSP页面加入例如以下一行定义就可以: <%@ taglib prefix="s" uri="/struts-tags&quo ...

  9. CMakeListx.txt 编辑语法学习

    已hello.cpp为源文件,构建一个CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(hello) add_executable( ...

  10. 超级简单的Android Studio jni 实现(无需命令行)

    1.配置Anroid Studio(这步是关键) 使用[command+,] 打开Preferences,选择External Tools,点击加号框如下图: Paste_Image.png 点击+号 ...