分类 问题 下的文章

解决在VMware中Unity3D鼠标键盘响应异常问题

在VMware中装了Unity,写了个Demo,用到了First Person Controller。正常效果应该是第一人称视角,方向键控制行走,鼠标控制视角。

但运行后可以行走,视角无法移动。在我另一电脑(物理机)上没问题。

找到控制视角的脚本MouseLook.cs,里面

else if (axes == RotationAxes.MouseX)
{
    print(Input.GetAxis("Mouse X"));
    transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
}

打印结果:0

鼠标位移获取始终为0,怀疑是因为虚拟机里对鼠标的搜索和物理机不同。
找到VMware设置鼠标捕获方式,如下图:

- 阅读剩余部分 -

Flex mxmlc命令行编译错误: Java heap space解决方法

用Flex mxmlc命令行编译ActionScript工程时,报如下异常:

错误: Java heap space

原因是JVM heap内存空间不足,得改一下JVM参数

mxmlc命令行编译时JVM参数设置在 sdk/bin/jvm.config中,找到下面这行:

# Arguments to VM
java.args=-Xmx384m -Dsun.io.useCanonCaches=false

-Xmx384m表示JVM在编译时可用的最大内存数,把值改大一点,我这里改成-Xmx512m问题解决

Flash Loader加载完成不发送COMPLETE和ERROR事件的问题分析

Flash进行资源加载时常会“停住”,表现为加载进度卡在某个地方。跟踪发现Loader的progress为100%,但未发送Event.COMPLETE或IOErrorEvent.IO_ERROR等事件。

目前项目加载底层的队列依赖于Loader(URLLoader)的COMPLETE和ERROR事件,如果这两个事件不发送将导整套加载机制崩溃 - -,后续跟踪发现的确会如此。

问题展示

- 阅读剩余部分 -

timeout引发的Error #2044: 未处理的 securityError:。 text=Error #2048: 安全沙箱冲突:XX 不能从 XXX 加载数据

Error #2044: 未处理的 securityError:。 text=Error #2048: 安全沙箱冲突:c.dou.li:4000/demo.swf 不能从 s.dou.li:10000 加载数据。

Flash客户端demo.swf以Socket连接s.dou.li:10000地址时报如上异常,最被怀疑为s.dou.li未对demo.swf进行授权,未返回安全策略文件。

client尝试开启一个socket时,Flash会先启动一socket发送“<policy-file-request/>\0”串给server;

服务端收到后返回“<cross-domain-policy> <allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy> \0”内容表示对所以客户端授权;

以上都没问题,且直接复用上一项目的结构,经过查看大量资料后确定策略文件的请求、返回、内容没问题。

继续怀疑client的socket初始化参数有问题,查了一下Socket的timeout设置,次奥~~~~值为20,超时时间20ms啊,太低级了有木有。果断将timeout改为30000问题解决。

Flash Timer无故停止之谜

项目底层资源Cache超时使用了Timer驱动,每个资源到期Cache超时时会进行“释放”。后来发现有明显内存泄漏,排查出是因为Timer未进行导致。Oh,卖糕的~

ResourceManager为单例,Timer在工程启动时开始执行,为了方便说明见如下示例:

    public class Demo extends Sprite{
        private var _t:Timer;

        public function Demo(){
            _t = new Timer(500);
            _t.addEventListener(TimerEvent.TIMER, onTimer);
            _t.addEventListener(TimerEvent.TIMER_COMPLETE, onComplete);
            _t.start();
            trace("is running:" + _t.running);
        }

        private function onTimer(e:Event):void
        {
            trace("timer");
        }

        private function onComplete(e:Event):void
        {
            trace("complete");
        }
    }

输出:
is running:true

以上结果应该在意料之中?

但,只打印了这一行,onTimer()和onComplete()中的trace()未执行,问题就出在这。正常情况应该至少会每500ms打印一次“timer”。

若增加一个ENTER_FRAME监听,每帧输出Timer的状态,如下:

- 阅读剩余部分 -