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游戏

Nvidia Isaac Sim安装与配置 入门教程 2024(2)

Isaac Sim 安装和配置教程将指导用户完成从下载软件到设置和运行仿真的全过程。教程内容包括安装必要的依赖项、配置系统环境、配置Omniverse环境以及调试和优化仿真环境的步骤。通过详细的操作步骤和图文并茂的说明,用户可以快速上手 Isaac Sim,构建出高质量的机器人仿真环境,实现其研究和应用目标。

m0_56661101的博客 2万+

手把手教你用MaxEnt+ArcGIS玩转物种分布预测

本文详细介绍了如何利用MaxEnt最大熵模型与ArcGIS软件进行物种分布预测。通过实战案例,从数据收集、环境变量处理、模型参数设置到结果可视化分析,手把手教你掌握生态位模型的核心流程。结合SDM toolbox插件,可高效完成数据预处理与高级空间分析,是生态学与保护生物学研究的实用指南。

weixin_29309475的博客 559

Python气象雷达数据处理实战:用PyCINRAD从基数据到PPI图的完整流程

本文详细介绍了使用PyCINRAD库处理气象雷达基数据并生成PPI图的完整流程,涵盖环境配置、数据读取、反射率与速度数据提取、可视化优化等关键步骤。通过实战案例演示如何从原始雷达数据到专业级PPI图像生成,为气象研究和业务应用提供高效解决方案。

yog99的博客 758

LSF0108 level shift设计使用及debug流程

目录 初版设计 测试出现的问题1 解决问题(尝试1) 测试出现的问题2 解决问题2-1 解决问题2-2 单Port测试结果 所有Port均连接测试结果 初版设计 此电路的应用场景在于将LCD屏幕连接到FPGA上,进而通过FPGA中设计的硬件电路来驱动LCD屏幕,验证数字硬件电路设计的正确性。因此需要一个转接板位于FPGA和LCD屏幕之间,将二者连接起来。 转接板的硬件电路设计主要存在以下需求: 实现3.3V和1.8V之间的同时双向逻辑转换(LCD屏幕电平为3.3V,FPGA电平为1.

moshanghongfeng的博客 7562

零基础入门红外与可见光图像融合:DAF-Net 实战全指南

本文介绍了基于DAF-Net的红外与可见光图像融合技术,主要内容包括:技术原理、环境配置、数据准备和模型实现。DAF-Net通过双分支特征提取和动态注意力融合机制,有效结合红外图像的热辐射信息与可见光图像的纹理细节。文章详细讲解了开发环境搭建步骤(Python 3.8+PyTorch),TNO数据集的预处理方法,并提供了完整的DAF-Net实现代码,包含特征提取、注意力融合和图像重建三个关键模块。该技术可广泛应用于安防监控、自动驾驶等领域,帮助开发者快速入门多模态图像融合。

FJN110的博客 123

对MixPad精灵(触屏语音开关)进行解剖分析

概述 最近有点忙,已经很久没有更新文章了,对不起各位网友啦~ 这次对ORVIBO的新产品:MixPad精灵款的来个剖析,希望对大家有所帮助! 首先,我买了一台对应的设备,直接去官网采购,价格吗还算OK,400多的价格。 拆箱的过程我就不写了,简单的上个图就行了。 一、拆包: 主屏板包装盒(顶部): 主屏板包装盒(底部): 后盖电源部分无内容,我就不拍了,给优快云空间省点存储位置。 二、设备剖析开始 接下来,我们开始对设备进行剖析,步骤如下: 1、拆掉主屏板后盖板,...

LeeKwen的专栏 3943

vue2/3 - 详细实现内网使用离线百度地图功能,百度地图如何离线加载详细教程(内网部署及使用),在vue中无需网络离线使用百度地图相关功能,提供最新完整的瓦片资源下载及相关工具(示例代码,一键复制

vue,vue2,vue3,百度地图,离线使用百度地图,百度地图瓦片官方下载,vue内网使用百度地图离线无网络,断网情况下使用百度地图,vue离线百度地图教程,如何实现内网部署百度地图,无需联网离线使用,vue+ts实现离线百度地图 内网离线百度地图,如何在百度地图Vue项目中下载离线地图,百度离线地图加载不出来,百度地图离线使用不显示怎么办,怎么解决vue内网使用离线百度地图加载失败问题,vue实现离线地图+百度瓦片,vue引入百度离线地图,vue项目如何使用离线百度地图和自定义地图样式,百度离线地图的下

✅ 精选推荐文章 1万+

图机器学习(7)——图神经网络 (Graph Neural Network, GNN)

图神经网络 (Graph Neural Network, GNN) 是一类专门处理图结构数据的深度学习方法。这类方法也被称为几何深度学习 (geometric deep learning),在社交网络分析、计算机图形学等众多领域正受到日益广泛的关注。在本节中,我们介绍了 GNN 的核心原理,将卷积等经典深度学习范式拓展至非欧几里得图空间,实现了局部结构与全局特征的层次化提取。

盼小辉丶的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: 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、付费专栏及课程。

余额充值