Godot 4 源码分析 - 增加管道通信

Godot 4 源码分析 - 初探 准备研究GoDot 4源码。 阅读详情

学习研究Godot 4,很爽,虽然很庞杂,但相对于自己的水平来说,很强大,尤其是vulkan这块直接打包可用,省得自己从头琢磨。

一点一点地消化、优化与完善,最终才能成为自己的。

这段时间就在Godot的基础上,增加管道通信,实现Godot与本机已有程序进行通信,以备后续的无缝集成整合。

其实,Godot支持各种网络通信,支持UDP、TCP等。为什么非要实现管道通信,本质上还是想看看改造效果。最终目标是实现Godot软件与自己的DrGraph软件的管道通信

DrGraph端处理

为实现管道通信,根据Windows命名管道通信原理进行相应模块化实现。

class TDllData {
	void __fastcall CheckType(unsigned char destType);
public:
	__fastcall TDllData(unsigned char t = DRGRAPH_DLL_TYPE_NULL);
	__fastcall TDllData(const TDllData& copy);
	__fastcall ~TDllData();

	bool __fastcall IsEof() { return type == DRGRAPH_DLL_TYPE_NULL; };
	UnicodeString __fastcall GetHint();
	unsigned char type;
	union {
		bool 			value_bool;
		char 			value_char;
		unsigned char 	value_uchar;
		wchar_t 		value_wchar;
		short 			value_short;
		unsigned short 	value_ushort;
		int 			value_int;
		unsigned int 	value_uint;
		long 			value_long;
		unsigned long 	value_ulong;
		double 			value_double;
		long long		value_longlong;
		unsigned long long 	value_ulonglong;
	} value ;
	UnicodeString value_string;

	TDllData * __fastcall operator = (const TDllData & equal);
	operator bool();
	operator char();
	operator unsigned char();
	operator wchar_t();
	operator short();
	operator unsigned short();
	operator int();
	operator unsigned int();
	operator long();
	operator unsigned long();
	operator double();
	operator long long();
	operator unsigned long long();
	operator UnicodeString();
};

class TDllStream : public CbwStream {
	typedef CbwStream inherited;
	TMemoryStream * FMemoryStream;
	DRGRAPH_PROPERTY(bool, Finished);
	DRGRAPH_PROPERTY(bool, WCharFlag);
	DRGRAPH_PROPERTY(int, WCharSize);
public:
	__fastcall TDllStream();
	__fastcall TDllStream(BYTE * datas, int len);
	__fastcall TDllStream(wchar_t * datas, int len);
	__fastcall ~TDllStream();

	void __fastcall Finish();
	TDllData __fastcall Next();
	void __fastcall Reset();
	UnicodeString __fastcall GetHint(UnicodeString desc = L"");
	int __fastcall NextFunType();
	__fastcall operator BYTE *();
	__fastcall operator wchar_t *();

	virtual bool __fastcall writeBytes(const void * p, int len) {
		CbwStream::writeBytes(p, len);
		FFinished = false;
	}

//#ifdef DRGRAPH_USE_OPENCV
//			friend TDllStream & operator << (TDllStream & cofs, cv::Mat& mat);
//			friend TDllStream & operator >> (TDllStream & cifs, cv::Mat& mat);
//#endif

