日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

深入研究虚幻4反射系统实现原理(一)

發(fā)布時間:2023/12/15 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 深入研究虚幻4反射系统实现原理(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上一篇翻譯的文章里面提到了UE4反射系統(tǒng)的基本原理與應(yīng)用,這次我們通過代碼來深入研究一下UE4的反射系統(tǒng),因為反射系統(tǒng)在UE4中牽扯的東西較多,所以我打算分幾篇文章分析。我這里假定讀者對UE4有一定的了解并且有一定的C++基礎(chǔ),如果不了解UE4如何使用,那么請先學(xué)會如何使用UE4引擎,否則看起來可能會比較困難。

以下是我整理的一個跟反射系統(tǒng)相關(guān)的類圖:

從上面可以看出UObject是整個反射系統(tǒng)核心,UE4中支持反射的類型在上一篇文章中已經(jīng)說過,包括 C++類、結(jié)構(gòu)體、函數(shù) 、成員變量以及枚舉,也支持TArray(只支持一些如TArray和TSubclassOf的模板類型,并且它們的模板類型不能是嵌套的類型),但是TMap不支持。而這些東西的支持與上面的類是分不開的,比如UClass、UBlueprintGeneratedClass、UFunction、UEnum、以及UProperty,以及繼承自它們的子類。每一個繼承UObject且支持反射系統(tǒng)類型都有一個相對應(yīng) 的UClass,或者它的子類(比如藍(lán)圖對應(yīng)的課表UBlueprintGeneratedClass類,它繼承自UClass),如果是特定的藍(lán)圖類型,比如動作藍(lán)圖、Widget藍(lán)圖等,如上圖所示。UMetaData是元數(shù)據(jù),它存儲了一些編輯器需要的額外信息,比如它的分類(Category )、提示(Tooltip)等,最終打包的時候是不會用到這些信息的。至于我們反射系統(tǒng)里需要訪問的float、int32等變量,則都是由繼承自UProperty的子類來表示的,具體 可以根據(jù)上圖所列出的對象去代碼里面去找對應(yīng)的類去看它具體的實現(xiàn)。

下面我們以一個最簡單的代碼示例來說明UE4中反射的實現(xiàn)過程,首先我創(chuàng)建了一個名為ReflectionStudy的工程(只有Basic Code),這樣做是為了方便分析代碼,一開始提到的文章中說過,如果你想讓你實現(xiàn)的類支持反射,那么必須遵循相關(guān)的準(zhǔn)則,比如要使用UENUM()、UCLASS()、USTRUCT()、UFUNCTION()、以及UPROPERTY()等,UHT會根據(jù)這些宏來生成對應(yīng)的支持反射的代碼。下面我們分別展開來分析這些代碼,它生成的代碼都存放在你的工程ReflectionStudyIntermediateBuildWin64UE4EditorIncReflectionStudy路徑下。

里面一般分為幾類文件:

ReflectionStudy.generated.cpp 一個工程只有一個,這個文件是用來為每個支持反射的類生成反射信息的代碼,比如注冊屬性、添加源數(shù)據(jù)等。
ReflectionStudy.generated.dep.h 這個文件里面就是包含了上面1.ReflectionStudy.generated.cpp用到的頭文件。
ReflectionStudyClasses.h
*.generated.h 這個就是為每個支持反射的頭文件生成的對應(yīng)的宏的代碼。

類的定義

我們以下面的代碼為例來講解,為了查看一些用法的具體實現(xiàn),我們特意加了以下幾個 屬性和方法。

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "GameFramework/GameMode.h"
#include "ReflectionStudyGameMode.generated.h"

/**
* 
*/
UCLASS()
class REFLECTIONSTUDY_API AReflectionStudyGameMode : public AGameMode
{
GENERATED_BODY()


protected:
UPROPERTY(BlueprintReadWrite, Category = "AReflectionStudyGameMode")
float Score;

UFUNCTION(BlueprintCallable, Category = "AReflectionStudyGameMode")
void CallableFuncTest();

UFUNCTION(BlueprintNativeEvent, Category = "AReflectionStudyGameMode")
void NavtiveFuncTest();

UFUNCTION(BlueprintImplementableEvent, Category = "AReflectionStudyGameMode")
void ImplementableFuncTest();
};

  

UHT生成的.generated.h文件

因為對應(yīng)的ReflectionStudyGameMode.generated.h頭文件較長,所以我們只把關(guān)鍵的部分列出來講解。

#define ReflectionStudy_Source_ReflectionStudy_ReflectionStudyGameMode_h_14_RPC_WRAPPERS_NO_PURE_DECLS 
	virtual void NavtiveFuncTest_Implementation(); 
 
	DECLARE_FUNCTION(execNavtiveFuncTest) 
	{ 
		P_FINISH; 
		P_NATIVE_BEGIN; 
		this->NavtiveFuncTest_Implementation(); 
		P_NATIVE_END; 
	} 
 
	DECLARE_FUNCTION(execCallableFuncTest) 
	{ 
		P_FINISH; 
		P_NATIVE_BEGIN; 
		this->CallableFuncTest(); 
		P_NATIVE_END; 
	}

  

可以看到,我們上面定義的函數(shù),UHT幫我們自動生成了如上代碼,至于為什么會生成這樣的函數(shù),那是因為UE4藍(lán)圖調(diào)用約定,每個函數(shù)前面要加一個exec前綴,關(guān)于藍(lán)圖的實現(xiàn)因為我目前也了解的也不是很清楚,所以可能會在后面出一個對藍(lán)圖實現(xiàn)的介紹,這些函數(shù)都是由UE4虛擬機(jī)調(diào)用過來的,如果包含參數(shù)和返回值,那么還會有相應(yīng)的從虛擬機(jī)棧上取參數(shù)和設(shè)置返回值的代碼,讀者可以自行去驗證。

define ReflectionStudy_Source_ReflectionStudy_ReflectionStudyGameMode_h_14_INCLASS_NO_PURE_DECLS 
	private: 
	static void StaticRegisterNativesAReflectionStudyGameMode(); 
	friend REFLECTIONSTUDY_API class UClass* Z_Construct_UClass_AReflectionStudyGameMode(); 
	public: 
	DECLARE_CLASS(AReflectionStudyGameMode, AGameMode, COMPILED_IN_FLAGS(0 | CLASS_Transient | CLASS_Config), 0, TEXT("/Script/ReflectionStudy"), NO_API) 
	DECLARE_SERIALIZER(AReflectionStudyGameMode) 
	/** Indicates whether the class is compiled into the engine */ 
	enum {IsIntrinsic=COMPILED_IN_INTRINSIC};

  

StaticRegisterNativesAReflectionStudyGameMode 這個函數(shù)是用來 注冊C++原生函數(shù)暴露給虛擬機(jī)使用的。
friend REFLECTIONSTUDY_API class UClass* Z_Construct_UClass_AReflectionStudyGameMode(); 聲明友元函數(shù),這個函數(shù)是用來構(gòu)建此類對應(yīng)的UClass的。
DECLARE_CLASS 此宏比較復(fù)雜,主要是定義了StaticClass() 等,具體實現(xiàn)請讀者打開它的定義就可以看到。
DECLARE_SERIALIZER 定義序列化代碼。
enum {IsIntrinsic=COMPILED_IN_INTRINSIC}; 正如注釋所說,就是用來標(biāo)記這個類是否是編譯到引擎中的。

  

#define ReflectionStudy_Source_ReflectionStudy_ReflectionStudyGameMode_h_14_ENHANCED_CONSTRUCTORS 
	/** Standard constructor, called after all reflected properties have been initialized */ 
	NO_API AReflectionStudyGameMode(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()) : Super(ObjectInitializer) { }; 
private: 
	/** Private copy-constructor, should never be used */ 
	NO_API AReflectionStudyGameMode(const AReflectionStudyGameMode& InCopy); 
public: 
	DECLARE_VTABLE_PTR_HELPER_CTOR(NO_API, AReflectionStudyGameMode); 
DEFINE_VTABLE_PTR_HELPER_CTOR_CALLER(AReflectionStudyGameMode); 
	DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL(AReflectionStudyGameMode)

  

NO_API AReflectionStudyGameMode(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()) : Super(ObjectInitializer) { }; 定義一個標(biāo)準(zhǔn)構(gòu)造函數(shù),在所有反射屬性都初始化之后調(diào)用。
NO_API AReflectionStudyGameMode(const AReflectionStudyGameMode& InCopy); 防止調(diào)用拷貝構(gòu)造函數(shù)
DECLARE_VTABLE_PTR_HELPER_CTOR(NO_API, AReflectionStudyGameMode); DEFINE_VTABLE_PTR_HELPER_CTOR_CALLER(AReflectionStudyGameMode); 熱加載相關(guān),這是UE4里面比較牛逼的功能,我們這里也不詳細(xì)討論,這個如果以后對這塊理解了也會單獨開個專題進(jìn)行講解。

DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL 定義了一個默認(rèn)構(gòu)造函數(shù),如下代碼所示:

static void __DefaultConstructor(const FObjectInitializer& X) { new((EInternal*)X.GetObj())TClass(X); }

  

#define ReflectionStudy_Source_ReflectionStudy_ReflectionStudyGameMode_h_14_GENERATED_BODY 

PRAGMA_DISABLE_DEPRECATION_WARNINGS 

public: 

    ReflectionStudy_Source_ReflectionStudy_ReflectionStudyGameMode_h_14_RPC_WRAPPERS_NO_PURE_DECLS 

    ReflectionStudy_Source_ReflectionStudy_ReflectionStudyGameMode_h_14_CALLBACK_WRAPPERS 

    ReflectionStudy_Source_ReflectionStudy_ReflectionStudyGameMode_h_14_INCLASS_NO_PURE_DECLS 

    ReflectionStudy_Source_ReflectionStudy_ReflectionStudyGameMode_h_14_ENHANCED_CONSTRUCTORS 

private: 

PRAGMA_ENABLE_DEPRECATION_WARNINGS

  

這段代碼就是對上述解釋宏的引用,配合下面這個宏最終就實現(xiàn)了在class中定義一個GENERATED_BODY()就可以把上面所有定義的內(nèi)容包含到該類中。

#undef CURRENT_FILE_ID

#define CURRENT_FILE_ID ReflectionStudy_Source_ReflectionStudy_ReflectionStudyGameMode_h

所有GENERATED_BODY()相關(guān)的宏定義如下

// This pair of macros is used to help implement GENERATED_BODY() and GENERATED_USTRUCT_BODY()

#define BODY_MACRO_COMBINE_INNER(A,B,C,D) A##B##C##D

#define BODY_MACRO_COMBINE(A,B,C,D) BODY_MACRO_COMBINE_INNER(A,B,C,D)
#define GENERATED_BODY_LEGACY(...) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_GENERATED_BODY_LEGACY)
#define GENERATED_BODY(...) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_GENERATED_BODY)

#define GENERATED_USTRUCT_BODY(...) GENERATED_BODY()
#define GENERATED_UCLASS_BODY(...) GENERATED_BODY_LEGACY()
#define GENERATED_UINTERFACE_BODY(...) GENERATED_BODY_LEGACY()
#define GENERATED_IINTERFACE_BODY(...) GENERATED_BODY_LEGACY()

  

至此ReflectionStudyGameMode.generated.h文件里面的內(nèi)容就基本分析完了,下面我們來看ReflectionStudy.generated.cpp里面對應(yīng)的代碼,結(jié)合前面的解釋,相信你對整個UE4的反射系統(tǒng)就有一個大體的了解了。

.generated.cpp文件中相關(guān)內(nèi)容

FName REFLECTIONSTUDY_ImplementableFuncTest = FName(TEXT("ImplementableFuncTest"));
FName REFLECTIONSTUDY_NavtiveFuncTest = FName(TEXT("NavtiveFuncTest"));
    void AReflectionStudyGameMode::ImplementableFuncTest()
    {
        ProcessEvent(FindFunctionChecked(REFLECTIONSTUDY_ImplementableFuncTest),NULL);
    }
    void AReflectionStudyGameMode::NavtiveFuncTest()
    {
        ProcessEvent(FindFunctionChecked(REFLECTIONSTUDY_NavtiveFuncTest),NULL);
    }
    void AReflectionStudyGameMode::StaticRegisterNativesAReflectionStudyGameMode()
    {
        FNativeFunctionRegistrar::RegisterFunction(AReflectionStudyGameMode::StaticClass(), "CallableFuncTest",(Native)&AReflectionStudyGameMode::execCallableFuncTest);
        FNativeFunctionRegistrar::RegisterFunction(AReflectionStudyGameMode::StaticClass(), "NavtiveFuncTest",(Native)&AReflectionStudyGameMode::execNavtiveFuncTest);
    }
    IMPLEMENT_CLASS(AReflectionStudyGameMode, 3618622309);

  

剛接觸UE4的時候,如果是BlueprintImplementabeEvent的函數(shù),是不是發(fā)現(xiàn)不需要自己去實現(xiàn),那么當(dāng)時有沒有覺得怪異呢,上面的代碼就解釋清楚了,那是UE4幫我們實現(xiàn)了,可以看到它調(diào)用了ProcessEvent方法,這個方法在UObject中實現(xiàn)的。
StaticRegisterNativesAReflectionStudyGameMode 向AReflectionStudyGameMode::StaticClass()返回的UClass里面添加原生的C++函數(shù)。
IMPLEMENT_CLASS 定義了一個靜態(tài)全局變量,用于在程序啟動的時候注冊UClass。

  

	UFunction* Z_Construct_UFunction_AReflectionStudyGameMode_CallableFuncTest()
	{
		UObject* Outer=Z_Construct_UClass_AReflectionStudyGameMode();
		static UFunction* ReturnFunction = NULL;
		if (!ReturnFunction)
		{
			ReturnFunction = new(EC_InternalUseOnlyConstructor, Outer, TEXT("CallableFuncTest"), RF_Public|RF_Transient|RF_MarkAsNative) UFunction(FObjectInitializer(), NULL, 0x04080401, 65535);
			ReturnFunction->Bind();
			ReturnFunction->StaticLink();
#if WITH_METADATA
			UMetaData* MetaData = ReturnFunction->GetOutermost()->GetMetaData();
			MetaData->SetValue(ReturnFunction, TEXT("Category"), TEXT("AReflectionStudyGameMode"));
			MetaData->SetValue(ReturnFunction, TEXT("ModuleRelativePath"), TEXT("ReflectionStudyGameMode.h"));
#endif
		}
		return ReturnFunction;
	}

  

這個函數(shù)向AReflectionStudyGameMode返回的UClass類里面注冊名為CallableFuncTest的函數(shù),而#if WITH_METADATA里面就是我們前面提到的元數(shù)據(jù),可以注意其中我們類中指定的Category分類就在這里指定的,放在了它的(UPackage中)UMetaData中。Z_Construct_UFunction_AReflectionStudyGameMode_ImplementableFuncTest()和Z_Construct_UFunction_AReflectionStudyGameMode_NavtiveFuncTest()實現(xiàn)方式和上面基本一樣,這里我就不寫出來了。

  

	UClass* Z_Construct_UClass_AReflectionStudyGameMode()
	{
		static UClass* OuterClass = NULL;
		if (!OuterClass)
		{
			Z_Construct_UClass_AGameMode();
			Z_Construct_UPackage__Script_ReflectionStudy();
			OuterClass = AReflectionStudyGameMode::StaticClass();
			if (!(OuterClass->ClassFlags & CLASS_Constructed))
			{
				UObjectForceRegistration(OuterClass);
				OuterClass->ClassFlags |= 0x2090028C;

				OuterClass->LinkChild(Z_Construct_UFunction_AReflectionStudyGameMode_CallableFuncTest());
				OuterClass->LinkChild(Z_Construct_UFunction_AReflectionStudyGameMode_ImplementableFuncTest());
				OuterClass->LinkChild(Z_Construct_UFunction_AReflectionStudyGameMode_NavtiveFuncTest());

PRAGMA_DISABLE_DEPRECATION_WARNINGS
				UProperty* NewProp_Score = new(EC_InternalUseOnlyConstructor, OuterClass, TEXT("Score"), RF_Public|RF_Transient|RF_MarkAsNative) UFloatProperty(CPP_PROPERTY_BASE(Score, AReflectionStudyGameMode), 0x0020080000000004);
PRAGMA_ENABLE_DEPRECATION_WARNINGS
				OuterClass->AddFunctionToFunctionMapWithOverriddenName(Z_Construct_UFunction_AReflectionStudyGameMode_CallableFuncTest(), "CallableFuncTest"); // 3059784748
				OuterClass->AddFunctionToFunctionMapWithOverriddenName(Z_Construct_UFunction_AReflectionStudyGameMode_ImplementableFuncTest(), "ImplementableFuncTest"); // 4773450
				OuterClass->AddFunctionToFunctionMapWithOverriddenName(Z_Construct_UFunction_AReflectionStudyGameMode_NavtiveFuncTest(), "NavtiveFuncTest"); // 2500148308
				OuterClass->ClassConfigName = FName(TEXT("Game"));
				OuterClass->StaticLink();
#if WITH_METADATA
				UMetaData* MetaData = OuterClass->GetOutermost()->GetMetaData();
				MetaData->SetValue(OuterClass, TEXT("HideCategories"), TEXT("Info Rendering MovementReplication Replication Actor Input Movement Collision Rendering Utilities|Transformation"));
				MetaData->SetValue(OuterClass, TEXT("IncludePath"), TEXT("ReflectionStudyGameMode.h"));
				MetaData->SetValue(OuterClass, TEXT("ModuleRelativePath"), TEXT("ReflectionStudyGameMode.h"));
				MetaData->SetValue(OuterClass, TEXT("ShowCategories"), TEXT("Input|MouseInput Input|TouchInput"));
				MetaData->SetValue(NewProp_Score, TEXT("Category"), TEXT("AReflectionStudyGameMode"));
				MetaData->SetValue(NewProp_Score, TEXT("ModuleRelativePath"), TEXT("ReflectionStudyGameMode.h"));
#endif
			}
		}
		check(OuterClass->GetClass());
		return OuterClass;
	}

  

這個函數(shù)的作用就是來生成AReflectionStudyGameMode的UClass對象,并注冊所有的UFunction 和UProperty
Z_Construct_UClass_AGameMode(); 因為它繼承自AGameMode所以AGameMode的UClass必須有效。
Z_Construct_UPackage__Script_ReflectionStudy(); 確保UPackage已經(jīng)創(chuàng)建。
#if WITH_METADATA 宏中代碼也是用于創(chuàng)建元數(shù)據(jù)。

	static FCompiledInDefer Z_CompiledInDefer_UClass_AReflectionStudyGameMode(Z_Construct_UClass_AReflectionStudyGameMode, &AReflectionStudyGameMode::StaticClass, TEXT("AReflectionStudyGameMode"), false, nullptr, nullptr);
	DEFINE_VTABLE_PTR_HELPER_CTOR(AReflectionStudyGameMode);

第一行代碼用于存放創(chuàng)建UClass的一個靜態(tài)函數(shù),之后將會執(zhí)行這個靜態(tài)生成UClass函數(shù)
DEFINE_VTABLE_PTR_HELPER_CTOR 定義一個參數(shù)為FVTableHelper構(gòu)造函數(shù)。

  

	UPackage* Z_Construct_UPackage__Script_ReflectionStudy()
	{
		static UPackage* ReturnPackage = NULL;
		if (!ReturnPackage)
		{
			ReturnPackage = CastChecked<UPackage>(StaticFindObjectFast(UPackage::StaticClass(), NULL, FName(TEXT("/Script/ReflectionStudy")), false, false));
			ReturnPackage->SetPackageFlags(PKG_CompiledIn | 0x00000000);
			FGuid Guid;
			Guid.A = 0x00B770A5;
			Guid.B = 0x8BECE3AF;
			Guid.C = 0x00000000;
			Guid.D = 0x00000000;
			ReturnPackage->SetGuid(Guid);

		}
		return ReturnPackage;
	}

  

用于返當(dāng)前模塊的UPackage,上面的代碼中會用到這個參數(shù)GetOuterMost()函數(shù),返回的就是這個UPackage。

總結(jié)

至此我們對UE4中反射系統(tǒng)對類的支持做了一個簡單的介紹,相信大家也有了一定的了解,限于篇幅,我們這篇到此為止,后面會繼續(xù)討論其它USTRUCT、UENUM、等的實現(xiàn),以及它們整個反射系統(tǒng)的運行流程。由于我對UE4也不是特別熟悉,所以其中可能有說的不準(zhǔn)確的地方,如果有錯誤的地方,還請指正,也希望大家能一起討論。當(dāng)然后面我也會講一下UE4中其它模塊的實現(xiàn),比如整個藍(lán)圖的實現(xiàn)、多線程渲染、以及基于物理的渲染等內(nèi)容。

由于最上面的類圖尺寸過大,上傳后的圖片并不是特別清晰,高清原圖可以在這里下載。

總結(jié)

以上是生活随笔為你收集整理的深入研究虚幻4反射系统实现原理(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品美女一区 | 成人中文字幕+乱码+中文字幕 | 欧美一区二区三区免费在线观看 | 爆乳熟妇一区二区三区霸乳 | 精品人妻aV中文字幕乱码色欲 | 狠狠操在线 | 久久影院视频 | 精品爆乳一区二区三区 | av毛片网站 | 91日本在线 | a级黄色一级片 | 齐天大性床战铁扇公主 | 日韩极品一区 | 日日爽天天 | 成人三级电影网站 | 亚洲天堂不卡 | 国产97色在线 | 国产 | 男女激情免费网站 | 国产99久久久久 | 蜜桃传媒一区二区亚洲av | av在线伊人| 快播视频在线观看 | 一区二区激情视频 | 亚洲综合插 | 亚色视频在线观看 | 人妻少妇偷人精品无码 | 国产一区二区精品久久 | 综合一区在线 | www成人在线| 日韩毛片视频 | 一本色道久久综合亚洲精品按摩 | 兄弟兄弟全集免费观看 | 国产精品夜夜 | a中文字幕 | 四虎免费在线观看 | av一区二区三区在线观看 | 国产国产精品 | 黄网站在线观看视频 | 国产尤物av | 丰满肥臀噗嗤啊x99av | 欧美一级一级 | 欧美日韩中文在线视频 | 日本美女裸体视频 | 欧美大胆视频 | 国产伦精品一区二区三区网站 | 免费在线观看你懂的 | 殴美一级视频 | 国产人妻大战黑人20p | fc2ppv色の美マンに中出し | 国产理论视频在线观看 | 女同中文字幕 | 亚洲黄a| 天天色影网 | 影音先锋亚洲一区 | 亚洲福利视频网站 | 国产夫妻在线观看 | 久久久久亚洲av成人片 | 海角社区id:1220.7126,10. | av视 | 黄色av网站在线看 | 久久激情综合 | 精品欧美在线 | 黄色片网站免费 | www.久久婷婷 | av网站黄色| v片在线看 | 久久久久久久久蜜桃 | 四虎com| 日本成人一区二区三区 | 国产精品一区二区三区四区 | 日韩一区二区三区在线观看 | 欧美视频xxx| 欧美熟妇另类久久久久久不卡 | 成年人在线免费观看视频网站 | 欧美激情免费 | 少妇熟女一区二区三区 | a中文在线 | 男女av| 草莓视频一区二区三区 | 青青青青青青草 | 精品成人一区 | 性猛交xxxx乱大交孕妇印度 | gv天堂gv无码男同在线观看 | 亚洲综合久 | 黄色免费网站在线 | 色在线视频 | 天天摸天天插 | 特高潮videossexhd | 精品无码久久久久久久久久 | 黄瓜视频91 | 亚洲区国产区 | 高清av免费| 男人把女人捅爽 | 午夜视频在线观看一区 | 亚洲三级免费 | 日韩二区三区四区 | 天天尻逼| 小草av在线 | 少妇又色又紧又大爽又刺激 |