Coder Social home page Coder Social logo

Comments (15)

Wuduo1234 avatar Wuduo1234 commented on August 15, 2024 1

我遇到同样的问题,debug后了一下发现了问题,修改后成功运行 原因:SendMessageAsyncTask.cpp发送客户端音频数据线程初始化时T->IsValidLowLevel()的问题

void FSendMessageAsyncTask::DoWork() {
	UClientGameInstance* T = Cast<UClientGameInstance>(Owner);
	while (!bStop) {
		FPlatformProcess::Sleep(0.5);
		if (T->IsValidLowLevel() || Socket == nullptr || T->StopSocket) {
			break;
		}

		if (T->ClientBuffData.Num() == 0) {
			continue;
		}

		BuffSize = 0;
#if NO_PROTOBUF
		if (T->BuffDataSize > 3) {
			if (T->ClientBuffData[T->BuffDataSize - 1] == '!' && T->ClientBuffData[T->BuffDataSize - 2] == '?') {

				Buff = T->ClientBuffData;
				BuffSize = Buff.Num();
			}
		}
#else
		if (T->BuffDataSize > 3) {
			if (T->ClientBuffData[T->BuffDataSize - 1] == '!' && T->ClientBuffData[T->BuffDataSize - 2] == '?') {

				T->ClientBuffData.RemoveAt(T->ClientBuffData.Num() - 1);
				T->ClientBuffData.RemoveAt(T->ClientBuffData.Num() - 1);

				Buff = T->ClientBuffData;
				BuffSize = Buff.Num();
			}
		}
#endif
		if (BuffSize != 0) {
			int32 NowSize;
			if (!Socket->Send(Buff.GetData(), BuffSize, NowSize)) {
				AsyncTask(ENamedThreads::GameThread, [=] {
					UE_LOG(SendMessageTaskLog, Error, TEXT("发送消息失败"));
					});
			}
			AsyncTask(ENamedThreads::GameThread, [=] {
				UE_LOG(SendMessageTaskLog, Error, TEXT("发送数据量:%d"), NowSize);
				GEngine->AddOnScreenDebugMessage(-1, 1000.f, FColor::Red, FString(TEXT("发送数据量:")) + FString::FromInt(NowSize));

				T->CloseBuff();
			});
		}
	}
}

debug发现IsValidLowLevel()方法返回了True,直接跳出了循环导致发送音频文件的线程中断,网上查了下该方法的作用:IsValidLowLevel是UE5引擎中的一个函数,它的作用是检查一个UObject对象是否有效。在UE5游戏中,UObject是所有实例对象的基类,因此这个函数可以用来检查任何类型的对象是否有效。如果使用无效的对象指针,很可能会导致游戏崩溃或出现其他异常情况。 此处返回True说明该对象有效,所以不应该break,反之对象无效时break,所以只需要将该方法值取反即可,如下:

if (!(T->IsValidLowLevel()) || Socket == nullptr || T->StopSocket) {
	break;
}

@kxylxx @QSWWLTN @zzz-xxx123 @Wuduo1234 希望可以帮到大家

66666 有用

from digitallife.

zzz-xxx123 avatar zzz-xxx123 commented on August 15, 2024

用网盘发布的打包版本是可以连上服务器的,而且可以正常发送。这个没打包的版本能连上但是没法发送音频数据,也没有错误日志

from digitallife.

KodakkuDeng avatar KodakkuDeng commented on August 15, 2024

用网盘发布的打包版本是可以连上服务器的,而且可以正常发送。这个没打包的版本能连上但是没法发送音频数据,也没有错误日志

是的,我也有同样的情况

from digitallife.

Wuduo1234 avatar Wuduo1234 commented on August 15, 2024

我运行运行文件,生成了一个TEST的wav就没下文了,连个报错都没给

from digitallife.

zzz-xxx123 avatar zzz-xxx123 commented on August 15, 2024

我运行运行文件,生成了一个TEST的wav就没下文了,连个报错都没给

是的我也是这样,估计是他代码还没上传完整

from digitallife.

QSWWLTN avatar QSWWLTN commented on August 15, 2024

执行这个SendWavFile是正常的,你可以开启游戏窗口后看有没有出现Log,最好把Log信息和服务器Log一起截图给我

from digitallife.

QSWWLTN avatar QSWWLTN commented on August 15, 2024

如果出现了发送数据的Log的话,请检查下服务器是否是正常连接上

from digitallife.

zzz-xxx123 avatar zzz-xxx123 commented on August 15, 2024