	friend TDllStream & operator << (TDllStream & cofs, NStreamIOControl ctrl) {
		if(ctrl == ioReset)
			cofs.Reset();
		if(ctrl == ioRewind)
			cofs.Rewind();
		if(ctrl == ioFinish)
			cofs.Finish();
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, bool value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_BOOL);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %s", DllType2String(dlltype), TTypeConvert::Bool2String(value));
		unsigned char b = value ? 1 : 0;
		cofs.writeBytes(&b, sizeof(unsigned char));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, char value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_CHAR);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %d[0X%02X, %c]", DllType2String(dlltype), int(value), value, value);
		cofs.writeBytes(&value, sizeof(char));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, unsigned char value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_UCHAR);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %d[0X%02X, %c]", DllType2String(dlltype), int(value), value, value);
		cofs.writeBytes(&value, sizeof(unsigned char));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, wchar_t value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_WCHAR);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %s", DllType2String(dlltype), UnicodeString(value));
		cofs.writeBytes(&value, sizeof(wchar_t));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, short value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_SHORT);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %d", DllType2String(dlltype), int(value));
		cofs.writeBytes(&value, sizeof(short));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, unsigned short value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_USHORT);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %d", DllType2String(dlltype), int(value));
		cofs.writeBytes(&value, sizeof(unsigned short));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, int value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_INT);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %d", DllType2String(dlltype), int(value));
		cofs.writeBytes(&value, sizeof(int));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, unsigned int value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_UINT);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %d", DllType2String(dlltype), int(value));
		cofs.writeBytes(&value, sizeof(unsigned int));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, long value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_LONG);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %ld", DllType2String(dlltype), value);
		cofs.writeBytes(&value, sizeof(long));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, unsigned long value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_ULONG);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %lu", DllType2String(dlltype), value);
		cofs.writeBytes(&value, sizeof(unsigned long));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, long long value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_LONGLONG);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %lld", DllType2String(dlltype), value);
		cofs.writeBytes(&value, sizeof(long long));
		return cofs;
	}
