我正在用 Eclipse 用 Java 编写一个小应用程序,以便像鼠标一样使用我的 Leap Motion 设备。当从 Eclipse 运行时,一切都在工作,速度快,响应迅速,没有死机、崩溃或其他情况。
我将 Java 应用程序导出到 Runnable JAR
,我用javaw -jar LeapMotionController.jar
一切都很慢,在 XML 中读取和写入配置,建立到本地 Web 套接字服务的连接。
该应用程序有 3 个类,
LeapMotion 类是主要的应用程序,从这里我启动 Systray 类,然后在我启动用于初始化连接的运行命令之后。
SysTray.chgIcon("warn");
container = ContainerProvider.getWebSocketContainer();
container.setDefaultMaxBinaryMessageBufferSize(1024);
container.setDefaultMaxTextMessageBufferSize(1024);
session=container.connectToServer(LeapMotion.class, URI.create("ws://localhost:6437/v7.json"));
session.setMaxBinaryMessageBufferSize(1024);
session.setMaxTextMessageBufferSize(1024);
wait4TerminateSignal();
wait4TerminateSignal 是,
private static void wait4TerminateSignal() {
synchronized(waitLock) {
try {
for (;;) {
waitLock.wait();
if(session==null) {
waitLock.notify();
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在读取设置变量的 XML 文件后,系统托盘将在 1 秒后显示。文档加载在变量中以供重用(限制直接文件的读取)。5-10 秒后,我收到 websocket 的第一个答案,包含有关设备版本信息的握手....
之后,所有消息都排队并制作了一个大缓冲区,我尝试了两个值(10 和 1024),一次是有帮助的,之后非常非常慢。
在任务管理器中,我使用 120MB 内存(32GB),cpu 从未超过 1.5%(我有 8 个内核,3.2GHz 下的 16 个线程)。javaw 进程使用了 50-60 个线程。
我还为掉落活动添加了限制。使用增量,当达到该值时,处理消息,增量重置为 0。
你需要了解 Leap Motion Web Socket;- 平均每秒发送 110 条消息,我无法控制数量 - 无需发送消息即可获得回复 - 仅以 Json 格式输出
我已经测试和搜索过;- 如何优化 Java(没有找到真正的帮助) - 使用 WebSocket 的另一种方式,其他需要一条消息来获得回复(聊天) - 使用 Elevator.exe(谷歌它)使 Admin 中的 Java 正确,而不是进行更改 -手动增加进程优先级(小上面,和实时),它没有改变 - 没有找到有关缓冲区的信息,代码是在https://dzone.com/articles/sample-java-web- 上找到的套接字客户端(代码的第二部分)
如果我有遗漏信息或想了解更多详细信息,请给我留言。
我正在寻求提高性能。根据我从设备接收到的消息和数据量,我可以支持队列丢弃或类似的解决方案。
预先感谢您的帮助。
(抱歉我的英语不好)
好的,我终于找到了问题所在,这就是 Java Runtime。
从 Java 1.8 开始,包含更多的安全性。这会导致许多问题;文件读/写和 tcp 连接。许多用户报告比 1.7 慢 4 到 10 倍。
我已经使用 Java 1.7 安装并运行了我的应用程序,运行速度非常快并且没有任何错误。
对于我的项目,我将 Java 1.7 与 .jar 打包以使用正确的 Java 版本发布它。
新的不一定更好:P
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句