我正在用Eclipse用Java编写一个小应用程序,以便像鼠标一样使用我的Leap Motion设备。当从Eclipse运行时快速,响应迅速且不会冻结,崩溃或其他情况时,一切都正常工作。
我将Java应用程序导出到可运行的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秒钟后显示Systray。该文档已加载到变量中以供重用(限制对直接文件的读取)。 5到10秒钟后,我收到了websocket的第一个答案,即有关设备版本信息的握手。...
之后,所有消息都排队并做一个大缓冲区,我尝试了两个值(10和1024),一次被帮助,之后走得很慢。
在任务管理器中,我使用120MB内存(32GB),CPU永远不会超过1.5%(我有8个内核,在3.2GHz时有16个线程)。 javaw进程使用了50-60个线程。
我还增加了放置活动的限制。是使用增量,当达到该值时,处理消息,并将增量重置为0。
您需要了解Leap Motion Web套接字; -平均每秒110条消息,我无法控制数量 -无需发送消息即可获得回复 -仅以JSon格式输出
我已经测试并搜索过; -如何优化Java(找不到真正的帮助) -使用WebSocket的另一种方式,其他需要消息以获取答复(聊天) -使用Elevator.exe(google it)在管理员权限中设置Java,而不进行更改 -手动提高流程优先级(略高于实时),无需更改 -尚未找到有关缓冲区的信息,并且代码是在https://dzone.com/articles/sample-java-web-socket-client(代码的第二部分)上找到的代码
如果我错过信息或需要更多详细信息,请给我评论。
我希望提高性能。通过我在设备上收到的消息和数据量,我可以支持队列丢弃或类似的解决方案。
提前感谢您的帮助。
(对不起我的英语不好)
答案 0 :(得分:0)
好的,我终于找到了问题,这是Java Runtime。
自Java 1.8开始,它包含更多的安全性。这引起很多问题;文件读/写和tcp连接。许多用户报告的速度是1.7的4到10倍。
我已经使用Java 1.7安装并运行了我的应用程序,运行速度非常快,并且没有任何错误。
对于我的项目,我将Java 1.7与.jar打包在一起,以使用正确的Java版本发布它。
更新不一定更好:P