//
	friend TDllStream & operator << (TDllStream & cofs, unsigned long long value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_ULONGLONG);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %llu", DllType2String(dlltype), value);
		cofs.writeBytes(&value, sizeof(unsigned long long));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, float value) {
		double d = value;
		cofs << d;
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, double value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_DOUBLE);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %s", DllType2String(dlltype), TTypeConvert::Double2String(value, 3));
		cofs.writeBytes(&value, sizeof(double));
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, char*str) {
		UnicodeString string = str;
		cofs << string;
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, wchar_t*str) {
		UnicodeString string = str;
		cofs << string;
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, UnicodeString value) {
		DLL_WRITE(DRGRAPH_DLL_TYPE_STRING);
		if(cbw_debug_flag)
			THelper::Logi(L"写入[%s]类型 > %s", DllType2String(dlltype), value);
		int iTextLen = WideCharToMultiByte(CP_UTF8, 0, value.w_str(), -1, NULL, 0, NULL, NULL);
		char * chBuffer = new char[iTextLen + 1];
		WideCharToMultiByte(CP_UTF8, 0, value.w_str(), -1, chBuffer, iTextLen, NULL, NULL);
		cofs.writeBytes(&iTextLen, sizeof(int));
		cofs.writeBytes(chBuffer, iTextLen);
		delete[]chBuffer;
		return cofs;
	}

	friend TDllStream & operator >> (TDllStream & cifs, UnicodeString & q) {
		int length;
		cifs >> length;
		char * chBuffer = new char[length + 1];
		cifs.readBytes(chBuffer, length);
		chBuffer[length] = '\0';
		if(cifs.WCharFlag == false) {
			int wLength = length + 1;
			wchar_t *wcBuffer = new wchar_t[wLength];
			MultiByteToWideChar(CP_UTF8, 0, chBuffer, wLength, wcBuffer, wLength);
			wcBuffer[length] = L'\0';
			q = UnicodeString(wcBuffer);
			delete wcBuffer;
		} else
			q = UnicodeString(chBuffer);
		delete chBuffer;
		return cifs;
	}

	friend TDllStream & operator << (TDllStream & cofs, Variant& data) {
		switch(data.Type()) {
		case varBoolean: 	cofs << bool(data);				break;
		case varEmpty:
		case varNull: 		cofs << 0;						break;
		case varSingle:     cofs << float(data);			break;
		case varDouble:     cofs << double(data);			break;
		case varString:
		case varUString:	cofs << (wchar_t *)(data);	break;
		case varSmallint:
		case varInteger:
		case varWord:  		cofs << int(data);				break;
		case varInt64:		cofs << __int64(data);			break;
		case varUInt64:		cofs << (unsigned __int64)(data);	break;
		case varByte:		cofs << (unsigned char)(data);	break;
		case 0x10:			cofs << short(data);			break;     		// varShortInt
		case varLongWord:	cofs << long(data);				break;
		default:  			cofs << (wchar_t *)(data);	break;
		}
		return cofs;
	}

	friend TDllStream & operator << (TDllStream & cofs, TDllData & data) {
		if(data.type == DRGRAPH_DLL_TYPE_STRING)
			cofs << data.value_string;
		else if(data.type == DRGRAPH_DLL_TYPE_INT)
			cofs << data.value.value_int;
		else if(data.type == DRGRAPH_DLL_TYPE_DOUBLE)
			cofs << data.value.value_double;
		else if(data.type == DRGRAPH_DLL_TYPE_BOOL)
			cofs << data.value.value_bool;
		else if(data.type == DRGRAPH_DLL_TYPE_UCHAR)
			cofs << data.value.value_uchar;
		else if(data.type == DRGRAPH_DLL_TYPE_CHAR)
			cofs << data.value.value_char;
		else if(data.type == DRGRAPH_DLL_TYPE_WCHAR)
			cofs << data.value.value_wchar;
		else if(data.type == DRGRAPH_DLL_TYPE_SHORT)
			cofs << data.value.value_short;
		else if(data.type == DRGRAPH_DLL_TYPE_LONG)
			cofs << data.value.value_long;
		else if(data.type == DRGRAPH_DLL_TYPE_USHORT)
			cofs << data.value.value_ushort;
		else if(data.type == DRGRAPH_DLL_TYPE_UINT)
			cofs << data.value.value_uint;
		else if(data.type == DRGRAPH_DLL_TYPE_ULONG)
			cofs << data.value.value_ulong;
		else if(data.type == DRGRAPH_DLL_TYPE_LONGLONG)
			cofs << data.value.value_longlong;
		else if(data.type == DRGRAPH_DLL_TYPE_ULONGLONG)
			cofs << data.value.value_ulonglong;
		else if(data.type == DRGRAPH_DLL_TYPE_NULL)
			cofs.Finish();
		return cofs;
	}
	///////////////////////**************************************************************

	friend TDllStream & operator >> (TDllStream & cifs, TDllData & data) {
		if(data.type == DRGRAPH_DLL_TYPE_STRING)
			cifs >> data.value_string;
		else if(data.type == DRGRAPH_DLL_TYPE_INT)
			cifs.readBytes(&data.value, sizeof(int));
		else if(data.type == DRGRAPH_DLL_TYPE_DOUBLE)
			cifs.readBytes(&data.value, sizeof(double));
		else if(data.type == DRGRAPH_DLL_TYPE_BOOL)
			cifs.readBytes(&data.value, sizeof(unsigned char));
		else if(data.type == DRGRAPH_DLL_TYPE_UCHAR)
			cifs.readBytes(&data.value, sizeof(unsigned char));
		else if(data.type == DRGRAPH_DLL_TYPE_CHAR)
			cifs.readBytes(&data.value, sizeof(char));
		else if(data.type == DRGRAPH_DLL_TYPE_WCHAR)
			cifs.readBytes(&data.value, sizeof(wchar_t));
		else if(data.type == DRGRAPH_DLL_TYPE_SHORT)
			cifs.readBytes(&data.value, sizeof(short));
		else if(data.type == DRGRAPH_DLL_TYPE_LONG)
			cifs.readBytes(&data.value, sizeof(long));
		else if(data.type == DRGRAPH_DLL_TYPE_USHORT)
			cifs.readBytes(&data.value, sizeof(unsigned short));
		else if(data.type == DRGRAPH_DLL_TYPE_UINT)
			cifs.readBytes(&data.value, sizeof(unsigned int));
		else if(data.type == DRGRAPH_DLL_TYPE_ULONG)
			cifs.readBytes(&data.value, sizeof(unsigned long));
		else if(data.type == DRGRAPH_DLL_TYPE_LONGLONG)
			cifs.readBytes(&data.value, sizeof(long long));
		else if(data.type == DRGRAPH_DLL_TYPE_ULONG)
			cifs.readBytes(&data.value, sizeof(unsigned long long));
		else if(data.type == DRGRAPH_DLL_TYPE_NULL)
			return cifs;
		return cifs;
	}

	friend TDllStream & operator << (TDllStream & cofs, TPoint point) {
		cofs << point.x;
		cofs << point.y;
		return cofs;
	}

	friend TDllStream & operator >> (TDllStream & cifs, TPoint& point) {
		cifs >> point.x;
		cifs >> point.y;
		return cifs;
	}

	friend TDllStream & operator << (TDllStream & cofs, TRect rect) {
		cofs << rect.left;
		cofs << rect.top;
		cofs << rect.right;
		cofs << rect.bottom;
		return cofs;
	}

	friend TDllStream & operator >> (TDllStream & cifs, TRect& rect) {
		cifs >> rect.left;
		cifs >> rect.top;
		cifs >> rect.right;
		cifs >> rect.bottom;
		return cifs;
	}
};

