HoloLens 2 滞后 TCP 客户端

问题描述

我正在尝试在我的 PC(python 服务器)和 HoloLens 2(客户端)之间创建一个 TCP 客户端/服务器程序。 HoloLens 连接到我电脑的热点 wifi。 python 服务器每 10 毫秒发送一条消息。在 HoloLens 2 端,我创建了一个 Task,它读取 python 发送的消息,将其保存在一个变量 (this.message) 中,然后打印出来。 Unity 的 Update 函数读取这个变量并打印出来。

客户端/服务器交换工作,但我得到一个奇怪的行为。 Unity 的 Update 函数有时会“阻塞”在同一个值上,当我在 Debug 模式下运行程序时看到输出

...
[SocketManager] START
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\Windows.Networking.dll'. 
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\FirewallAPI.dll'. 
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\fwbase.dll'. 
[SocketManager] client is trying to connect...
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\wininet.dll'. 
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\ondemandConnRouteHelper.dll'. 
'FirstProject.exe' (Win32): Loaded 'C:\Windows\system32\winnsi.dll'. 
[UPDATE] msg =,Time.deltaTime = 0,1073922
[SocketManager] client connected
[SocketManager] client sent the request : {0}Hello im the client C#
[SocketManager] T_reader is running
XRTextureManager::RequestCreateTexture
XRTextureManager::SetupRenderTextureFromXRRequest (id: 3 col: 00000267034FEF00 d: 0000000000000000)
RenderTexture::Create (id: 3)
IVRDeviceCallback_CreateEyeTextureResources 00000267034FEF00
[UPDATE] msg =,1073922
XRTextureManager::RequestCreateTexture
XRTextureManager::SetupRenderTextureFromXRRequest (id: 4 col: 00000267034FC480 d: 0000000000000000)
RenderTexture::Create (id: 4)
IVRDeviceCallback_CreateEyeTextureResources 00000267034FC480
[UPDATE] msg =,02
[UPDATE] msg =,03958073
[UPDATE] msg =,03671953
[UPDATE] msg =,03492932
[UPDATE] msg =,02845328
[UPDATE] msg =,03497542
[UPDATE] msg =,03212385
[UPDATE] msg =,0251049
[UPDATE] msg =,02491526
[UPDATE] msg =,03330422
[UPDATE] msg =,0285
[UPDATE] msg =,02918776
[UPDATE] msg =,02730698
[UPDATE] msg =,03449469
[UPDATE] msg =,03006713
[UPDATE] msg =,0291826
[UPDATE] msg =,02470792
[UPDATE] msg =,02907375
[UPDATE] msg =,02599656
[UPDATE] msg =,02478719
[UPDATE] msg =,03431208
[UPDATE] msg =,03297156
[UPDATE] msg =,02986411
[UPDATE] msg =,02642448
[UPDATE] msg =,03080849
[UPDATE] msg =,02840208
[UPDATE] msg =,02652443
[UPDATE] msg =,02750953
[UPDATE] msg =,03031938
[UPDATE] msg =,03385823
[UPDATE] msg =,02940964
[UPDATE] msg =,02750875
[UPDATE] msg =,02844969
[UPDATE] msg =,03048833
[UPDATE] msg =,02839474
[UPDATE] msg =,02827193
[UPDATE] msg =,02816344
[Task_reader] msg : 1
[UPDATE] msg = 1,03298781
[UPDATE] msg = 1,02705432
[Task_reader] msg : 2
[Task_reader] msg : 3
[Task_reader] msg : 4
[Task_reader] msg : 5
[Task_reader] msg : 6
[Task_reader] msg : 7
[Task_reader] msg : 8
[Task_reader] msg : 9
[Task_reader] msg : 10
[Task_reader] msg : 11
[Task_reader] msg : 12
[Task_reader] msg : 13
[Task_reader] msg : 14
[Task_reader] msg : 15
[Task_reader] msg : 16
[Task_reader] msg : 17
[UPDATE] msg = 17,02866193
[UPDATE] msg = 17,03379974
[UPDATE] msg = 17,02900052
[UPDATE] msg = 17,02356422
[Task_reader] msg : 18
[Task_reader] msg : 19
[Task_reader] msg : 20
[Task_reader] msg : 21
[Task_reader] msg : 22
[Task_reader] msg : 23
[Task_reader] msg : 24
[Task_reader] msg : 25
[UPDATE] msg = 25,02759542
[UPDATE] msg = 25,02763198
[UPDATE] msg = 25,03485104
[Task_reader] msg : 26
[Task_reader] msg : 27
[Task_reader] msg : 28
[UPDATE] msg = 28,02482302
[UPDATE] msg = 28,02505719
[UPDATE] msg = 28,03322365
[UPDATE] msg = 28,03319969
[Task_reader] msg : 29
[Task_reader] msg : 30
[Task_reader] msg : 31
[Task_reader] msg : 32
[Task_reader] msg : 33
[Task_reader] msg : 34
[Task_reader] msg : 35
[Task_reader] msg : 36
[Task_reader] msg : 37
[UPDATE] msg = 37,03174901
[UPDATE] msg = 37,02485729
[UPDATE] msg = 37,0258762
[Task_reader] msg : 38
[Task_reader] msg : 39
[Task_reader] msg : 40
[Task_reader] msg : 41
[Task_reader] msg : 42
[Task_reader] msg : 43
[Task_reader] msg : 44
[UPDATE] msg = 44,03462099
[UPDATE] msg = 44,03412453
[UPDATE] msg = 44,02704797
[UPDATE] msg = 44,02687141
[Task_reader] msg : 45
[Task_reader] msg : 46
[Task_reader] msg : 47
[Task_reader] msg : 48
[Task_reader] msg : 49
[Task_reader] msg : 50
[Task_reader] msg : 51
[UPDATE] msg = 51,0302938
[UPDATE] msg = 51,02958437
[UPDATE] msg = 51,02587297
[UPDATE] msg = 51,02565927
[Task_reader] msg : 52
[Task_reader] msg : 53
[Task_reader] msg : 54
[Task_reader] msg : 55
[Task_reader] msg : 56
[Task_reader] msg : 57
[UPDATE] msg = 57,03339917
[UPDATE] msg = 57,02547995
[UPDATE] msg = 57,02404177
[UPDATE] msg = 57,03442656
[UPDATE] msg = 57,03229193
[UPDATE] msg = 57,02541854
[UPDATE] msg = 57,02338453
...

