精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

www黄色网址| 日韩精品一卡二卡| 日韩一区二区三区高清在线观看| 亚洲欧美日韩综合aⅴ视频| 国产精品9999久久久久仙踪林| 日本少妇在线观看| 精品日韩一区| 欧美成人性战久久| 欧美xxxxx在线视频| 黄色片免费在线观看| 成人午夜大片免费观看| 国产精品白嫩美女在线观看| 日韩欧美国产成人精品免费| 久久久免费毛片| 欧美日韩你懂的| 日本十八禁视频无遮挡| 久草资源在线观看| 久久嫩草精品久久久久| 99在线影院| 精品国产www| 亚洲免费黄色| 久久视频在线播放| 国产精品20p| 老牛国内精品亚洲成av人片| 在线不卡一区二区| 久久精品99国产| 欧美男男video| 欧美激情综合五月色丁香小说| 99re在线观看视频| 伊人久久成人网| 性高湖久久久久久久久| 蜜臀久久99精品久久久久久宅男| 日本少妇高潮喷水xxxxxxx| 97人人澡人人爽91综合色| 欧美日韩一区国产| 免费国产成人av| 成入视频在线观看| 亚洲国产一区二区三区青草影视| 亚洲视频欧美在线| 国产在线日本| 久久综合狠狠综合久久综合88 | 成人深夜福利| 精品欧美激情精品一区| 男人添女荫道口喷水视频| 麻豆免费在线观看| 中文字幕亚洲在| 视频三区二区一区| 二区三区在线播放| 国产欧美精品在线观看| 日本一区不卡| 久久手机免费观看| 久久久三级国产网站| 久久99精品久久久久久秒播放器 | 麻豆亚洲av熟女国产一区二| 91久久夜色精品国产按摩| 永久555www成人免费| 色哟哟精品观看| 国产伦一区二区三区| 日韩精品中文字幕久久臀| 久久久久亚洲AV成人无码国产| 9l视频自拍蝌蚪9l视频成人 | 国产精品27p| 无码人妻丰满熟妇区五十路| 久久婷婷av| 国产成人精品优优av| 成人a v视频| 男女性色大片免费观看一区二区| 国产精品美女www| 亚洲午夜激情视频| 国产精一区二区三区| 91夜夜揉人人捏人人添红杏| 国产成年妇视频| 成人国产精品免费观看视频| 狠狠爱一区二区三区| 天堂网在线中文| 久久久精品国产免大香伊| 日韩中文一区| 嫩草香蕉在线91一二三区| 一区二区三区四区视频精品免费| 人妻激情另类乱人伦人妻| av在线小说| 日韩欧美在线视频观看| 日本a√在线观看| 成人黄色91| 亚洲大胆人体av| brazzers精品成人一区| 久久一区二区三区喷水| 欧美国产亚洲精品久久久8v| 日本三级一区二区| 免费看日韩精品| 亚洲影影院av| 青青青免费视频在线2| 国产精品久久综合| 日韩精品一区二区免费| 成人开心激情| 日韩午夜在线观看视频| 自拍偷拍亚洲天堂| 一本精品一区二区三区| 2019精品视频| 97人妻精品一区二区三区| 成人av网站在线| 亚洲资源在线网| 2021天堂中文幕一二区在线观| 欧美影院一区二区三区| 精品少妇人妻av一区二区三区| 国产精品嫩草影院在线看| 九九九久久久久久| 蜜臀99久久精品久久久久小说| 国产剧情在线观看一区二区| 日韩精品一区二区三区四区五区| 日韩欧美一起| 欧美视频三区在线播放| 91视频在线免费| 91精品国产成人观看| 日本一区二区在线播放| 不卡视频在线播放| 欧美国产一区二区在线观看| 给我免费播放片在线观看| 亚洲综合资源| 亚洲最新av在线网站| 国产91精品一区| 丰满亚洲少妇av| 国产精品12p| 欧美大片1688网站| 亚洲精品日韩在线| 亚洲精品午夜久久久久久久| 国内精品视频666| 日本中文不卡| 午夜激情在线播放| 亚洲福利视频网| 91在线播放观看| 极品少妇xxxx偷拍精品少妇| 亚洲精品自在在线观看| 午夜精品成人av| 日韩av中文在线| 久久精品国产av一区二区三区| 国产在线国偷精品产拍免费yy| 亚洲视频在线二区| 欧美一级在线| 日韩一区二区三区xxxx| 亚洲一级在线播放| 中文字幕av一区二区三区高| 国产三级日本三级在线播放| 女一区二区三区| 97视频在线观看免费| 少妇高潮一区二区三区69| 亚洲在线中文字幕| 国产51自产区| 亚洲一级高清| 精品伦精品一区二区三区视频| 欧美人与性动交α欧美精品图片| 欧美一级高清大全免费观看| 天天看片中文字幕| 丁香激情综合国产| 国产人妻777人伦精品hd| 久本草在线中文字幕亚洲| 午夜精品蜜臀一区二区三区免费| 欧美一级在线免费观看| 亚洲午夜国产一区99re久久| 亚洲の无码国产の无码步美| 亚洲欧美日韩专区| 日韩成人av网站| 欧美成人毛片| 成人97在线观看视频| 亚洲成人一级片| 图片区日韩欧美亚洲| 中国一级特黄录像播放| 久久一二三四| 亚洲韩国在线| 中文字幕一区二区三区中文字幕| 欧美极品少妇与黑人| 熟妇人妻一区二区三区四区| 欧美性xxxx在线播放| 免费看黄色三级| 久久精品国产精品亚洲红杏| 91精品国产毛片武则天| 欧美理伦片在线播放| 国产精品久久久av久久久| 免费黄色网页在线观看| 欧美成人午夜电影| 最近免费中文字幕大全免费版视频| 欧美国产国产综合| www日本在线观看| 亚洲免费婷婷| 在线观看精品视频| 久9re热视频这里只有精品| 国产精品第七影院| 色爱综合区网| 亚洲欧美三级伦理| aaa一区二区| 色狠狠一区二区| 国产少妇在线观看| 国产日本亚洲高清| 一起草最新网址| 久久久久在线| 红桃一区二区三区| 国产一区二区三区探花| 91九色蝌蚪嫩草| 先锋欧美三级| 久久免费观看视频| 免费在线看a| 日韩精品中文字幕视频在线| 国产露脸国语对白在线| 欧美丝袜美女中出在线| 爱爱视频免费在线观看| 国产亚洲成av人在线观看导航| 少妇性l交大片7724com| 免费看日韩精品| 波多野结衣50连登视频| 综合天堂久久久久久久| 日韩区国产区| 欧美变态网站| 99久久久精品免费观看国产| 日韩精品一级毛片在线播放| 欧美亚洲视频一区二区| 欧美精品videosex| 最近的2019中文字幕免费一页| 午夜视频免费看| 欧美一卡二卡在线| 亚洲一区二区影视| 色网站国产精品| 欧美亚韩一区二区三区| 亚洲黄色小说网站| 成人黄色短视频| 国产人成亚洲第一网站在线播放| 成人在线电影网站| 国产福利精品导航| 亚洲欧美天堂在线| 蜜桃久久精品一区二区| 成人综合视频在线| 亚洲一区成人| 日韩伦理在线免费观看| 欧美99在线视频观看| 天堂v在线视频| 成人嫩草影院| 手机成人在线| re久久精品视频| 日韩中文一区二区三区| 欧美精品一二| 欧美一级片免费观看| 亚洲婷婷伊人| 清纯唯美一区二区三区| 亚洲综合小说图片| 日本不卡二区| av在线不卡免费观看| 色一情一乱一伦一区二区三区丨| 蜜臀久久99精品久久一区二区| 久久综合精品一区| 校花撩起jk露出白色内裤国产精品| 国产三级精品在线不卡| 天堂99x99es久久精品免费| 久久精品成人一区二区三区蜜臀| 美女呻吟一区| 免费日韩电影在线观看| 九九视频免费观看视频精品| 欧美日韩在线一二三| 精品精品99| 亚洲在线播放电影| 午夜精品婷婷| 成人一区二区免费视频| 国产精品久久久久久久免费软件 | 蜜桃av.网站在线观看| 欧美一区在线直播| 在线成人av观看| 国产精品香蕉av| 国产精品毛片aⅴ一区二区三区| 91精品国产综合久久久久久丝袜| 2023国产精华国产精品| 欧美 日韩 国产在线| 精品国产成人| 一级黄色免费在线观看| 欧美欧美全黄| 男人天堂1024| 免费一区二区视频| 日本黄色www| 91在线观看一区二区| 少妇av片在线观看| 亚洲精品美腿丝袜| 中文字幕在线观看免费视频| 欧美性感一类影片在线播放| 国产精品久久欧美久久一区| 欧美精品一区二区三区在线| 青青久在线视频免费观看| 精品国产一区二区三区久久久| 亚洲按摩av| 日韩av男人的天堂| 动漫一区二区三区| 欧美成人在线免费观看| 97久久视频| 欧美日韩黄色一级片| 美女视频一区二区三区| 无码人妻丰满熟妇区毛片蜜桃精品| av一区二区不卡| 国产精品视频在| 五月天精品一区二区三区| 一区二区乱子伦在线播放| 精品少妇一区二区三区日产乱码| 国产资源在线播放| 欧美—级高清免费播放| 亚洲精品555| 国产亚洲精品久久飘花| 亚洲不卡av不卡一区二区| 你懂的av在线| 国产一区二区视频在线播放| 一区二区精品免费| 亚洲综合久久久| 夜夜躁狠狠躁日日躁av| 亚洲激情小视频| а√天堂在线官网| 国产精品久久久久久久久影视| 国产精品毛片av| 久久免费视频2| 日本欧美韩国一区三区| 天堂久久久久久| 洋洋成人永久网站入口| 91成人国产综合久久精品| 精品视频在线导航| 人妖欧美1区| 成人激情视频在线观看| 欧美三级美国一级| 欧美 日本 亚洲| 成人一区在线观看| 成人在线观看小视频| 欧美年轻男男videosbes| 黄色大片在线免费观看| 91精品国产乱码久久久久久蜜臀| 亚洲日本视频在线| 一级黄色录像免费看| 欧美96一区二区免费视频| 久久精品—区二区三区舞蹈| 精品久久久久国产| 欧美视频久久久| 欧美高清电影在线看| 日韩高清在线观看一区二区| 一区二区精品免费视频| 久久精品国产精品亚洲精品| www亚洲色图| 欧美午夜宅男影院| 国产福利小视频在线观看| 日韩美女在线看| 亚洲视频分类| 色一情一乱一伦一区二区三区日本| 99re这里都是精品| 五月婷婷激情网| 精品调教chinesegay| 伊人网在线播放| 欧美高清视频一区| 日韩黄色在线观看| 欧美人与禽zoz0善交| 欧美日韩在线直播| 美女黄视频在线观看| 成人h猎奇视频网站| 午夜精品久久99蜜桃的功能介绍| 五月天国产视频| 亚洲综合清纯丝袜自拍| 色婷婷中文字幕| 欧美怡春院一区二区三区| 精品美女视频| 中文字幕色网站| 亚洲一二三区在线观看| 天天综合网天天综合| 青青a在线精品免费观看| 精品美女久久| 欧洲美女亚洲激情| 亚洲一区在线看| 四虎精品在永久在线观看 | 久久福利在线| 中文字幕免费高| 国产白丝网站精品污在线入口| 香蕉视频一区二区| 亚洲天堂av在线免费| 一级欧美视频| 国产一二三在线视频| 久久精品综合网| hs视频在线观看| 8x海外华人永久免费日韩内陆视频| 久久99影视| 日韩精品在线播放视频| 欧美日韩一区二区免费视频| 香蕉视频免费在线播放| 国产日韩欧美综合精品| 三级久久三级久久久| 精品国产乱码久久久久久鸭王1| 亚洲黄页网在线观看| 激情久久一区二区| 69sex久久精品国产麻豆| 久久久久国产精品厨房| 国产丰满果冻videossex| 91精品国产成人| 视频在线不卡免费观看| 国产精品久久久久久在线观看| 在线观看日韩毛片| 伊人精品影院| 日韩不卡av| 成人h动漫精品一区二| 中文永久免费观看| 97碰碰碰免费色视频| 999久久久91| 久久国产精品影院| 日韩视频免费观看高清在线视频|