精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解如何把C++對象綁定到Lua輕量級

移動開發 iOS
每一種策略都有它的優點和缺點,游戲開發者必須在得到在腳本環境中所需要的功能需求之后確定最好的策略。一些開發者可能只是把C/C++對象映射成簡單的數值,但是其他人可能需要實現運行期類型檢查機制,甚至是在Lua中擴展宿主的應用。

游戲中的使用腳本語言已經成為了一個標準應用。腳本語言能夠在游戲開發中扮演一個重要的角色,并且讓數據結構化,計劃事件,測試和調試這些工作更加容易。腳本語言也能夠允許像美術,策劃這些非程序專家通過一個高層的抽象腳本來為游戲編寫代碼。這個抽象層的一部分也能夠允許提供給玩家來定制整個游戲

從程序員的角度上來看,把一個腳本語言嵌入到游戲中最主要的問題是如果為腳本語言提供對宿主對象的訪問(通常是C/C++對象)。在選擇一個腳本語言的時候有兩個關鍵的特性:嵌入相關問題和綁定相關問題。而這些是Lua語言的一些設計的初衷。可是,Lua語言并沒有提供任何自動創建綁定的工具,因為這是出于另外一個設計初衷:Lua只是提供機制,而不是策略。
 
因而,就有許多種策略可以用來在Lua中綁定宿主對象。每一種策略都有它的優點和缺點,游戲開發者必須在得到在腳本環境中所需要的功能需求之后確定***的策略。一些開發者可能只是把C/C++對象映射成簡單的數值,但是其他人可能需要實現運行期類型檢查機制,甚至是在Lua中擴展宿主的應用。另外一個需要處理的重要問題是,是否允許Lua來控制宿主對象的生命周期。在這篇文章中,我們將探究使用Lua的API來實現不同的宿主對象綁定策略。

綁定函數

為了說明不同策略的實現,讓我們考慮把一個簡單的C++類綁定到Lua中。實現的目標是在Lua中實現對類的訪問,因此允許腳本通過導出的函數來使用宿主所提供的服務。這里主要的想法是使用一個簡單的類來引導我們的討論。下面討論的是一個虛構游戲中的英雄類,有幾個將會被映射到Lua中的公用方法。

  1. class Hero{  
  2. public:  
  3.  Hero( const char* name );  
  4.  ~Hero();  
  5.  const char* GetName();  
  6.  void SetEnergy( double energy );  
  7.  double GetEnergy();  
  8. }; 

要把類方法綁定到Lua中,我們必須使用Lua的API來編寫綁定功能。每一個綁定函數都負責接收Lua的值作為輸入參數,同時把它們轉化成相應的C/C++數值,并且調用實際的函數或者方法,同時把它們的返回值給回到Lua中。從標準發布版本的Lua中,Lua API和輔助庫提供了不少方便的函數來實現Lua到C/C++值的轉換,同樣,也為C/C++到Lua值的轉換提供了函數。例如,luaL_checknumber提供了把輸入參數轉換到相對應的浮點值的功能。

如果參數不能對應到Lua中的數值類型,那么函數將拋出一個異常。相反的,lua_pushnumber把給定的浮點值添加到Lua參數棧的頂端。還有一系列相類似的函數來映射其他的基本的Lua類型和C/C++數據類型。我們目前最主要的目標提出不同的策略來擴展標準Lua庫和它為轉換C/C++類型對象所提供的功能。為了使用C++的習慣,讓我們創建一個叫做Binder的類來封裝在Lua和宿主對象中互相轉化值的功能。這個類也提供了一個把將要導出到Lua中的模塊初始化的方法。

  1. class Binder  
  2. {  
  3. public:  
  4.   // 構造函數  
  5.   Binder( lua_state *L );  
  6.   // 模塊(庫) 初始化  
  7.   int init( const char* tname, const luaL_reg* first );  
  8.   // 映射基本的類型  
  9.   void pushnumber( double v );  
  10.   double checknumber( int index );  
  11.   void pushstring( const char s );  
  12.   const char* checkstring( int index );  
  13.   ….  
  14.   // 映射用戶定義類型  
  15.   void pushusertype( void* udata, const char* tname );  
  16.   void* checkusertype( int index, const char* tname );  
  17. }; 