#define PIPE_CONNECTING_STATE 0
#define PIPE_READING_STATE 1
#define PIPE_WRITING_STATE 2
#define PIPE_INSTANCES 4
#define PIPE_TIMEOUT 5000
#define PIPE_BUFSIZE 4096

#define DRSTREAM_FUNCTION_NONE 0
#define DRSTREAM_FUNCTION_SET 1
#define DRSTREAM_FUNCTION_GET 2
#define DRSTREAM_FUNCTION_STATUS 3

typedef struct {
   OVERLAPPED oOverlap;
   HANDLE hPipeInst;
   TCHAR wRequestBuffer[PIPE_BUFSIZE];
   DWORD cbRead;
   char wResponseBuffer[PIPE_BUFSIZE];
   DWORD cbWrite;
   DWORD dwState;
   BOOL fPendingIO;
} PIPEINST, *LPPIPEINST;

class TPipeStream : public TDllStream {
	class TPipeThread : public TThread {
		friend class TPipeStream;
		PIPEINST Pipe[PIPE_INSTANCES];
		HANDLE hEvents[PIPE_INSTANCES];
	private:
		HANDLE hPipe;
		TPipeStream * FOwnerStream;
		void __fastcall Execute();
	public:
		__fastcall TPipeThread(TPipeStream * stream);
		__fastcall ~TPipeThread();

