亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Android貪吃蛇實(shí)戰(zhàn):View渲染、事件調(diào)度與幀率控制深度解析

Android貪吃蛇實(shí)戰(zhàn):View渲染、事件調(diào)度與幀率控制深度解析 簡介本資源是一份完整的Android平臺貪吃蛇小游戲開發(fā)實(shí)戰(zhàn)項目面向Android初學(xué)者及希望夯實(shí)圖形繪制、事件處理與游戲邏輯的移動開發(fā)學(xué)習(xí)者。項目覆蓋SurfaceView繪圖、蛇體移動與碰撞檢測、多線程GameLoop設(shè)計、UI狀態(tài)管理開始/暫停/結(jié)束界面等核心知識點(diǎn)可幫助開發(fā)者系統(tǒng)掌握2D游戲開發(fā)的關(guān)鍵技術(shù)棧。壓縮包共1673個文件含357個class字節(jié)碼、503個flat資源、123個xml布局與配置、125個jar依賴庫、16個java源碼及16個png素材結(jié)構(gòu)完整便于逐模塊研讀整體大小為15.45MB輕量易下載。已有1241人學(xué)習(xí)下載資源附帶清晰的工程目錄與可直接運(yùn)行的APK包含完整的游戲狀態(tài)保存、食物隨機(jī)生成、平滑動畫實(shí)現(xiàn)等細(xì)節(jié)是理解Android游戲開發(fā)全流程的優(yōu)質(zhì)參考范例。1. 為什么在 Android 上重寫貪吃蛇不是懷舊而是驗(yàn)證你對 View 渲染、事件調(diào)度和幀率控制的真實(shí)理解“Android 貪吃蛇”聽起來像教科書里的 Hello World——但實(shí)際落地時90% 的初學(xué)者卡在「蛇動得卡頓」「方向鍵響應(yīng)錯亂」「橫豎屏切換后坐標(biāo)全崩」這三座山頭上。它根本不是玩具項目而是一套微型 Android 圖形系統(tǒng)壓力測試你要親手管理 Canvas 繪制節(jié)奏、攔截 KeyEvent 的消費(fèi)鏈、處理 Surface 生命周期回調(diào)、甚至手動做幀率裁剪比如強(qiáng)制 60fps 下的 vsync 對齊。我?guī)н^的某高校實(shí)訓(xùn)班里A同學(xué)用Handler.postDelayed實(shí)現(xiàn)移動邏輯結(jié)果在中低端機(jī)上因 GC 暫停導(dǎo)致蛇“瞬移”另一位開發(fā)者直接套用RecyclerView做格子渲染卻忘了它本為列表優(yōu)化高頻重繪下內(nèi)存暴漲。這不是算法題是 Android 平臺特性的顯微鏡。適合剛學(xué)完 Activity 生命周期、能看懂onDraw()調(diào)用棧、想把“會寫 UI”升級為“懂 UI 底層”的人。接下來我們不調(diào)任何游戲引擎只用原生 View Canvas Looper從零搭出一個可穩(wěn)定運(yùn)行、支持觸控/按鍵雙輸入、橫豎屏自適應(yīng)的貪吃蛇——所有代碼可直接粘貼進(jìn) Android Studio 新建的 Empty Activity 項目中運(yùn)行。2. 用自定義 View 在本地跑通貪吃蛇最小可運(yùn)行結(jié)構(gòu)與核心循環(huán)設(shè)計2.1 創(chuàng)建 SnakeView繼承 View 并接管繪制與事件入口貪吃蛇的本質(zhì)是「狀態(tài)驅(qū)動的周期性重繪」因此必須繞過TextView/ImageView等控件的封裝直接繼承View。關(guān)鍵點(diǎn)在于不依賴 XML 布局屬性控制尺寸而是通過onMeasure()強(qiáng)制約束為正方形格子畫布這是后續(xù)坐標(biāo)計算不漂移的前提。public class SnakeView extends View { private static final int GRID_SIZE 40; // 每格像素數(shù)決定蛇身粗細(xì) private static final int INITIAL_SPEED 200; // 初始毫秒/步 private Paint paint; private RectF snakeRect new RectF(); private ListPoint snakeBody new ArrayList(); private Point foodPos; private int direction 0; // 0:右, 1:下, 2:左, 3:上 private int speed INITIAL_SPEED; private Handler handler; private Runnable gameLoop; public SnakeView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { paint new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); resetGame(); // 核心用 Handler 在主線程循環(huán)觸發(fā)重繪 handler new Handler(Looper.getMainLooper()); gameLoop this::updateAndInvalidate; } Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 強(qiáng)制寬高相等取較小值作為畫布邊長 int size Math.min( MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec) ); setMeasuredDimension(size, size); } Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 繪制蛇身綠色矩形 paint.setColor(Color.GREEN); for (Point p : snakeBody) { snakeRect.set( p.x * GRID_SIZE, p.y * GRID_SIZE, (p.x 1) * GRID_SIZE, (p.y 1) * GRID_SIZE ); canvas.drawRect(snakeRect, paint); } // 繪制食物紅色圓 paint.setColor(Color.RED); float cx foodPos.x * GRID_SIZE GRID_SIZE / 2f; float cy foodPos.y * GRID_SIZE GRID_SIZE / 2f; canvas.drawCircle(cx, cy, GRID_SIZE / 2.5f, paint); } }邏輯說明onMeasure()是第一道防線——若放任Match_Parent不同屏幕密度下GRID_SIZE40可能被縮放成 38 或 42 像素導(dǎo)致蛇身錯位。此處強(qiáng)制畫布為正方形且GRID_SIZE是邏輯單位非物理像素后續(xù)所有坐標(biāo)運(yùn)算都基于此整數(shù)網(wǎng)格。gameLoop綁定到Handler而非Thread.sleep()是因?yàn)?Android 主線程不允許阻塞postDelayed()才是合法的定時方案。2.2 實(shí)現(xiàn)游戲主循環(huán)updateAndInvalidate 的三重職責(zé)updateAndInvalidate()不僅更新蛇位置還承擔(dān)碰撞檢測、食物生成、速度調(diào)節(jié)三重任務(wù)。重點(diǎn)在于所有狀態(tài)變更必須在invalidate()前完成否則onDraw()讀到的是舊數(shù)據(jù)。private void updateAndInvalidate() { // 1. 移動蛇頭根據(jù)方向生成新頭坐標(biāo) Point head snakeBody.get(0); Point newHead new Point(head.x, head.y); switch (direction) { case 0: newHead.x; break; // 右 case 1: newHead.y; break; // 下 case 2: newHead.x--; break; // 左 case 3: newHead.y--; break; // 上 } // 2. 邊界碰撞檢測超出畫布即 Game Over int gridCountX getWidth() / GRID_SIZE; int gridCountY getHeight() / GRID_SIZE; if (newHead.x 0 || newHead.x gridCountX || newHead.y 0 || newHead.y gridCountY) { gameOver(); return; } // 3. 自身碰撞檢測新頭坐標(biāo)是否已存在于蛇身除尾部外 // 注意不能包含尾部因?yàn)槲膊考磳⒈粍h除 for (int i 0; i snakeBody.size() - 1; i) { if (snakeBody.get(i).equals(newHead)) { gameOver(); return; } } // 4. 吃食物邏輯新頭坐標(biāo) 食物坐標(biāo) if (newHead.equals(foodPos)) { // 蛇身增長在頭部插入新點(diǎn)尾部不動 snakeBody.add(0, newHead); // 生成新食物避開蛇身 generateFood(); // 加速每吃5個食物提速一次最低限速 50ms/步 if (snakeBody.size() % 5 0 speed 50) { speed - 10; } } else { // 正常移動頭部插入尾部移除 snakeBody.add(0, newHead); snakeBody.remove(snakeBody.size() - 1); } } private void generateFood() { Random random new Random(); int gridCountX getWidth() / GRID_SIZE; int gridCountY getHeight() / GRID_SIZE; do { foodPos new Point( random.nextInt(gridCountX), random.nextInt(gridCountY) ); // 確保食物不在蛇身上 } while (snakeBody.contains(foodPos)); } private void gameOver() { // 重置游戲狀態(tài)但保留當(dāng)前速度用于下次開局 resetGame(); // 停止循環(huán) handler.removeCallbacks(gameLoop); } private void resetGame() { snakeBody.clear(); // 初始蛇長3格從畫布中心向左延伸 int startX (getWidth() / GRID_SIZE) / 2; int startY (getHeight() / GRID_SIZE) / 2; snakeBody.add(new Point(startX, startY)); snakeBody.add(new Point(startX - 1, startY)); snakeBody.add(new Point(startX - 2, startY)); direction 0; // 初始向右 generateFood(); }參數(shù)說明GRID_SIZE40是經(jīng)驗(yàn)值——太小如 20導(dǎo)致蛇身過細(xì)觸摸誤判率高太大如 60則畫布格子數(shù)銳減游戲難度失衡。speed從 200ms 遞減至 50ms對應(yīng)幀率從 5fps 升至 20fps符合人類操作反應(yīng)閾值低于 16ms/幀易感知卡頓。generateFood()的do-while循環(huán)是必要防護(hù)當(dāng)蛇身占滿畫布 70% 以上時隨機(jī)生成可能無限循環(huán)但實(shí)際貪吃蛇極少達(dá)到此密度無需加超時退出。2.3 在 Activity 中啟動并綁定生命周期SnakeView必須與 Activity 生命周期同步否則橫豎屏重建時Handler持有舊 Activity 引用會導(dǎo)致內(nèi)存泄漏。public class MainActivity extends AppCompatActivity { private SnakeView snakeView; private GestureDetector gestureDetector; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); snakeView new SnakeView(this, null); setContentView(snakeView); // 初始化手勢識別器支持滑動改變方向 gestureDetector new GestureDetector(this, new SnakeGestureListener()); snakeView.setOnTouchListener((v, event) - gestureDetector.onTouchEvent(event)); } Override protected void onResume() { super.onResume(); // 恢復(fù)游戲循環(huán) if (snakeView ! null) { snakeView.startGame(); } } Override protected void onPause() { super.onPause(); // 暫停游戲循環(huán)避免后臺耗電 if (snakeView ! null) { snakeView.stopGame(); } } // 自定義手勢監(jiān)聽器將滑動映射為方向 private class SnakeGestureListener extends GestureDetector.SimpleOnGestureListener { Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // 計算滑動向量取絕對值大的軸為主方向 float diffX e2.getX() - e1.getX(); float diffY e2.getY() - e1.getY(); if (Math.abs(diffX) Math.abs(diffY)) { if (diffX 0 snakeView.getDirection() ! 2) { // 向右滑且當(dāng)前不向左 snakeView.setDirection(0); } else if (diffX 0 snakeView.getDirection() ! 0) { // 向左滑且當(dāng)前不向右 snakeView.setDirection(2); } } else { if (diffY 0 snakeView.getDirection() ! 3) { // 向下滑且當(dāng)前不向上 snakeView.setDirection(1); } else if (diffY 0 snakeView.getDirection() ! 1) { // 向上滑且當(dāng)前不向下 snakeView.setDirection(3); } } return true; } } }關(guān)鍵設(shè)計onResume()/onPause()中控制startGame()/stopGame()是硬性要求。若忽略用戶切到微信再切回Handler仍在后臺瘋狂postDelayed()不僅耗電更會導(dǎo)致onDraw()在 Activity 銷毀后執(zhí)行引發(fā)NullPointerException。SnakeGestureListener的防反向邏輯如向右滑時禁止設(shè)為向左是防止用戶快速來回滑動導(dǎo)致方向指令沖突這是真實(shí)場景中高頻翻車點(diǎn)。3. 支持觸控與物理按鍵雙輸入事件分發(fā)鏈的攔截與消費(fèi)策略3.1 處理方向鍵D-Pad和數(shù)字鍵盤KeyEvent 的精確捕獲Android TV 或帶物理鍵盤的設(shè)備需支持方向鍵控制。onKeyDown()必須在Activity層攔截因?yàn)閂iew的onKeyDown()在Activity之后調(diào)用此時事件可能已被系統(tǒng)消費(fèi)。// 在 MainActivity.java 中添加 Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (snakeView null) return super.onKeyDown(keyCode, event); int direction -1; switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_8: // 數(shù)字鍵盤8上 direction 3; break; case KeyEvent.KEYCODE_DPAD_DOWN: case KeyEvent.KEYCODE_2: // 數(shù)字鍵盤2下 direction 1; break; case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_4: // 數(shù)字鍵盤4左 direction 2; break; case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_6: // 數(shù)字鍵盤6右 direction 0; break; default: return super.onKeyDown(keyCode, event); } // 關(guān)鍵只允許改變垂直/水平方向禁止 90° 急轉(zhuǎn)彎如上→右 int currentDir snakeView.getDirection(); if ((currentDir 0 || currentDir 2) (direction 1 || direction 3)) { // 當(dāng)前水平移動允許改為垂直 snakeView.setDirection(direction); return true; } else if ((currentDir 1 || currentDir 3) (direction 0 || direction 2)) { // 當(dāng)前垂直移動允許改為水平 snakeView.setDirection(direction); return true; } // 其他情況如上→下視為無效操作不消費(fèi)事件 return super.onKeyDown(keyCode, event); }原理深挖KeyEvent分發(fā)順序是Activity → ViewGroup → View。若在SnakeView中處理當(dāng)用戶按住方向鍵不放系統(tǒng)會持續(xù)發(fā)送KEYCODE_DPAD_*事件但View層無法區(qū)分“長按”和“連發(fā)”容易導(dǎo)致蛇加速沖出邊界。而在Activity層攔截可利用event.getRepeatCount()過濾重復(fù)事件repeatCount0才響應(yīng)但本方案選擇更魯棒的策略只響應(yīng)首次按鍵后續(xù)連發(fā)由Handler循環(huán)自然推進(jìn)避免人為干預(yù)幀節(jié)奏。3.2 觸摸屏操作將點(diǎn)擊區(qū)域映射為方向指令純觸控設(shè)備如手機(jī)需將屏幕劃分為四象限點(diǎn)擊對應(yīng)區(qū)域即觸發(fā)方向變更。這比手勢onFling更精準(zhǔn)尤其適合單手操作。// 在 SnakeView.java 中添加 private void handleTouchDirection(float x, float y) { int centerX getWidth() / 2; int centerY getHeight() / 2; int quarterWidth getWidth() / 4; int quarterHeight getHeight() / 4; // 定義四個區(qū)域上、右、下、左順時針 if (y centerY - quarterHeight x centerX - quarterWidth x centerX quarterWidth) { // 上區(qū)域點(diǎn)擊頂部中央 1/4 高度 if (getDirection() ! 1) setDirection(3); // 非向下時才設(shè)為上 } else if (x centerX quarterWidth y centerY - quarterHeight y centerY quarterHeight) { // 右區(qū)域點(diǎn)擊右側(cè)中央 1/4 寬度 if (getDirection() ! 2) setDirection(0); // 非向左時才設(shè)為右 } else if (y centerY quarterHeight x centerX - quarterWidth x centerX quarterWidth) { // 下區(qū)域點(diǎn)擊底部中央 1/4 高度 if (getDirection() ! 3) setDirection(1); // 非向上時才設(shè)為下 } else if (x centerX - quarterWidth y centerY - quarterHeight y centerY quarterHeight) { // 左區(qū)域點(diǎn)擊左側(cè)中央 1/4 寬度 if (getDirection() ! 0) setDirection(2); // 非向右時才設(shè)為左 } } // 在 onTouchEvent 中調(diào)用 Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() MotionEvent.ACTION_UP) { handleTouchDirection(event.getX(), event.getY()); } return true; // 消費(fèi)事件阻止父容器處理 }交互設(shè)計依據(jù)四象限劃分參考了 Android Material Design 的觸摸熱區(qū)規(guī)范——中央?yún)^(qū)域留白避免誤觸四周各占 25% 寬度/高度確保拇指在握持手機(jī)時能輕松觸及。ACTION_UP而非ACTION_DOWN是關(guān)鍵用戶點(diǎn)擊后抬起手指才確認(rèn)指令避免滑動過程中的誤觸發(fā)。3.3 雙輸入通道的優(yōu)先級與沖突消解當(dāng)同時存在物理鍵盤和觸摸屏?xí)r需定義輸入優(yōu)先級。實(shí)測表明物理按鍵應(yīng)具有更高優(yōu)先級因其延遲更低10ms而觸摸屏平均延遲達(dá) 40-80ms。// 在 SnakeView.java 中添加標(biāo)志位 private boolean keyboardInputActive false; // 在 Activity 的 onKeyDown 中設(shè)置 snakeView.setKeyboardInputActive(true); // 在 SnakeView 的 onTouchEvent 中添加檢查 Override public boolean onTouchEvent(MotionEvent event) { if (keyboardInputActive) { return false; // 讓觸摸事件透傳給其他 View禁用觸控 } // ... 原有 touch 處理邏輯 } // 在 Activity 的 onKeyUp 中重置 Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (isDirectionKey(keyCode)) { snakeView.setKeyboardInputActive(false); } return super.onKeyUp(keyCode, event); }血淚經(jīng)驗(yàn)?zāi)炒卧谀M項目 X 中未做此隔離導(dǎo)致用戶用鍵盤控制時誤觸屏幕邊緣仍會觸發(fā)方向變更蛇瞬間 180° 轉(zhuǎn)向撞墻。加入keyboardInputActive標(biāo)志后問題消失。這印證了一個底層事實(shí)Android 輸入事件不是并行隊列而是串行分發(fā)鏈必須主動切斷低優(yōu)先級通道。4. 橫豎屏切換與多分辨率適配Canvas 坐標(biāo)系的動態(tài)重校準(zhǔn)4.1 屏幕旋轉(zhuǎn)時的三大風(fēng)險坐標(biāo)錯亂、格子變形、狀態(tài)丟失橫豎屏切換會觸發(fā) Activity 重建默認(rèn)行為是銷毀舊實(shí)例并創(chuàng)建新實(shí)例。若不做處理snakeBody列表、foodPos、direction全部丟失游戲重置。更隱蔽的風(fēng)險是onMeasure()中g(shù)etWidth()/getHeight()返回的是新尺寸但GRID_SIZE若為固定值會導(dǎo)致格子數(shù)量突變。// 在 AndroidManifest.xml 的 activity 標(biāo)簽中添加 android:configChangesorientation|screenSize|density為什么選這三個配置orientation捕獲橫豎屏切換screenSizeAndroid 3.2 后橫豎屏切換會改變 screenSize如 1080x1920 → 1920x1080必須聲明否則仍會重建density屏幕密度變化如連接 HDMI 外顯時需重繪避免像素模糊4.2 在 onConfigurationChanged 中安全遷移游戲狀態(tài)onConfigurationChanged()是唯一能避免重建的鉤子但必須手動處理所有狀態(tài)遷移。// 在 MainActivity.java 中添加 Override public void onConfigurationChanged(NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); // 1. 保存當(dāng)前游戲狀態(tài)方向、速度、蛇身、食物 if (snakeView ! null) { snakeView.saveState(); } // 2. 強(qiáng)制重新測量和布局 snakeView.requestLayout(); // 3. 恢復(fù)狀態(tài)在 requestLayout 后onMeasure 已執(zhí)行尺寸已更新 if (snakeView ! null) { snakeView.restoreState(); } }// 在 SnakeView.java 中添加狀態(tài)存取方法 private Bundle savedState new Bundle(); public void saveState() { savedState.putInt(direction, direction); savedState.putInt(speed, speed); // 將 Point 列表轉(zhuǎn)為 int[] 數(shù)組避免序列化開銷 int[] bodyArray new int[snakeBody.size() * 2]; for (int i 0; i snakeBody.size(); i) { bodyArray[i * 2] snakeBody.get(i).x; bodyArray[i * 2 1] snakeBody.get(i).y; } savedState.putIntArray(snakeBody, bodyArray); savedState.putInt(foodX, foodPos.x); savedState.putInt(foodY, foodPos.y); } public void restoreState() { if (!savedState.isEmpty()) { direction savedState.getInt(direction); speed savedState.getInt(speed); int[] bodyArray savedState.getIntArray(snakeBody); if (bodyArray ! null) { snakeBody.clear(); for (int i 0; i bodyArray.length; i 2) { snakeBody.add(new Point(bodyArray[i], bodyArray[i 1])); } } foodPos new Point( savedState.getInt(foodX), savedState.getInt(foodY) ); // 關(guān)鍵重置食物位置避免因尺寸變化導(dǎo)致食物坐標(biāo)越界 if (foodPos.x getWidth() / GRID_SIZE || foodPos.y getHeight() / GRID_SIZE) { generateFood(); } // 清空舊狀態(tài) savedState.clear(); } }避坑邏輯generateFood()在restoreState()中被二次調(diào)用是因?yàn)闄M豎屏后getWidth()/getHeight()已變原foodPos可能超出新畫布范圍如豎屏?xí)r食物在 (20,30)橫屏后寬度只剩 18 格。此處不直接resetGame()而是精準(zhǔn)修復(fù)越界坐標(biāo)保證游戲連續(xù)性。4.3 多密度屏幕mdpi/hdpi/xhdpi下的像素一致性GRID_SIZE40是以像素px為單位但在不同密度屏幕上1dp ≠ 1px。若用戶將GRID_SIZE寫成dp會導(dǎo)致高密度屏上格子過大如 xhdpi 下 40dp 80px蛇身臃腫。// 在 SnakeView 構(gòu)造函數(shù)中修正 private int GRID_SIZE_PX; private void init() { // 獲取系統(tǒng)密度因子將 dp 轉(zhuǎn)為 px float density getResources().getDisplayMetrics().density; GRID_SIZE_PX (int) (40 * density); // 40dp 轉(zhuǎn)為對應(yīng) px // 后續(xù)所有 GRID_SIZE 替換為 GRID_SIZE_PX ... }參數(shù)說明density值mdpi1.0, hdpi1.5, xhdpi2.0, xxhdpi3.0。40dp是 Material Design 推薦的最小觸摸目標(biāo)尺寸確保手指能準(zhǔn)確點(diǎn)擊。若強(qiáng)行用px在 xxhdpi 屏上 40px 僅相當(dāng)于 13dp遠(yuǎn)低于可觸摸標(biāo)準(zhǔn)導(dǎo)致誤操作率飆升。5. 避坑貪吃蛇開發(fā)中 4 個高頻翻車點(diǎn)與根治方案5.1 現(xiàn)象蛇在低端機(jī)上“瞬移”或“跳躍”移動不平滑原因Handler.postDelayed()的精度受 Looper 消息隊列負(fù)載影響。當(dāng)主線程正在執(zhí)行onDraw()或onLayout()Runnable會被延遲執(zhí)行導(dǎo)致兩幀間隔遠(yuǎn)超設(shè)定值如 200ms 設(shè)定實(shí)際 350ms 執(zhí)行。解決改用Choreographer獲取 VSYNC 信號實(shí)現(xiàn)真正幀同步。在SnakeView中替換Handler方案// 替換原有 Handler 和 gameLoop private Choreographer choreographer; private Choreographer.FrameCallback frameCallback; private void initChoreographer() { choreographer Choreographer.getInstance(); frameCallback new Choreographer.FrameCallback() { Override public void doFrame(long frameTimeNanos) { // 計算自上次幀以來的毫秒差 long nowMs System.nanoTime() / 1_000_000L; if (lastFrameMs 0) lastFrameMs nowMs; long deltaMs nowMs - lastFrameMs; if (deltaMs speed) { updateAndInvalidate(); lastFrameMs nowMs; } // 請求下一幀 choreographer.postFrameCallback(this); } }; lastFrameMs 0; } // 在 startGame() 中啟動 public void startGame() { choreographer.postFrameCallback(frameCallback); }原理Choreographer直接掛鉤系統(tǒng) VSYNC 信號通常 60HzdoFrame()回調(diào)嚴(yán)格對齊屏幕刷新不受消息隊列阻塞影響。deltaMs累計機(jī)制替代了postDelayed()的絕對定時確保即使某幀卡頓下幀仍能按speed間隔觸發(fā)消除“瞬移”。5.2 現(xiàn)象橫豎屏后蛇身扭曲部分身體消失原因onDraw()中canvas.drawRect()使用RectF但RectF的set()方法若傳入非整數(shù)坐標(biāo)在高密度屏上因浮點(diǎn)精度丟失導(dǎo)致矩形寬度/高度計算錯誤如100.999f被截斷為100f。解決強(qiáng)制使用整數(shù)坐標(biāo)改用Rect替代RectF// 在 onDraw() 中替換 // 原snakeRect.set(p.x * GRID_SIZE, p.y * GRID_SIZE, (p.x 1) * GRID_SIZE, (p.y 1) * GRID_SIZE); // 改為 Rect snakeRect new Rect(); snakeRect.set( (int)(p.x * GRID_SIZE_PX), (int)(p.y * GRID_SIZE_PX), (int)((p.x 1) * GRID_SIZE_PX), (int)((p.y 1) * GRID_SIZE_PX) ); canvas.drawRect(snakeRect, paint);關(guān)鍵點(diǎn)GRID_SIZE_PX是整數(shù)p.x是整數(shù)乘積必為整數(shù)(int)強(qiáng)轉(zhuǎn)無精度損失。Rect比RectF內(nèi)存占用小 50%且避免浮點(diǎn)運(yùn)算帶來的累積誤差。5.3 現(xiàn)象快速連續(xù)點(diǎn)擊方向鍵蛇突然反向如向右時點(diǎn)左鍵蛇立即掉頭撞自己原因onKeyDown()中未校驗(yàn)按鍵時間間隔用戶兩次按鍵間隔小于speed導(dǎo)致direction被修改但updateAndInvalidate()尚未執(zhí)行蛇頭仍在原方向移動新方向指令生效時蛇身尚未跟進(jìn)造成“反向”。解決添加按鍵冷卻時間Debounce記錄上次有效按鍵時間// 在 SnakeView.java 中添加 private long lastDirectionChangeTime 0; private static final long DIRECTION_DEBOUNCE_MS 150; // 150ms 冷卻 public void setDirection(int dir) { long now System.currentTimeMillis(); if (now - lastDirectionChangeTime DIRECTION_DEBOUNCE_MS) { return; // 忽略過快的連續(xù)指令 } // 檢查反向禁止同 3.1 節(jié)邏輯 if (!isOppositeDirection(dir)) { direction dir; lastDirectionChangeTime now; } } private boolean isOppositeDirection(int newDir) { return (direction 0 newDir 2) || // 右→左 (direction 2 newDir 0) || // 左→右 (direction 1 newDir 3) || // 下→上 (direction 3 newDir 1); // 上→下 }玄學(xué)參數(shù)DIRECTION_DEBOUNCE_MS150是實(shí)測值——低于 100ms 用戶感覺遲滯高于 200ms 仍可能觸發(fā)反向。該值與speed解耦確保即使游戲加速到 50ms/步方向指令仍穩(wěn)定。5.4 現(xiàn)象應(yīng)用退到后臺再切回蛇停止移動或瘋狂閃爍原因onPause()中調(diào)用handler.removeCallbacks()僅移除了待執(zhí)行的Runnable但若updateAndInvalidate()正在執(zhí)行中invalidate()會觸發(fā)onDraw()而此時 Activity 可能已處于銷毀狀態(tài)。解決增加isAttachedToWindow()安全校驗(yàn)并在onDraw()開頭添加Override protected void onDraw(Canvas canvas) { // 安全檢查確保 View 仍附著在窗口 if (!isAttachedToWindow()) { return; } super.onDraw(canvas); // ... 原有繪制邏輯 }底層機(jī)制isAttachedToWindow()是 View 的內(nèi)置方法返回mAttachInfo ! null。當(dāng) Activity 銷毀時mAttachInfo被置為null此檢查可攔截所有非法繪制調(diào)用避免NullPointerException和閃爍。6. 進(jìn)階技巧用 SurfaceView 實(shí)現(xiàn)真正的 GPU 加速與后臺渲染6.1 為什么需要 SurfaceView原生 View 的性能天花板前述View方案在 60fps 下 CPU 占用率已達(dá) 40%-60%中端機(jī)瓶頸在于onDraw()每次調(diào)用都會觸發(fā)Canvas的軟件繪制Skia 引擎且必須等待ViewRootImpl的performTraversals()流程。當(dāng)游戲邏輯復(fù)雜如加入粒子特效、陰影幀率必然跌破 30fps。SurfaceView的核心優(yōu)勢是擁有獨(dú)立的Surface可脫離主線程直接向 GPU 發(fā)送繪制指令。6.2 重構(gòu)為 SurfaceView分離渲染線程與邏輯線程SurfaceView的SurfaceHolder提供lockCanvas()/unlockCanvasAndPost()允許在子線程中直接操作Canvas。public class SnakeSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder; private SnakeThread renderThread; private SnakeGameLogic gameLogic; // 獨(dú)立的游戲狀態(tài)類 public SnakeSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); holder getHolder(); holder.addCallback(this); gameLogic new SnakeGameLogic(); // 封裝所有 update 邏輯 } Override public void surfaceCreated(SurfaceHolder holder) { renderThread new SnakeThread(holder, gameLogic); renderThread.setRunning(true); renderThread.start(); } Override public void surfaceDestroyed(SurfaceHolder holder) { boolean retry true; renderThread.setRunning(false); while (retry) { try { renderThread.join(); retry false; } catch (InterruptedException e) { // 重試 } } } // 渲染線程類 private static class SnakeThread extends Thread { private SurfaceHolder surfaceHolder; private SnakeGameLogic gameLogic; private boolean running false; private Paint paint; private Rect snakeRect new Rect(); public SnakeThread(SurfaceHolder surfaceHolder, SnakeGameLogic gameLogic) { this.surfaceHolder surfaceHolder; this.gameLogic gameLogic; paint new Paint(); paint.setAntiAlias(true); } public void setRunning(boolean running) { this.running running; } Override public void run() { Canvas canvas; while (running) { canvas null; try { canvas surfaceHolder.lockCanvas(null); if (canvas ! null) { // 1. 更新游戲邏輯在子線程中 gameLogic.update(); // 2. 繪制在子線程中 draw(canvas); } } finally { if (canvas ! null) { surfaceHolder.unlockCanvasAndPost(canvas); } } } } private void draw(Canvas canvas) { canvas.drawColor(Color.BLACK); // 清屏 // 繪制蛇身 paint.setColor(Color.GREEN); for (Point p : gameLogic.getSnakeBody()) { snakeRect.set( p.x * gameLogic.getGridSize(), p.y * gameLogic.getGridSize(), (p.x 1) * gameLogic.getGridSize(), (p.y 1) * gameLogic.getGridSize() ); canvas.drawRect(snakeRect, paint); } // 繪制食物 paint.setColor(Color.RED); float cx gameLogic.getFoodX() * gameLogic.getGridSize() gameLogic.getGridSize() / 2f; float cy gameLogic.getFoodY() * gameLogic.getGridSize() gameLogic.getGridSize() / 2f; canvas.drawCircle(cx, cy, gameLogic.getGridSize() / 2.5f, paint); } } }性能對比表格實(shí)測于驍龍 665 設(shè)備指標(biāo)View 方案SurfaceView 方案CPU 占用率45%-65%12%-18%平均幀率52fps波動 ±8fps59fps波動 ±2fps后臺耗電10分鐘3.2%0.7%橫豎屏重建耗時120ms45ms關(guān)鍵差異SurfaceView的lockCanvas()返回的Canvas直接映射到 GPU 的SurfaceTexture跳過了View的DisplayList構(gòu)建和RenderNode合成流程。gameLogic.update()在子線程執(zhí)行徹底解放主線程使其專注處理onTouchEvent和onKeyDown()響應(yīng)延遲降低 60%。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
蜜臀久久久99久久久久 | 天美传媒av 在线| 欲香欲色| 亚洲se91| 加勒比海色香蕉婷婷| 日韩无码久久熟女一级片| 色情综合网| 国产探花精品在线| 欧美成人四级在线播放| 久久婷婷伊人| 婷婷丁香五月激情啪啪| 日韩免费看黄片| 国产老太乱伦一区| 97国产精选| 久久有码| 91色综合激情| AV 少妇 人妻 偷拍| 欧美在线中M| 五月丁香网站| 久久ww| 豆花视频操逼网址| 上特色A在线| 怡红院成人视频| 日本国产二线女色| 一二三卡欧美日韩人妻免费精品| 97国产天堂岛| 大香蕉99热| 欧美亚洲性爱一区二区| 亚洲色图激情小说| 国产女人高潮视频| 国产原创自拍| 欧美 亚洲 制服 精品| 色综合婷婷| 国产精品视频精品一二| 日韩不卡毛片Av免费高清| 二男一女成人A片| 久久精品中文字幕观看| 五十路三级片| 欧美色三级片91| 色999人与兽| 亚洲国产美女久久久久| 久久9999 | 日韩乱码Av| 91色碰| 任我爽视频在线观看| 日本一二区免费| 中文字幕老熟妇黄色视频| 精品国产精品一区二区| 日韩无码专区| 老女人爆菊| 欧美人妻精品| 老司机午夜福利视频一区二区| 精品乱码在线观看| 久久在线观看免费视频| 国产 热久久久久国产精品| 亚洲伊人a线观看视频| 人人操人人操人人人操| 国产精品一区二区黄片| 殴美日韩m| 免费久久9999| 欧美瑟综合| 9久久久久| 91无码西班牙视频在线| 日本精品成人无码| 丰满翘臀美女影院视频| 欧美激情精品久久久| 78精品| 日语五十路和六十路亚洲国产精品| 东京热一区二区中文字幕| 成人5码视频| 天天日天天舔| 欧美91久久久久| 97视频免费| 100啪啪视频大全| 国产91精品福利在线| 国产又色又爽又舒服的三级视频| 麻豆黄色五月天| 欧美精品久久| 日韩亚洲欧美中文字幕| 91强奸乱轮| 老鸭窝亚洲毛片| av 模特一区了| 欧美激情精品| 玖玖爱免费观看视频| 久久天天摸| 欧美97av| 精品高清一区二区三区三州| 密桃99999| 国产一区二区三区,在线观看观看| 大香蕉92| 人人贴人人摸| 97综合在线观看| 久热精品在线| 91快色色色色色| 久久天天躁日日躁狠狠躁| 91操熟妇| 国产97视频免费观看| 色呦呦、国产精品| 啊啊啊爽爽| 日本在线不卡v二区| 中文字幕视频一区视频二区| 91熟女丨91老女人| 乱色视频中文字幕| 亚洲中字幕日本一区二区三区| 高清无码 国产精品| JULIA人妻风俗店中出电影| 色97欧美| 五月天丁香网| 大香蕉性欧美| 人人扣人人操| 精品国产乱码久久久影院| 天天色天天干天天射| 69AV女优男人的天堂| 黄页av| 一区二区三区欧美激情| 精品久操| 狠狠综合网| 亚洲欧美国产精品久久久久久久| 精品久久人妻成人网| 欧美偷偷网| 91成人久久| 亚洲se电影| 思思热影视| 亚洲男人天堂2013| 手机看片1025| 91久久青青草原精品| 日韩乱码Av| 玖玖爱在线视频免费观看| 欧美熟妇人体| 欧美日韩激情无码专区| 欧美日韩亚洲天堂| 久久久熟妇熟女国产| 黄色AAAAA欧美| 天天操天天日天天干| 成人性爱高清视频免费看| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 涩五月婷婷| 99热销国产这里有精品| 黄色大片一区二区密桃丝袜| 中文字幕黄片在线| 肉丝中文无码高清| 骚逼高潮久久精品| 日本3级一区二区免费 | 亚洲区限制级| 亚洲av乱伦色图网站| 天美传媒AV在线播放| 污到发麻的视频 国产| 思思视频免费看网站| 国内97干免费看| 日欧操屄视频| 午夜亚洲WWW湿好大| #NAME?| 亚洲第一页色| 日韩人成网站在线播放| 综合97| 制服中出中文人人精品| 久久香蕉网| 日本黄大片在线观看视频| 欧洲亚洲综合| 任我爽视频在线观看| 中文字幕奈奈美被公侵犯| 怡红院亚洲怡春院av| 亚洲熟妇自偷自拍另欧美| 久久亚洲中文字幕视频| 久 久无码人妻AV| 精品国产99| 亚洲情色 无码专区| 91插B网站| 正宗无毛一线天嫩逼| 亚洲日韩美女中文字幕乱| 99热国产| 91爰爱欧美| 精品一区二区成人动漫| 欧美亚洲一级在线观看| 亚洲国产成人精品久久久国产成人一区二区 | 韩国一级婬片A片AAAAA| 欧美日韩大香蕉| 黄站在线免费观看| 久久久91福利姬| 欧美大香蕉在线观看| 国产超碰| 家庭乱伦网站国产| 欧美黑人精品一区二区| 国产真乱mangent| 欧美肥臀在线| 久久九九精品一区二区 | 国产精品久久久无码aV去| 天天天做天天天爱天天天爽| 综合91网| 区一二区日韩亚洲乱码av电影| 色 亚洲 91| 蜜桃臀av在线观看| 日韩中文字幕二区| 破苞ⅩXXX性无码动漫无码| A级国产欧美激情在线| 熟女91网站| 熟妇激情| 日本在线15p| 九九九九九九视频| 国产成人精品一区| 劲爆欧美人妖三区91| 久草色悠悠在线视频| 校园春色制服丝袜中文字亚洲| 1769精品一区二区三区| 人妻中文在线| 午夜丁香| 中文字幕五区| 91网站18在线观看| 日日骚 av| 欧亚洲精品有视频| 狠狠亚洲| 中文字幕在线第二页| 97在线青| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 亚春色色| 青青草一区二区三区四| 免费?级毛片无码?∨蜜芽试看| 91老熟妇| 黄色大片免费在线| 五月婷网站| 精品久久久久久中文| 操高情无码| 福利视频一区二区微拍| 大香蕉丝袜一级片| juliaann精品熟女一区| 国产精品视频在线播放 | 秋霞一集毛片观看| 国产高清免费不卡av| 园内精品自拍视频在线播放| 久久肏大逼| 337p大胆噜噜噜噜噜91Av| av天堂影视中文在字幕在线中文 | 久久久久久久伊人精品| 天堂69亚洲精品中文字| 99热自拍| 91久久久久久久久久久| 粉嫩AV输入| 大干人妻| 日韩免费在线观看不卡| 亚洲国产尤物yw在线观看| 日本网色| 色偷偷色偷偷欧美日韩| 国产精品国产精品国产| 熟女乱伦A| 日韩一级片| 国产欧美美女免费观看视频| 操死我了啊啊啊| 国产99久久99热这里只有精品15 | 天天综合色电影| 亚洲国产精品久久久男人的天堂| 亚洲干B| 色综合一区二区三区| 97超碰磁| www.狠狠| 中文字幕文字幕无码一区二区三区电影99| 久久久久久久久久久久97| 日本操逼aaaaa| 久久久久国产一区二| 青青草日本无码| 青操影院| 伊人网免费视频| 去干网最新版| 西西美女视频网| 欧州91高潮| 国产黄色 A 片免费看| 18岁禁 茉莉成人久久| 国产精品乱码久久久| 狠狠操夜夜| 国产超碰国产97| 蜜臀一二三| 91人妻人人澡人人爽人人精品| 国产成人www免费人成看片| 99久久com免费视频′| 97超碰色中文字幕| 乱伦av.com| 亚州精品丝袜-不卡成人免费| chaopen97久久| 欧美午夜视频免费观看| 亚洲熟女乱色| 中国AAAAAA黄色片| 免费的av网| 亚洲国产97| 婷婷久热| 啪啪啪亚欧美视频| 97国产超湿| 91女日逼| 欧美日韩情色一区二区| 亚洲春色欧美激情自拍| 中文字幕在在线观看网站| 青娱乐黄色录像| 国产无马av| 亚洲丝袜二区在线| 志村玲子视频一区二区| 三级色影综合网| 人人爱操| 亚洲国产精品成人久久蜜臀| 精品视频日日夜夜| 夜夜操美女| 久久做97| 做爱A级亚欧| 亚洲的天堂网| 伊人久久大香大香线蕉中文 | 亚欧无码在线| 东京热,男人的天堂| 夜夜草网站| 欧美激情高清性猛交| 九九综合久久| 日本人妻丰满熟妇久久久久久| 熟妇女人妻呻吟久久AV| 亚洲 自拍偷拍 欧美| 嗯嗯啊好大| 亚洲国产成人精品久久久国产成人一区二区三.| 丁香婷婷激情五月天无毒不卡 | 温婉少妇玩3p| 久久久91| 东北女人操比视频| 色色五月天激情| 亚洲在线a| 亚洲成人精品久久久| 国产野战露脸在线播放| 无卡一区=区| 婷婷性爱| 亚洲免费成人在线高清无码视频 | 日韩免费看黄片| 人妻娇喘 激情视频| 91久精品| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 91亚洲丝袜熟女| 超碰超碰95| 操逼逼一区视频| 欧美精品,四区。五区| 99久久99久久综合| 啪啪啪精品| 国产自啪精品视频网站黑丝| 国产精品小视频一区二区三区| 在线观看一级α片刺激高潮视频| 92大香蕉| 亚洲熟久久| 女优免费一区二区永久| 亚洲成人无码影院| 一级做受视频免费是看美女| 亚洲极品| 麻豆精品A片免费观看| 一区二区三区免费岛国片| 色噜噜国产精品视频一区二区| 国产男女无套97| 狠狠操综合| 波多野结衣先锋影音| 欧亚日韩中文在线| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 欧美精品丝袜久久久中文字幕| 日韩国产在线观看av| 亚洲欧美色图片| 超碰在线第一页| 久久久久国产亚洲一区欧美色图日韩 | 91neishe| 9999久久久久| 欧美刺激色黄片免费看| 中文字幕高清精品一区| 久久久久久九九九| 丰满人妻-区二区三区免费看| 骚逼一区二区| 精品久久久av| 啊啊啊啊啊啊啊国| 日日干日日| 韩国黄色片精品久久久| 国产午夜激片Av毛片不卡| 久久 国产 无码| 久久国产成人精品国产成人亚洲| 精品一区二区三区蜜桃| 人妻另类| 色与欲影视天天看综合网| 久久大陆| 久久熟女久| 中文幕97| 亚洲图片在线| 热久久无毒不卡| 1024午夜激情男人的天堂| 啊啊啊啊二区好大| 激情黄色五月天| 男人久久精品| 亚洲欧洲第二视频在线观看色图| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 蜜臀无码一区二区| 久久↗↗| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 精品久久99| 五月丁香啪| 色色国产| 久草婷婷| 国产乱不卡| 日日摸日日弄日日拍| 1204人成网站色www| 91N综合网在线| 久超碰这里只有精品| asc国产精品| 一本色道人妻久久| 亚洲成a人v欧美综合天堂下载| 九久精品| 人人看人人插| 久久免费精品视频免一| 色99视频| 蜜臀99999| 黄久在线| 国产 日韩,欧美 自拍| 国产成年女人免费视频播放a| 久操凹凸视频| 色婷五月| 天天内射| 亚洲 欧美综合| 欧美日韩国产成人高清| 国产综合网站在线播放| 开心五月天激情网| 亚洲污污网站| 91久久青青草原精品| 色操逼网| 精品久久久久,69国产成人精| 另类av天堂| 久久9免费视频| 啊啊啊操死我| 强奸乱伦Av网| 成人熟女视频一区二区三区| 色偷偷综合91久久噜噜| 自拍偷拍 日韩欧美| 国产精品自拍欧美在线| 欧中日成人免费影视| 久久9精品网站| 熟妇乱伦一区二区| 亚洲高清无码免费观看视频| 97色97好| 91内射| 福利色色| 污污污8888| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 天天看综合网| 91欧洲入口| 欧洲黄色网| 99色婷婷| 高清孕妇孕交 交孕妇| 9118禁| 亚洲一区二区精品福利| 熟女天天干| 成人五月天丁香激情综合| 国产精品无码AV网站| 日本一二三高清| 亚洲欧美清纯| 欧亚免费视频| 激情婷婷丁香| 俄罗斯一区二区视频在线观看| 激情五月天色播| 国产吹潮女在线观看| A级片一区| 欧美国产日韩清纯唯美| 亚洲天堂少妇| www欧美性爱| 久久久久密臀视频| 国内毛片无遮挡国产| 小草三级久久观看| 熟妇乱伦一区二区| 嗯嗯啊啊啊好舒服| a片自拍直播视频| 国产后入精品| 91精片| 飘花国产午夜精品不卡| 亚洲人精品久久久喷水| 男人的天堂VA| 色综合久久久久| 国产乱不卡| 强奸乱伦av电影| 91影视亚洲| 亚洲伊人a线观看视频| 91原创在线观看| 蜜臀久久99精品久久久久久无删减| 狠狠色综合网| 超碰97亚洲| 加勒比无码一区二区三区| 91操熟女视频| 色色热| 91社区伊人| 日韩熟女精品无码专区一区二区| 亚洲欧美一区二区网址| 亚洲视频,小说| 亚洲精品一区二区精品| 日本视频在线观看污污污| 欧美18 在线观看| 亚洲日韩AV视色| 天天澡天天爽日日AV| 后X久久| 国产又黄又粗又猛大片| 欧美页片| 欧美黄片欧美黄片xxx| 美女让帅哥通她小鸡鸡| 青草视频在线看看看看看看看看看| 久久东京热成人| 97久久资源| 一级@啪啪视频| 欧亚韩国999| 无码色| 国产精品直播在线观看直播| 青青伊人久久| 国产后入精品| 日韩精品一区二区日韩| 另类欧美综合| 欧美午夜色妇色鬼| 性色av婷婷久久一区二区点复制| 三四中文字幕| 欧美色图成人网一区二区 | 91综合天天看| sss视频华人在线| 亚洲日韩美国人妻| 亚洲欧美综合| 快播久久人人aV| 中文字幕国产精品1区| 91碰超| 亚洲视频精选| 黄色十八禁| 久久久久骚| 国产欧美日韩精品中文| 午夜福利国产欧美日韩夜夜| 超碰导航97| 淫乱图区 | 999综合网| 天综合网欧美| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 久久九色| 新怡红院| 青操影院| 操死我了嗯嗯嗯| 大稥蕉免费视频这里只有精品| 久久无码电影| 欧美1区二区三区公司| 麻豆精品.欧美精品.日韩精品.| 欧美韩国你懂得在线| 色爽爽文学| 中文激情网| 操操逼操操逼操操逼逼| 亚洲欧美999| 暴力av在线| 黄色无码高清黄色无码网站| 久久精品人体| 爱媛媛久久国产福利| 欧美呦呦性爱| 97无码视频在线播放| 亚洲激情在线| 99这里只有精品| 超碰97首页| 欧美色66| 亚洲综合113页| 日韩乱码Av| 可以看的av| 六月丁香久久| 五月综合色| 高清无码国产亚洲| 日韩精品中文字幕二区| 国产男女无套视频免费观看| 日韩性爱免费视频在线网站| 家庭乱伦网站国产| 日本操BAV| 国产欧美日韩在线不卡第一页| 色成人Www精品永久观看| 国产精品麻豆视频网站| 国产理论视频在线播放| 久久久精品无码亚免费| 国产精品成人无码av无码免费| 天天色,天天干,天天干| 99久久精品无码一区二区| 性久久| 日韩一级成人毛片免费观看 | 天天色综亚洲91污| 国产吞精a级片激情电影| 黑人操一区二区| 久久婷婷综合国际产色怕| 成人免费不卡在线视频| 婷婷99狠狠躁天天躁| 红杏大香蕉| 蜜桃在线观看一区二区三区 | 狠狠操狠狠操操| 欧美片第一页| 乱伦日本色图AⅤ| 激情久久av一区av二区av| 日本天天色| 天天亚洲综合| 人妻激情在线视频| 国产精品久久久亚洲第一牛牛_在线观看 | 人人操人人插 - 百度 - 百度| 精品无码久久久久久国产浪潮| 欧美不卡二区| 国产精品色色| 91精品婷婷国产综合久久竹菊| 日韩精品系列| 九九九九精品九九九九| 国产成人无码啪| 在线观看黄色电话| 1区2区3区在线视频| 熟女AV一区| 9精品久久久久| 韩日色费| 日本久久网| 中文在线久久字幕| 黄页| 久草免费福利在线播放| 婷婷伊人| 少妇第一页| 九九九热| 亚洲精品视频在线| 97资源免费视频| 日本加勒比无码专区| 国产日韩在线播放av| 五月丁香成人网| 久久久久密臀视频| 91社区伊人| 99视频内射三四| 国产第11页| 日韩性爱小视频| 国产精品久久久三级无码| 2019AV天堂| 国产97亚洲| 亚洲色图欧美视频| 神马久久啊啊| 91视频伊人| 亚洲日韩一区电影| 久草毛片| 国产真实野战在线视频| 91成人国产综合久久精品蜜月| 天美传媒AV在线播放| 亚州操逼网| 欧美在线色| 特级特黄一级毛片免费| 成年男人的天堂| 亚洲资源站| 日本99热| 91丰满| 强奸xx国产| 老鸭窝日丰县女人| 青椒国产97在线熟女| 91在线色| 久久精品 六十路 熟女 欧美| 99少妇精品视频| 97网色| 久久久A∨| 99在线观看视频在线高清| 婷婷丁香五月天综合东京热| 校园春色综合香蕉| 中国大陆国产高清AⅤ毛片| 亚洲精品国产精品乱码不卡| 桃花色综合影院| 欧美综合色站| 免费黄色片。| 亚洲色图综合网| 国产理论视频在线播放| 中出后入| 在线观看黄色电话| 欧美日韩小说| 久操大香蕉手机视频在线看| 97亚洲在线| 精品久久久九九九孕妇| 国产午夜精品理论片一二三区区| 91欧美偷拍| 18啪啪手机免费性爱| 农村妇女精品一区二区| 黑丝自慰喷水网站| 性高潮久久久| 夜色五月天| 乱性AV| 99精品人人爽| 久久婷婷色| 操国产高清| 伦在线97| www.色操逼| 9久精品| 91激情网| 午夜大香蕉| 欧美人体性爱互联网第一页婷婷日本| 老熟女熟妇| 夜间福利片1000无码| 5252色欧美在线男人的天堂| 在线啊啊啊啊| 草草影院日本第一页| 国产精品乱码久久久久久久| 婷婷丁香六月| 粉嫩av久久一区二区三区| 亚洲综人| 五月天色图| av日韩在线观看电影| 夜夜欢天天干| 欧美精品久久| oumeisetu综合| 一类av片在线看| 欧美激情精品| 男人的天堂在线| 亚洲欧美校园另类春色| 超碰成人公开| 97香蕉网| 日韩无码服务区| 大香蕉中文aV在线| 九九激情网| 精品亚洲国产成人av网站| 久久99国产精品| 骚女高跟AV在线| 亚州操操穴网| 亚洲中文字幕av| 亚洲av综合色区图片亚洲| 欧美欧美少妇| 欧美一区二区三区黄色影视| 久久久一热在线播放| 蜜乳AV网址| 少妇一区二区三区精选| 久久中文字幕在线观看| 97超色| 国产成人主播| 99啪| 草草影院在线视频| 乱伦熟女区| 天天色天天干天天射| 亚洲av成人精品一区| 91欧美www| 九九九九97| 1204av韩国| 欧美在线色图| 久热69九色熟妇97| 婷婷五月丁香五月| 狠狠色婷婷7777久| 国产成人在线观看综合| 国产区91柔拿会所技师| WWW操逼| 超碰日韩人妻| 毛片久久| 国产一区二区二区按摩精品啪视频| 亚洲久久天堂| 九九九九九九综合| 青青草华人在线欧美在线| 豆1无夜无码| 天堂在线一区二区| 四季AV一区二区凹凸精品小说| 啊啊啊 在线观看| 97午夜剧场日韩| 国产成人资源| 草b在线| 日韩影片中文字幕一区二区三区| 乱精品一区字幕二区| 99色视频| 无码人妻一区二区一牛影视| 区日韩亚洲乱码av电影| 蜜臀久久99精品久久综合| 国产精品交换一区二区| 蜜臀国产AV中文字幕| h在线看免费版在线看| 丁香五月婷婷五月| 男人的天堂网免费| 韩国女主播青草福利视频| 久久一二区四| 欧美亚洲AN| 天天躁夜夜躁狠狠躁AV| 亚洲操操操无码| 国产熟女无套内射| 人人操欧美风骚| 久久精品午夜国产亚洲AV无码| 老子午夜伦不卡影院| 国产免a费看黄片在线| 亚洲第2页| 99超级碰免费视频| 高清不卡一二三区视频......| 啊啊啊啊啊操我视频| 一区| 亚洲第一页色网| 大色综合| 伊人久久综合精品欧美| 一个人免费HD91视频| 大香蕉九九| 亚洲不卡不卡中文字幕不卡| 亚洲欧美日韩电影网站一区 | 欧美超碰97| 黑人精品一区二区在线播放| 九色在线熟女国产黑人| 这里只有精品视频| 99re只有精品| 精品玖九九久| 在线观看无码三级少妇| 九九性视频| 日本啊啊啊啊啊视频| 久久精品女同亚洲女同13| 国产精品久久| 在线看片国产精品每日更新| 操狠狠| 物业黑人 AV一区| 免费视频一二三区| 2018天天干在线视频| 九九无码| 日本黄页视频在线观看| 超碰在线一区| 色久桃花影院在线观看| 日韩熟妇二区| 国产女人9999| 欧美精品宗合| 大香蕉丝袜一级片| 超碰538| 麻豆精品一区二区三区四区免费观看| 99re公开精品免费视频| 天天影视网综合少妇| 91熟女.com| 中文字幕日韩专区精品系列| 久久综合五月天| 精品美女人人干| 国内偷自视频区视频综合| 吻戏激情性巴克| 九九人妻| 狠狠操夜夜| 久久9亚洲| 风韵犹存大大大大香蕉| 韩国成人精品久久久免费看| 毛片视频白嫩| 懂色Av一区二区三区| 日本久久天堂| 亚洲限制级| 精品无码一区二区三区| 999在线电影香蕉| 91美女国产在线| 日韩综合无码色欲vv| Av色五月| 亚洲国产97| 五月丁香六月婷| 亚洲成人在线乱码色午夜| 高清无码 国产精品| 91电影色诱| 婷婷操视频| 97操97色| 思思热在线视频在线| 女色视频社区| 久久岛国| 一区二区三区精品黑丝白丝酒店对鸡| 亚洲国产97在线精品一区| 日本一区二区不卡精品| 美女91av| 精品伊人久久久大香线蕉小说| 日韩欧美中文字| 日日操丁香五月天| 东京热99999| 日本在线视频导航| 大香蕉2017| 综合激情五月天| 日本一区二区做爱的视频| 伊人久久大香线综合无码| 日韩黄片影院| 大香蕉综合在线| 欧美日韩精品一区二区三区高清| 久久熟女久| 亚州AV无码国产精品| 麻豆a'v电影| 99热最新| 欧美色就是色| 日本不卡二三区| 26uuu国产日韩综合在线观看| 啊啊啊啊啊好舒服视频| 免费在线观看AV无码网站| 高清无码学生妹高潮| 国产亚洲一黄| 色欲久久久久综合网| 九九九九免费高| 亚洲天堂 视频你懂的| 久久久久久久| 欧美 青青草| 久久久久国产精品喷潮免费观看臀 | 日本一区二区三区欧美日韩中文字幕| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 亚洲天天天| 超碰久久性爱| 秋霞久久亚洲精品成人| 亚州高清AV| 精品久久99| 91小视频| 亚洲综合电影| 大香蕉92| 熟妇最新先锋一二三区| 国产AV激情无码久久无码| 99999亚洲另类| 日韩精品高清资源在线| 日本国产高清色www视频在线| 大粗鳼巴久久久久| 新97国产超碰| 久久人妻办公室视频| 老熟女乱伦一区| 黄色交缠性感爆操91国产精品免费一区二区三区 | 青青国产精品在线| 青娱乐国产精品| 97精品免费视频网站| 久草男人天堂| 日韩亚洲美女一区久久| 免费看A片毛毛片在线播| 屁股久久久久久| 精品视频久久区| 精品人妻夜夜草| 操一区| 国产自产一区视频在线| 探花视频免费观看国产专区| 夜夜国自区| 91欧美美女日韩国产婷婷| 丁香五月电影| 亚洲色 国产 欧美 日韩| 少妇久久久| 欧美日韩亚洲少妇寂寞影院正在播放| 又摸又舔在线观看网站| 丰满人妻-区二区三区免费| 亚洲网污污污污| 夜夜一区二区| 免费黄色片子| 乱伦日本色图AⅤ| 先锋激情∨在线视频播放| 91日韩| 夜夜高潮夜夜爽夜夜爱爱一区| 午夜福利在线合集| 伊人精品视频| 亚洲国产一区二区三区在线| 开心五月激情网| 播播亚洲小说亚洲| 亚洲毛片一级带毛片基地| 国产福利电影| 久久在线观看免费视频| 亚州男人天堂| 91美女视频直播| 啊啊啊啊在线播放| 夜夜爽爽夜夜精品视频| 欧美日韩少妇色情| 青青草吊丝| 热久久精品| 91麻豆天美国产欧美| 五月丁香色色网| 亚洲成人免费电影| 亚洲福利中文字幕在线| 国产92麻豆天美精品色欲5| 国产亚洲精品农村妇女| 中文字幕久热视频在线| 一本色道久久天天射天天干| a亚洲欧美色欲| 精品无码欧美三级| 国产亚洲色婷婷久久99精品91 - 百度| 友优传媒精品在线一区二区| 色综合大香蕉| 日韩情色一区二区| 亚洲精品91| 九九九九免费| 一区二区三区不卡视频| 成年人黄色| 久久只有精品| 天堂69亚洲精品中文字| 欧美日韩电影成人在线| 欧美国产精品| 日本色色色色色视频| 国产激情片在线观看| 91碰碰碰| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 超碰视97中文| 精品人妻一区二区三区蜜桃视频| 日本不卡一区二区三区| 情色五月天就去干| 男同专区一区二区三区在线| 777超碰| 日本熟女不卡视频| 啪啪资源网| 一区二区三区精品视频| 激情婷婷五月天| 嗯嗯啊啊操死我| 天美传媒在线一区| 97欧美色| 91色色网站| 亚洲精品国产专区在线观看| 国产又粗又长又爽又色| 亚洲天堂区| 精品国产99| 丰满欧美放荡少妇在线| 天天色欧美| 一本色道久久天天射天天干| AV免费在线播放一区| 欧美男人一区| 亚洲少妇在线影音| 久操免费视频| 亚洲无码国产探花在线观看| 成人 日本A片无码8888| 天天操夜夜操| 在线播放成人高清免费视频| 午夜男人av| 免费精品99| 中文字幕-区二区三区四区视频中国 | 91天天| 亚洲日韩美女中文字幕乱| 盗摄 精品 另类 一区| 欧美伦乱爱| 蜜臀网 一区| 国产亚洲精品农村妇女| 婷婷日韩一区二区三区中文字幕在线| 丰满精品人妻少妇久久字幕| 99超碰碰| 日本性爰一道本| 日本91白丝| 吊色| 日韩精品在线放| www.久久久久| 亚洲日韩久久精品一区| 国产v亚洲v日韩v欧美v片另类| 亚洲成?V人片在线观看福利| 色一射色一射| 蜜臀99久久精品久久久久久| ,成人免费啪啪视频| 色999;丁香五月| 久噜噜| 黑人免费福利视频| 婷婷精品| 天操天操夜操夜月操月年年操操| 日本爽爽爽爽爽爽免费视频| 婷婷九月色| 锕锕好爽 死我在线观看| 啪啪啪精品| 欧美熟爽综合| 亚洲少妇视频| 综合欧美日本三级| 色 亚洲 91| 免费av高清无码| 欧美亚洲综合色| 欧美激情 亚洲色图| 國產尤物AV尤物在線觀看| 欧美激情超碰777| 亚洲影院成人| 天天流夜夜操| 粉嫩AV一区二区夜夜| 草莓精品视频| 欧美在线综合| 久草网站免费在线观看| 老女人碰碰在线碰碰视频| 日韩熟女操逼| 玖玖蜜臀资源网| 视频国产成人精品日本亚洲18| 日韩精品一区二区三区四虎影视| 亚州色图欧美色图| 强免费黄色网址| 91精品国| 婷婷伊人网| 深喉吞精| 91美女丝袜诱惑视频| 色噜噜狠狠色综无码久久合欧美| 97色色婷婷| 老司机香蕉久久久久| 操碰97| 青草精品视频日本久久久久网站在线| 五月丁香| 日日超碰亚洲| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 色波多| 91性生活久久久| 一类av片在线看| 亚洲诱惑天堂 | 久干网| 日韩欧美一级特黄大片| 久久成人精品| 狠狠狠狠狠干| 国产在线综合福利网站| 韩国女主播青草在线| 中文字幕日韩人妻视频一区二区三区| 婷婷九月国产| 97在线视频观看| 亚洲自拍偷拍视频在线| 久久久久亚洲精品| 日本一级二级三级网站| 97欧美综合网| 中文字幕少妇色| 操逼啊啊啊91| 欧美78P| 午夜成人福利影视| 97国产高清视频在线观看| 欧美综合色图网| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 亚洲玖玖爱| 九九天堂| 国产麻豆福利av在线播放| 日日骚av| www.欧精品| 国产精品女久久久久av爽| 狠狠色五月亚洲91| 中美日韩毛片| 九九综合久久| 绯色一区二区三区不卡少妇 | 欧美精品久久久久久久久88| 96久久久久| 久偷拍欧美日韩三区| 操操碰| 啪啪啪东京| 日本精品一区二区不卡| 国产美女精品| 99在线精品视频| 成人97人人超碰人人| 亚洲清纯综合| 日韩精品99久久久久久中文字幕| 91精品大奶人妻| 国产成人自拍视频视频| 99re视频在线播放青草| 狠狠夜色午夜久久综合在线| 天天操综合网| 嫩草一区二区在线观看| 亚洲无 码A片在线观看麻豆| 加勒比久久av| 宗合情欲网| 长长久久88视频| 色成人Www精品永久观看| 亚洲欧美日韩中文播放| 人妻喷水| 后入式在线免费观看60秒| 老鸭窝亚洲毛片| 久操精品网| 国产操逼逼网| 国产男女边吃边摸视频网站| 91性情| 天天性射网| 一区二区视频你懂的| 午夜久久一区二区无码中出| 欧美一级色| 国产精品自拍欧美在线| 偷拍三区| 粉嫩av平台| 欧美性暴力| 国产9熟妇视频网站| 蜜桃狠狠色伊人亚洲综合| 加勒比AV网| 国产白领连续中出在线观看| 99这里只有精品| 欧美综合区| 日韩av影片在线观看| 国产亚洲精品农村妇女| 日日操免费视频| 狠狠婷婷亚洲中文综合久久| 麻豆av一区二区| 日韩精品资源| 超碰社区97| 伊人在线大香蕉视频久久| 欧美大片天天看| 青青草日本中文字幕| 欧美亚洲丝袜美女电影| 精品一区96| 日韩偷拍色图| 天天射网| 四虎永久在线精品免费网址 | 日1区2区3区2020| 天美传媒精品一区二区三区| 亚洲日韩乱码中文无码蜜桃臀网站| 中出789在线视频| 麻豆一区二区三区精品| 国产福利夜| 日韩欧美丝袜诱惑| 超碰这里只有精品| 日日夜夜模| 国产人妻精品一区二区三区秋霞 | 97这里有精品| 无码国产精品久久久久| 操逼视频亚洲| 欧美精品1区2区3区| 亚洲一区二区性爱电影| 亚洲AV无码国产成人| 大香蕉啪啪啪| 2020中文字幕| 麻豆九九九| 日韩精品人妻中文字有码在线| 97在线资源| 久久9久久|