如果出现了发送数据的Log的话,请检查下服务器是否是正常连接上

是有连接服务器的,但是没有发送数据的log

from digitallife.

zzz-xxx123 avatar zzz-xxx123 commented on August 15, 2024

image
这个是连接成功,以及保存了Test.wav的日志,但是没有发送

from digitallife.

kxylxx avatar kxylxx commented on August 15, 2024

遇到同样问题,请教一下,这个问题解决了吗?

from digitallife.

Wuduo1234 avatar Wuduo1234 commented on August 15, 2024

image 这个是连接成功,以及保存了Test.wav的日志,但是没有发送

问一下 这个项目的 启动器要怎么和服务器端关联

from digitallife.

QSWWLTN avatar QSWWLTN commented on August 15, 2024

客户端有出现一个红色的发送数据量:xxxx之类的消息嘛?

from digitallife.

QSWWLTN avatar QSWWLTN commented on August 15, 2024

image 这个是连接成功,以及保存了Test.wav的日志,但是没有发送

问一下 这个项目的 启动器要怎么和服务器端关联

编辑器模式下可以手动输入IP地址和服务器端连接

from digitallife.

zzz-xxx123 avatar zzz-xxx123 commented on August 15, 2024

客户端有出现一个红色的发送数据量:xxxx之类的消息嘛?

没有。像上面说的,生成完Test.wav之后就什么都没发生了

from digitallife.

WANGRUI-ZB avatar WANGRUI-ZB commented on August 15, 2024

我遇到同样的问题,debug后了一下发现了问题,修改后成功运行
原因:SendMessageAsyncTask.cpp发送客户端音频数据线程初始化时T->IsValidLowLevel()的问题

void FSendMessageAsyncTask::DoWork() {
	UClientGameInstance* T = Cast<UClientGameInstance>(Owner);
	while (!bStop) {
		FPlatformProcess::Sleep(0.5);
		if (T->IsValidLowLevel() || Socket == nullptr || T->StopSocket) {
			break;
		}

		if (T->ClientBuffData.Num() == 0) {
			continue;
		}

		BuffSize = 0;
#if NO_PROTOBUF
		if (T->BuffDataSize > 3) {
			if (T->ClientBuffData[T->BuffDataSize - 1] == '!' && T->ClientBuffData[T->BuffDataSize - 2] == '?') {

				Buff = T->ClientBuffData;
				BuffSize = Buff.Num();
			}
		}
#else
		if (T->BuffDataSize > 3) {
			if (T->ClientBuffData[T->BuffDataSize - 1] == '!' && T->ClientBuffData[T->BuffDataSize - 2] == '?') {

				T->ClientBuffData.RemoveAt(T->ClientBuffData.Num() - 1);
				T->ClientBuffData.RemoveAt(T->ClientBuffData.Num() - 1);

				Buff = T->ClientBuffData;
				BuffSize = Buff.Num();
			}
		}
#endif
		if (BuffSize != 0) {
			int32 NowSize;
			if (!Socket->Send(Buff.GetData(), BuffSize, NowSize)) {
				AsyncTask(ENamedThreads::GameThread, [=] {
					UE_LOG(SendMessageTaskLog, Error, TEXT("发送消息失败"));
					});
			}
			AsyncTask(ENamedThreads::GameThread, [=] {
				UE_LOG(SendMessageTaskLog, Error, TEXT("发送数据量:%d"), NowSize);
				GEngine->AddOnScreenDebugMessage(-1, 1000.f, FColor::Red, FString(TEXT("发送数据量:")) + FString::FromInt(NowSize));

				T->CloseBuff();
			});
		}
	}
}

debug发现IsValidLowLevel()方法返回了True,直接跳出了循环导致发送音频文件的线程中断,网上查了下该方法的作用:IsValidLowLevel是UE5引擎中的一个函数,它的作用是检查一个UObject对象是否有效。在UE5游戏中,UObject是所有实例对象的基类,因此这个函数可以用来检查任何类型的对象是否有效。如果使用无效的对象指针,很可能会导致游戏崩溃或出现其他异常情况。
此处返回True说明该对象有效,所以不应该break,反之对象无效时break,所以只需要将该方法值取反即可,如下:

if (!(T->IsValidLowLevel()) || Socket == nullptr || T->StopSocket) {
	break;
}

@kxylxx @QSWWLTN @zzz-xxx123 @Wuduo1234 希望可以帮到大家

from digitallife.

Related Issues (18)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.