類的構造函數接收Lua_state來映射對象。初始化函數接收了將被限制的類型名字,也被表示為庫的名稱(一個全局變量名來表示在Lua中的類表),并且直接調用了標準的Lua庫。例如,映射一個數值到Lua中,或者從Lua映射出來的方法可能是這樣的:

  1. void Binder::pushnumber( double v )  
  2. {  
  3.  lua_pushnumber( L,v );  
  4. }  
  5.  
  6. double Binder::checknumber( int index )  
  7. {  
  8.  return luaL_checknumber( L,index );  

真正的挑戰來自把用戶自定義類型互相轉換的函數:pushusertype和checkusertype。這些方法必須保證映射對象的綁定策略和目前使用中的一致。每一種策略都需要不同的庫的裝載方法,因而要給出初始化方法init的不同實現。

一旦我們有了一個binder的實現,那么綁定函數的代碼是非常容易寫的。例如,綁定函數相關的類的構造函數和析構函數是如下代碼:

  1. static int bnd_Create( lua_state* L ){  
  2.  LuaBinder binder(L);  
  3. Hero* h = new Hero(binder.checkstring(L,1));  
  4. binder.pushusertype(h,”Hero”);  
  5. return i;  
  6. }  
  7.  
  8. static int bnd_Destroy( lua_state* L ){  
  9.  LuaBinder binder(L);  
  10.  Hero * hero = (Hero*)binder.checkusertype( 1, “Hero” );  
  11.  delete hero;  
  12.  return 0;  

同樣的,和GetEnergy和SetEnergy方法的綁定函數能夠像如下編碼:

  1. static int bnd_GetEnergy( lua_state* L ){  
  2.  LuaBinder binder(L);  
  3.  Hero* hero = (Hero*)binder.checkusertype(1,”Hero”);  
  4.  binder.pushnumber(hero->GetEnergy());  
  5.  return 1;  
  6. }  
  7. static int bnd_SetEnery( lua_State* L ){  
  8.  LuaBinder binder(L);  
  9.  Hero* hero = (Hero*)binder.checkusertype(1,”Hero”);  
  10.  Hero.setGetEnergy( binder.checknumer(2) );  
  11.  return 1;  

注意綁定函數的封裝策略將被用于映射對象:宿主對象使用對應的check和push方法組來進行映射,同時這些方法也用于以接收關聯類型為輸入參數。在我們為所有的綁定函數完成編碼。我們可以來編寫打開庫的方法:

  1. static const luaL_reg herolib[] = {  
  2.  { “Create”, bnd_Create },  
  3.  {“Destroy”, bnd_Destory },  
  4.  {“GetName”, bnd_GetName},  
  5.  …  
  6. };  
  7. int luaopen_hero( lua_State *L ) {  
  8.  LuaBinder binder(L);  
  9.  Binder.init( “hero”, herolib );  
  10.  return i;  

綁定宿主對象和Lua數值

把C/C++對象和Lua綁定的方法就是把它的內存地址映射成輕量的用戶數據。一個輕量的用戶數據可以用指針來表示(void *)并且它在Lua中只是作為一個普通的值。從腳本環境中,能夠得到一個對象的值,做比較,并且能夠把它傳回給宿主。我們要在binder類中所實現的這個策略所對應的方法通過直接調用在標準庫中已經實現的函數來實現:

  1. void Binder::init( const char *tname, const luaL_reg *flist ){  
  2.  luaL_register( L, tname, flist );  
  3. }  
  4. void Binder::pushusertype( void* udata, const char* tname ){  
  5.  lua_pushlightuserdata( L, udata );  
  6. }  
  7. void *Binder::checkusertype( int index, const char* tname ){  
  8.  void *udata = lua_touserdata( L, index );  
  9.  if ( udata ==0 ) luaL_typerror( L, index, tname );  
  10.  return udata;  

函數luaL_typerror在上面的實現中用于拋出異常,指出輸入參數沒有一個有效的相關對象。

通過這個映射我們英雄類的策略,以下的Lua便是可用的:

  1. Local h = Hero.Create(“myhero”)  
  2. Local e = Hero.GetEnergy(h)  
  3. Hero.SetEnergy(h, e-1)  
  4. Hero.Destroy() 

對象映射成簡單值至少有三個好處:簡單,高效和小的內存覆蓋。就像我們上面所見到的,這種策略是很直截了當的,并且Lua和宿主語言之間的通信也是***效的,那是因為它沒有引入任何的間接訪問和內存分配。然而,作為一個實現,這種簡單的策略因為用戶數據的值始終被當成有效的參數而變得不安全。傳入任何一個無效的對象都將回導致宿主程序的直接崩潰。

加入類型檢查

我們能夠實現一個簡單的實時的類型檢查機制來避免在Lua環境中導致宿主程序崩潰。當然,加入類型檢查會降低效率并且增加了內存的使用。如果腳本只是用在游戲的開發階段,那么類型檢查機制可以在發布之前始終關閉。
 
換句話說,如果腳本工具要提供給最終用戶,那么類型檢查就變得非常重要而且必須和產品一起發布。

要添加類型檢查機制到我們的綁定到值的策略中,我們能夠創建一個把每一個對象Lua相對應類型名字映射的表。(在這篇文章中所有提到的策略里,我們都假定地址是宿主對象的唯一標識)。在這張表中,輕量的數據可以作為一個鍵,而字符串(類型的名稱)可以作為值。

初始化方法負責創建這張表,并且讓它能夠被映射函數調用到。然而,保護它的獨立性也是非常重要的:從Lua環境中訪問是必須不被允許的;另外,它仍然有可能在Lua腳本中使宿主程序崩潰。使用注冊表來存儲來確保它保持獨立性是一個方法,它是一個全局的可以被Lua API單獨訪問的變量。然而,因為注冊表是唯一的并且全局的,用它來存儲我們的映射對象也阻止了其他的C程序庫使用它來實現其他的控制機制。

另一個更好的方案是只給綁定函數提供訪問類型檢查表的接口。直到Lua5.0,這個功能才能夠被實現。在Lua5.1中,有一個更好的(而且更高效)方法:環境表的使用直接和C函數相關。我們把類型檢查表設置成綁定函數的環境表。這樣,在函數里,我們對表的訪問就非常高效了。每一個函數都需要注冊到Lua中,從當前的函數中去繼承它的環境表。因而,只需要改變初始化函數的環境表關聯就足夠了――并且所有注冊過的辦定函數都會擁有同樣一個關聯的環境表。
 
現在,我們可以對binder類的執行類型檢測的方法進行編碼了:

  1.  void Binder::init(const char* tname, const luaL_reg* flist){  
  2.   lua_newtable(L); //創建類型檢查表  
  3.   lua_replace(L,LUA_ENVIRONINDEX ); // 把表設置成為環境表  
  4.   luaL_register( L,tname, flist ); //創建庫表  
  5.  }  
  6.  
  7.  void Binder::pushusertype(void *udata, const char* tname){  
  8.   lua_pushlightuserdata(L,udata);   //壓入地址  
  9.   lua_pushvalue(L,-1);     //重復地址  
  10.   lua_pushstring(L,tname);    //壓入類型名稱  
  11.   lua_rawset(L,LUA_ENVIRONINDEX);   //envtable[address] = 類型名稱  
  12. }  
  13.  
  14. void* Binder::checkusertype( int index, const char* tname ){  
  15.  void* udata = lua_touserdata( L,index );  
  16.  if ( udata ==0 || !checktype(udata, tname) )  
  17.   luaL_typeerror(L,index,tname);  
  18.  return udata;  

面代碼使用一個私有的方法來實現類型檢查:

  1. int Binder::checktype(void *udata, const char* tname){  
  2.  lua_pushlightuserdata(L,udata);  //壓入地址  
  3.  lua_rawget( L, LUA_ENVIRONINDEX); //得到env[address]  
  4.  const char* stored_tname =  lua_tostring(t,-1);  
  5.  int result = stored_tname && strcmp(stored_tname, tname) ==0;  
  6. lua_pop(L,1);  
  7. return result;  

通過這些做法,我們使得綁定策略仍然非常高效。同樣,內存負載也非常低――所有對象只有一個表的實體。然而,為了防止類型檢查表的膨脹,我們必須在銷毀對象的綁定函數中釋放這些表。在bnd_Destroy函數中,我們必須調用這個私有方法:

  1. void Binder::releaseusertype( void* udata ){  
  2.  lua_pushlightuserdata(L,udata);  
  3.  lua_pushnil(L);  
  4.  lua_settable(L,LUA_ENVIRONINDEX);  

小結:詳解如何把C++對象綁定到Lua輕量級的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2013-02-20 14:54:03

C#.NETNDatabase

2021-10-27 11:29:32

框架Web開發

2010-02-06 10:50:10

C++統計對象個數

2011-08-22 17:13:00

LuaC++函數

2021-04-11 10:48:37

UbuntuC++Linux

2025-01-26 15:44:29

2010-02-03 14:18:44

2010-01-25 09:50:58

C++函數對象

2023-10-13 12:58:04

AI訓練

2018-09-12 09:00:00

數據庫Redis微服務

2009-07-17 14:38:51

輕量級Swing組件

2009-07-14 18:05:28

輕量級Swing組件

2025-02-06 08:06:05

2014-09-19 10:46:36

LuaCC++

2024-02-26 07:26:27

RustC++開發

2013-12-13 16:53:00

Lua腳本語言C++

2020-09-04 09:27:40

開源C++搜狗

2023-10-25 13:27:20

C++字符串

2021-12-21 15:31:10

C++語言指針

2011-04-20 09:50:45

Virtual
點贊
收藏

51CTO技術棧公眾號

宅男在线国产精品| 亚洲欧美日韩一区二区三区在线观看| 久久久中文字幕| 国产呦小j女精品视频| 深夜视频一区二区| 一区二区三区四区亚洲| 欧美精品二区三区四区免费看视频 | 一区二区网站| 天天做天天摸天天爽国产一区| 奇米视频888战线精品播放| 97精品人妻一区二区三区在线| 亚洲精品a级片| 日韩经典第一页| 超碰在线资源站| 成人福利视频| 亚洲国产日韩在线一区模特| 视频一区视频二区视频三区高| 中文在线观看av| 中文精品在线| 欧美成年人网站| 久久婷婷五月综合| 美女av一区| 91精品国产综合久久福利软件| 成年人观看网站| 日本aa在线| 中文字幕av在线一区二区三区| 动漫一区二区在线| 在线免费观看av片| 久久一日本道色综合久久| 欧美风情在线观看| 糖心vlog免费在线观看| 欧美在线观看视频一区| 亚洲精品理论电影| 久久免费精品国产| 视频一区在线| 制服丝袜成人动漫| 久久这里只精品| 天天综合网站| 欧美性xxxx极品hd欧美风情| 国产xxxx振车| 性xxxfreexxxx性欧美| 中文字幕在线免费不卡| 神马欧美一区二区| 久草在线青青草| 久久女同精品一区二区| 九色综合婷婷综合| 无码国产精品一区二区色情男同| 高清在线成人网| 97超级在线观看免费高清完整版电视剧| 精品国产青草久久久久96| 欧美综合二区| 日本精品va在线观看| 国产免费观看av| 国产精品一区亚洲| 欧美与黑人午夜性猛交久久久| 久久精品免费在线| 今天的高清视频免费播放成人| 欧美精品在线观看91| 卡通动漫亚洲综合| 欧美91大片| 欧美超级免费视 在线| 欧美xxxx黑人xyx性爽| 欧美日韩一区二区三区四区在线观看 | 久久久久亚洲av无码专区首jn| 国产美女亚洲精品7777| 欧美成人a在线| 亚洲激情 欧美| 亚洲伊人春色| 最近2019中文免费高清视频观看www99| 亚洲一级黄色录像| 久久久久亚洲| 久久久免费精品视频| 日韩欧美大片在线观看| 玖玖精品视频| 国产在线久久久| www.久久久久久| 99久久国产综合精品色伊| 蜜桃网站成人| 欧美成人高清在线| 亚洲综合色在线| 久久无码高潮喷水| 久久精品嫩草影院| 欧美成人一区二区三区在线观看| 800av在线播放| 欧美中文一区二区| 欧美另类精品xxxx孕妇| 黄色片视频网站| 免费人成在线不卡| 高清不卡一区二区三区| 邻居大乳一区二区三区| 亚洲天堂网中文字| 久激情内射婷内射蜜桃| 日韩一区精品| 精品国产一区久久| jizz18女人高潮| 狠狠噜噜久久| 国产精品美女www| 亚洲精品久久久狠狠狠爱| 久久精品夜夜夜夜久久| 91免费视频黄| 欧美三区四区| 精品国产网站在线观看| 大胸美女被爆操| 日韩午夜在线电影| 成人国产在线激情| 日本福利片高清在线观看| 亚洲日本丝袜连裤袜办公室| 黄色网页免费在线观看| 97色婷婷成人综合在线观看| 精品亚洲一区二区三区在线观看 | 亚洲.国产.中文慕字在线| www.涩涩涩| 亲子伦视频一区二区三区| 久久影院资源网| 国产91国语对白在线| 成人综合婷婷国产精品久久免费| 婷婷久久青草热一区二区| 国产中文在线播放| 日韩一级片网站| 国产美女网站视频| 三级精品在线观看| 国产日韩一区二区| 在线观看电影av| 欧美日韩一区二区电影| 午夜理伦三级做爰电影| 极品中文字幕一区| 粉嫩精品一区二区三区在线观看| 秋霞影院午夜丰满少妇在线视频| 日韩欧美亚洲范冰冰与中字| www.美色吧.com| 欧美 亚欧 日韩视频在线| 国产精品久久久久影院日本| 毛片免费在线| 日韩欧美在线视频观看| 亚洲激情 欧美| 亚洲精品专区| 国产精品10p综合二区| 91亚洲天堂| 欧美一区二区视频在线观看| 青青青手机在线视频| 秋霞国产午夜精品免费视频| 欧美极品一区| 欧美性xxx| 亚洲欧洲激情在线| 7799精品视频天天看| 久久综合视频网| 欧美国产激情视频| 日韩电影不卡一区| 青青a在线精品免费观看| 婷婷国产在线| 日韩欧美在线免费观看| 最近中文字幕在线mv视频在线 | 亚洲无人区一区| 国产成人av片| 亚洲精品视频啊美女在线直播| 国产女主播一区二区三区| 青草在线视频在线观看| 亚洲成avwww人| 91久久国产视频| 久久亚洲免费视频| 午夜欧美福利视频| 日韩免费高清| 91精品久久香蕉国产线看观看| av在线网址观看| 亚洲精品在线一区二区| 国产 日韩 欧美 在线| 久久麻豆一区二区| 一区二区三区网址| 亚洲91中文字幕无线码三区| 99视频网站| 日韩脚交footjobhdboots| 亚洲午夜色婷婷在线| 在线观看免费视频一区| 亚洲欧洲综合另类在线| av av在线| 久久只有精品| 7777在线视频| 亚瑟一区二区三区四区| 国产精品美女久久| 91在线中文| 日韩精品视频在线播放| 伊人亚洲综合网| 亚洲亚洲精品在线观看| 亚洲一级中文字幕| 精品中文字幕一区二区小辣椒 | 色婷婷在线视频观看| 不卡视频在线观看| 天天爱天天操天天干| 一区二区中文| 久草热久草热线频97精品| 欧美日韩尤物久久| 欧美激情小视频| 国产免费av在线| 欧美mv日韩mv| 中文字幕乱码中文字幕| 亚洲一区二区免费视频| 免费看黄色av| 成人av在线网| 日韩成人av免费| 久久国产日韩| 裸体大乳女做爰69| 国产成人精品一区二区免费看京| 亚洲自拍高清视频网站| 一区二区三区四区日本视频| 欧美精品日韩三级| av片在线免费观看| 亚洲国产精品福利| aaa国产视频| 欧美性猛片aaaaaaa做受| 久久免费公开视频| 国产精品高清亚洲| 30一40一50老女人毛片| 国产91对白在线观看九色| 国产福利一区视频| 国产日韩1区| 国产一二三区在线播放| 天天综合国产| 色女人综合av| 日本精品影院| 国产精品传媒毛片三区| 2020国产精品小视频| 国产精品高潮呻吟久久av黑人| 草草在线观看| 久久久久久一区二区三区| 黄页视频在线播放| 中文字幕国产亚洲2019| 免费播放片a高清在线观看| 亚洲国产精品热久久| 亚洲av无码一区二区乱子伦| 欧美放荡的少妇| 97人妻一区二区精品免费视频 | 中文字幕乱码在线人视频| 卡一卡二国产精品| 午夜精品在线免费观看| 日韩福利电影在线观看| 激情六月丁香婷婷| 午夜综合激情| 亚洲爆乳无码专区| 先锋影音久久久| 精品久久久久久久久久中文字幕| 一区福利视频| 99视频在线免费播放| 亚洲精品精选| 日韩欧美精品在线观看视频| 在线亚洲欧美| 六月丁香婷婷激情| 久久国产精品亚洲77777| 日韩有码免费视频| 日本一不卡视频| 一区二区三区网址| 国产美女视频91| 特种兵之深入敌后| 高清在线成人网| 私密视频在线观看| 久久一夜天堂av一区二区三区 | 亚洲激情av在线| 全网免费在线播放视频入口| 亚洲精品免费看| 国产无遮挡又黄又爽又色| 婷婷综合五月天| 国产精品久久久久久久久久久久久久久久久 | 人妻 丝袜美腿 中文字幕| 国产传媒一区在线| 丝袜熟女一区二区三区| 91在线视频免费观看| 无码h肉动漫在线观看| 国产精品剧情在线亚洲| 男女性高潮免费网站| 午夜在线成人av| 日日夜夜狠狠操| 欧美美女直播网站| 国模人体一区二区| 亚洲男人av电影| 二区在线播放| 7m精品福利视频导航| 国产综合色在线观看| 亚洲淫片在线视频| 美女午夜精品| 亚洲制服欧美久久| 伊人久久亚洲热| 中文字幕av不卡在线| 国产91在线看| 久久国产柳州莫菁门| 亚洲精品精品亚洲| 国产乱国产乱老熟| 欧美高清视频不卡网| 污视频网站免费观看| 中文字幕欧美日韩va免费视频| 日韩精品卡一| 国产精品色悠悠| 美腿丝袜亚洲图片| 一本久久a久久精品vr综合| 国产一在线精品一区在线观看| 白嫩少妇丰满一区二区| 国产精品12区| 18精品爽国产三级网站| 亚洲一区二区三区四区五区黄| 自拍偷拍18p| 亚洲成人黄色在线| 日本最新在线视频| 日本sm极度另类视频| 欧美视频三区| 亚洲免费精品视频| 一本久道久久久| 苍井空张开腿实干12次| 国产欧美日韩激情| 国产a∨精品一区二区三区仙踪林| 欧美夫妻性生活| 国产三级视频在线播放线观看| 九色精品美女在线| 九九热这里有精品| 免费成人av网站| 亚洲精品123区| 日本一区二区三区在线免费观看| 久久久不卡网国产精品一区| 久久久久久av无码免费网站| 欧美日韩国产一区| 男女网站在线观看| 亚洲**2019国产| 91成人入口| 久久国产精品免费观看| 麻豆成人免费电影| 日韩中文字幕有码| 欧美丝袜美女中出在线| 男人天堂av网| 色综合久久中文字幕综合网小说| 久久影视精品| 亚洲高清123| 日韩av成人高清| 性猛交娇小69hd| 日韩欧美精品网址| 日本成人一区| 欧美又大粗又爽又黄大片视频| 福利片一区二区| 日韩欧美不卡在线| 国产不卡视频在线观看| 欧美成人手机视频| 91精品在线观看入口| 婷婷成人激情| 91精品在线观| 一区二区三区在线电影| 成人性生交视频免费观看| 18涩涩午夜精品.www| 国产精品自产拍| 欧美久久久精品| 久久影院一区二区三区| 成人在线免费观看网址| 国产剧情一区二区三区| 男女羞羞免费视频| 欧美α欧美αv大片| bl在线肉h视频大尺度| 国内成+人亚洲| 午夜亚洲一区| 无码人妻精品一区二区中文| 欧美午夜电影网| 米奇777四色精品人人爽| 91在线国产电影| 国产精品99免费看| 2一3sex性hd| 色天天综合色天天久久| 成人影视在线播放| 国产日产亚洲精品| 欧美在线三区| xxxx黄色片| 在线一区二区三区做爰视频网站| 1769在线观看| 亚洲最大成人在线| 最新成人av网站| 99久久久无码国产精品衣服| 欧美日高清视频| 欧美黑人xx片| 欧美日韩大片一区二区三区| 美女视频第一区二区三区免费观看网站| 老司机深夜福利网站| 日韩免费成人网| 中文字幕资源网在线观看免费| 色吧亚洲视频| 国产成人激情av| 欧美亚洲另类小说| 欧美成人午夜影院| 天海翼亚洲一区二区三区| 日韩爱爱小视频| 一片黄亚洲嫩模| 国产尤物视频在线| 亚洲精品国产精品国自产网站按摩| 一区精品在线| 国产成+人+日韩+欧美+亚洲| 日本一级片免费看| 丝袜亚洲另类欧美重口| a看欧美黄色女同性恋| 国产极品美女高潮无套久久久| 中文字幕在线视频一区| 日韩av成人| 51国偷自产一区二区三区| 午夜影院日韩| 青青草手机视频在线观看| 亚洲欧美综合另类中字| 这里视频有精品| 一区二区三区视频网| 五月婷婷激情综合|