Python 端:

sock = socket.socket(socket.AF_INET,socket.soCK_STREAM)
sock.bind(('',4444))
print("[SERVER TCP] Waiting connection ...")
sock.listen(1)
client_socket,address = sock.accept()
data = client_socket.recv(1024)
print(data)
print("[SERVER TCP] Connection done")

x = 0
while True:
   x = x + 1
   msg = f"{x}\n"
   client_socket.send(msg.encode())
   sys.stdout.write(msg)
   time.sleep(0.01)

HoloLens 2 侧: 我将以下 c# 脚本附加到我场景的一个空对象上。

#if WINDOWS_UWP
using System;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Globalization;
using System.Runtime.InteropServices.WindowsRuntime;

using UnityEngine;
using UnityEngine.XR.WSA;

using Windows.UI.Core;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;


public class SocketManager : MonoBehavIoUr
{
    string IP = "192.168.137.1";
    string PORT = "4444";
    Task T_reader;
    string message;
    readonly object _locker = new object();


    void Start()
    {
        Debug.Log("[SocketManager] START");
        this.StartClient();
    }

    private async void StartClient()
    {
        try
        {
            var streamSocket = new Windows.Networking.sockets.StreamSocket();
            var hostName = new Windows.Networking.HostName(IP);
            Debug.Log("[SocketManager] client is trying to connect...");

            await streamSocket.ConnectAsync(hostName,PORT);

            Debug.Log("[SocketManager] client connected");

            // Send hello to the server.
            string request = "Hello im the client C#";
            using (Stream outputStream = streamSocket.OutputStream.AsstreamForWrite())
            {
                using (var streamWriter = new StreamWriter(outputStream))
                {
                    await streamWriter.WriteLineAsync(request);
                    await streamWriter.FlushAsync();
                }
            }

            Debug.Log("[SocketManager] client sent the request : {0}" + request);
            
            T_reader = new Task(
            async () =>
            {
                using (Stream inputStream = streamSocket.InputStream.AsstreamForRead())
                {
                    using (StreamReader streamReader = new StreamReader(inputStream))
                    {
                        string tmp;
                        while (true)
                        {
                            tmp = streamReader.ReadLine();
                            lock (this._locker)
                            {
                                this.message = tmp;
                                Debug.Log("[T_reader] msg : " + this.message);
                            }
                        }
                    }
                }

            });
            T_reader.Start();

            Debug.Log("[SocketManager] T_reader is running");
        }
        catch (Exception ex)
        {
            Windows.Networking.sockets.socketErrorStatus webErrorStatus = Windows.Networking.sockets.socketError.GetStatus(ex.GetBaseException().HResult);
            Debug.Log("[SocketManager] error " + webErrorStatus.ToString());
        }
    }

    void Update()
    {
        lock (this._locker)
        {
            Debug.Log("[UPDATE] Msg = " + this.message + ",Time.deltaTime = " + Time.deltaTime);
        }
    }

    void QuitExpe()
    {
        T_reader.Wait();
        Debug.Log("[SocketManager] Stop listening done");
        Debug.Log("[SocketManager] Quit experimentation");
        UnityEngine.Application.Quit();
    }
}
#else 
using UnityEngine;
public class SocketManager : MonoBehavIoUr
{
}
#endif

知道如何解决这个问题吗?谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)