		void __fastcall DisconnectAndReconnect(DWORD);
		bool __fastcall ConnectToNewClient(HANDLE, LPOVERLAPPED);
	
Godot 4 源码分析 - 碰撞 在真实场景中,A、B都占据相应的空间位置(3D)或平面位置(2D),在运行过程中,A、B至少有一个能动,它们的相对位置可能会变化,在某个时刻会有交叠。具体而言,一个节点的Layer值必须包含在另一个节点的Mask值中,同时另一个节点的Layer值必须包含在该节点的Mask值中。Layer与Mask应该都是32位整数,对象A有Layer与Mask属性,对象B也有Layer与Mask属性。对于敌人对象之间,可将它们分配到相同的碰撞图层并设置相应的碰撞掩码,以确保它们不会互相碰撞。果然,与猜测的一致。 阅读详情

相关推荐

Godot 4 源码分析 - 代码自动补全流程

对于Script编辑器而言,code_complete_func指向ScriptTextEditor::_code_complete_scripts,本质上是调用GDScriptLanguage::complete_code函数。1) CodeTextEditor中创建时钟code_complete_timer,其timeout超时信号绑定_code_complete_timer_timeout函数。而_line_col_changed函数(绑定caret_changed事件)会停止时钟。

drgraph的博客 1633

Godot 4 源码分析 - 动态导入图片文件

用Godot 4尝试编一个电子书软件,初步效果已经出来,并且通过管道通信接口可以获取、设置属性、调用函数,貌似能处理各种事宜了。其实不然,外因通过内因起作用,如果没把里面搞明白,功能没有开放出来,则有些需求就不能实现。比如,现在想动态加载新的图书,这就是一个实际需求。如果每一本电子书,都需要导出一次,那这个软件就太不通用了。直接加载另一图片,结果不成功这就得研究一下了。

drgraph的博客 2761

godot引擎c++源码深度解析系列一

许久没有使用c++开发过项目了,如果按照此时单位的入职要求,必须拥有项目经验的话,那我就得回到十多年前,大学的时代,哪个时候真好,电脑没有这么普及,手机没有这么智能,网络没有这么发达,信息传播没有此时的快,哪个年代,5毛钱一份的报纸或许真的很好。入职it这个行业以来,想必很多的同行,前辈们,都知道,软件开发唯一的要求,实践能力必须很强,不亲自实操,你永远不知道代码里有多少个坑,同样的一段代码,在A电脑能运行,在B电脑就运行不了,这就是环境对此的影响。

温情亿度网络科技 2842

Godot 4 源码分析 - 文件读入编码处理

今天需要读入xml文件进行处理,结果读入一个带中文的文件时,出错了。当然程序还能运行,但编译器一直报错,而且XML解析也不正确。回头看了一下,原目标文件为GB2312编码。而Godot的FileAccess不支持别的编码。其实已经读入到w里,但String::parse_utf8出错。XML文本内容解析为图形效果。

drgraph的博客 1520

Godot 4 插件 - Utility AI 研究

今天看到一个视频教学就看了一下。吸引我的不是插件,是AI这两个字母。这AI与Godot怎么结合?感觉还是离线使用,值得一看。视频时间不长,15分钟左右,看得我云山雾罩,不过演示项目能直接下载(下载下来,能运行,是个小游戏,不过逻辑没大看明白,可能以后看明白后会觉得很简单,但初接触,里面的弯弯绕那么多,一时不好理。看介绍里还有一个插件自带Demo(),感觉会简单一些。下载打开一看,果然简单很多。

drgraph的博客 1516

【Godot4自学手册】第十四节完善敌人功能——追击、攻击

本节将要学习,当主人公进入敌人的追击范围,敌人会自动追击主人公,当达到攻击范围,敌人将对主人公进行攻击。

zhaoyang314的博客 3152

godot engine 源码类图

Godot游戏引擎在国外与unity,Unreal几乎并列。而且完全开源,没有license fee。 个人最关注其editor自身也是使用引擎的ui 编写(可以看作引擎的一个开源应用),本身也完全开源(cocos creator 的editor代码不开源)。 初步浏览了开源游戏引擎godot,准备对其源码进行深入学习。 下面首先从其官方文档中提取了代码架构及主要代码的类继承图,方便对引擎代码的整体了解。 Godot Architecture diagram(Godot架构图) The fo.

vidar_li的专栏 2502

Godot4 你的第一个 3D 游戏 上集

Godot4 3D

watch361的博客 3812

Godot4 你的第一个2d游戏

Godot4 你的第一个2d游戏

基于OFDM的实时图像传输系统MATLAB仿真:MPSK与MQAM调制性能对比与误码率分析

本文详细介绍了基于OFDM的实时图像传输系统在MATLAB中的仿真实现,重点对比了MPSK与MQAM调制方式的性能差异与误码率分析。通过搭建OFDM系统模型,探讨了QPSK和16QAM在不同信道条件下的表现,包括频谱效率、抗噪能力和误码率等关键指标。文章还提供了MATLAB代码示例和实用技巧,帮助读者快速掌握OFDM图像传输系统的核心算法与优化方法。

weixin_29064009的博客 355

小爱音箱Play增强版刷机接入大模型:自定义唤醒词与远程控制全攻略

智能音箱作为家庭语音入口,受限于厂商预设技能,难以满足个性化需求。通过串口刷机与Linux系统分区改造,可以完全掌控设备底层,将豆包、通义千问等大模型API接入原有音频链路,实现真正智能的语音问答。自定义唤醒词打破了“小爱同学”的唯一唤醒方式,结合ESP32-S3外挂模块,还能优化远场拾音。更深入的应用在于将音箱打造为家庭中控,通过大模型工具调用解析自然语言指令,实现远程控制电脑、智能灯等设备。本文从设备选型、拆机串口、系统备份到语音链路搭建,完整梳理了小爱音箱Play增强版的改造路径,适合具备动手能力的开

weixin_30036289的博客 714

什么是以太网链路聚合

以太网链路聚合技术通过将多个物理端口捆绑成逻辑端口,可显著提升网络性能。该技术能增加总带宽(各链路带宽之和)、提高可靠性(故障秒级切换)并实现智能负载分担。主要分为手工模式和基于LACP协议的动态模式,后者能检测链路故障更可靠。配置时需确保接口参数一致、模式匹配,适用于核心交换、服务器接入等场景。华为设备通过创建Eth-Trunk接口、指定LACP模式并添加成员接口即可完成部署。这项成熟技术能以低成本解决带宽瓶颈和可靠性问题,是构建高速稳定网络的关键方案。

lai_2020的博客 674

vnpy_ctp源码下载后转变为python可用的处理过程

vnpy_ctp源码下载后在window中编译使用

m0_37967652的博客 3327

PHP证书图片生成

$realname = "姓名"; $schoolname = "学校"; $idcard = "身份证号"; $image = imagecreatefrompng('certification.png'); // 证书模版图片文件的路径 $red = imagecolorallocate($image,00,00,00); // 字体颜色

4036

基于单片机的宠物狗智能项圈设计

GPS定位功能:利用GPS模块实时获取宠物的位置,帮助主人追踪宠物的活动轨迹。活动监测:使用加速度传感器监测宠物的活动情况,如运动、休息等,并进行分析。健康监测:集成心率传感器,实时监控宠物的心率,以确保其健康。声音识别功能:通过麦克风捕捉宠物的叫声,检测宠物的状态(如饥饿、疼痛等)。蓝牙/Wi-Fi通信:通过蓝牙或Wi-Fi模块与手机APP或云端平台进行数据交互,实时反馈宠物的状态信息。电池管理:实现低功耗设计,确保设备的续航能力。

2201_76125393的博客 2281

YOLOv11涨点改进 | NeurIPS2025最佳论文!注意力改进篇| 引入Gated Attention门控注意力模块、太牛了!直接拯救了大模型的发展,助力目标检测、图像分割、图像分类有效涨点

本文提出了一种基于门控注意力机制(GatedAttention)的YOLOv11改进方法。该模块通过在标准注意力机制中引入头部特定的sigmoid门控,有效提升了模型性能和训练稳定性。实验表明,GatedAttention能够增强模型对关键信息的聚焦能力,减少无关区域关注,提高检测精度。同时,门控机制带来的非线性和稀疏性优化了计算效率,并缓解了训练不稳定性问题。文章详细介绍了模块原理、实现代码及三种改进方案配置方法,为YOLOv11在复杂场景下的目标检测提供了有效解决方案。

Ai缝合怪、助力小伙伴高效发论文 495

相位编码脉冲压缩信号的理论研究与 Matlab 实现

通过实际的代码示例,我们展示了如何生成信号、进行相位编码、传输信号、相位解码和脉冲压缩的步骤。相位编码脉冲压缩信号是通过在发射端对信号进行相位编码,并在接收端对信号进行相位解码来实现的。其主要原理是在发射端将信号的频率进行调制,使得信号具有宽带特性,然后在接收端通过匹配滤波器对信号进行解调和压缩,从而提高信号的分辨率和抗干扰能力。相位编码脉冲压缩信号是一种在信号处理中常用的技术,用于提高信号的分辨率和抗干扰能力。可以使用 Matlab 中的信号生成函数生成一个宽带脉冲信号,例如矩形脉冲信号或高斯脉冲信号。

CyberWizarDD的博客 902

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: Godot引擎 4.0 文档 - 手册 - 2D
下一篇: Godot 4 源码分析 - 获取属性信息
DrGraph
博客等级 码龄14年 228粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值