最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Unity3D性能優(yōu)化——工具篇

2018-09-08 18:56 作者:皮皮關(guān)做游戲  | 我要投稿

作者:朔宇

本篇難度:★★★☆☆


性能優(yōu)化是游戲項(xiàng)目開(kāi)發(fā)中一個(gè)重要且必須的元素。用戶和項(xiàng)目的需求在并且會(huì)持續(xù)增長(zhǎng)。而即便在硬件設(shè)備高速發(fā)展的今天,游戲特效、畫(huà)質(zhì)、場(chǎng)景復(fù)雜度的需求也都向著榨干硬件性能的趨勢(shì)提升,無(wú)論研發(fā)團(tuán)隊(duì)有多么豐富的經(jīng)驗(yàn)積累,性能優(yōu)化永遠(yuǎn)是一個(gè)非常棘手而又無(wú)法繞開(kāi)的問(wèn)題。

仙劍6由于較低的運(yùn)行效率,被網(wǎng)友們戲稱為“泰坦隕落6”

實(shí)際上,通過(guò)百度、谷歌、知乎可以搜到大把關(guān)于Unity性能優(yōu)化的文章,但大多只是簡(jiǎn)單的論述、介紹、翻譯和轉(zhuǎn)載,或針對(duì)某中特定問(wèn)題優(yōu)化方式的教程。因此,我們?cè)谶@里推出Unity3D性能優(yōu)化系列文章,旨在給讀者提供一個(gè)全面、易懂、可操作的unity優(yōu)化教程,以便初學(xué)者學(xué)習(xí)使用。

在這里,我們的第一篇文章,主要作為一個(gè)引導(dǎo),通過(guò)講解對(duì)unity優(yōu)化工具的了解及使用,給讀者提供在實(shí)際項(xiàng)目中,進(jìn)行游戲性能優(yōu)化的流程和思路。

  • 對(duì)于Unity性能優(yōu)化,官方有非常好的教程。(參見(jiàn)官方教程:https://unity3d.com/cn/learn/tutorials/topics/performance-optimization)。

    如果英文水平一般,可以參考官方教程翻譯:http://www.cnblogs.com/alan777/p/6204759.html。

  • 同時(shí)你也可以去看看騰訊是如何做Unity手游性能優(yōu)化的:http://wetest.qq.com/lab/view/108.html?from=content_zhihu。

  • 以及通過(guò)第三方優(yōu)化平臺(tái)的游戲性能分析報(bào)告來(lái)了解游戲開(kāi)發(fā)中性能優(yōu)化的主要方式及方向。


游戲性能簡(jiǎn)述

提起游戲性能,首先要提到的就是,不僅開(kāi)發(fā)人員,所有游戲玩家都應(yīng)該會(huì)接觸到的一個(gè)名詞:幀率(Frame rate)

幀率是衡量游戲性能的基本指標(biāo)。在游戲中,“一幀”便是是繪制到屏幕上的一個(gè)靜止畫(huà)面。繪制一幀到屏幕上也叫做渲染一幀。每秒的幀數(shù)(fps)或者說(shuō)幀率表示GPU處理時(shí)每秒鐘能夠更新的次數(shù)。高的幀率可以得到更流暢、更逼真的動(dòng)畫(huà)。

現(xiàn)階段大多數(shù)游戲的理想幀率是60FPS,其帶來(lái)的交互感和真實(shí)感會(huì)更加強(qiáng)烈。通常來(lái)說(shuō),幀率在30FPS以上都是可以接受的,特別是對(duì)于不需要快速反應(yīng)互動(dòng)的游戲,例如休閑、解密、冒險(xiǎn)類游戲等。有些項(xiàng)目有特殊的需求,比如VR游戲,至少需要90FPS。當(dāng)幀率降低到30FPS以下時(shí),玩家通常會(huì)有不好的體驗(yàn)。

而現(xiàn)階段隨著支持144HZ刷新率的硬件設(shè)備的涌現(xiàn),能否維持對(duì)應(yīng)高幀率又是一項(xiàng)新的指標(biāo),尤其是在電競(jìng)領(lǐng)域

但在游戲中重要的不僅僅幀率的速度,幀率同時(shí)也必須非常穩(wěn)定。玩家通常對(duì)幀率的變化比較敏感,不穩(wěn)定的幀率通常會(huì)比低一些但是很穩(wěn)定的幀率表現(xiàn)更差。

雖然幀率是一個(gè)我們談?wù)撚螒蛐阅艿幕緲?biāo)準(zhǔn),但是當(dāng)我們提升游戲性能時(shí),更因該想到的是渲染一幀需要多少毫秒。幀率的相對(duì)改變?cè)诓煌秶鷷?huì)有不同的變化。比如,從60到50FPS呈現(xiàn)出的是額外3.3毫秒的運(yùn)行時(shí)間,但是從30到20FPS呈現(xiàn)出的是額外的16.6毫秒的運(yùn)行時(shí)間。在這里,同樣降低了10FPS,但是渲染一幀上時(shí)間的差別是很顯著的。

我們還需要了解渲染一幀需要多少毫秒才能滿足當(dāng)前幀率。通過(guò)公式 1000/(想要達(dá)到的幀率)。通過(guò)這個(gè)公式可以得到,30FPS必須在33.3毫秒之內(nèi)渲染完一幀,60FPS必須在16.6毫秒內(nèi)渲染完一幀。

渲染一幀,Unity需要執(zhí)行很多任務(wù)。比如,Unity需要更新游戲的狀態(tài)。有一些任務(wù)在每一幀都需要執(zhí)行,包括執(zhí)行腳本,運(yùn)行光照計(jì)算等。除此之外,有許多操作是在一幀執(zhí)行多次的,例如物理運(yùn)算。當(dāng)所有這些任務(wù)都執(zhí)行的足夠快時(shí),我們的游戲才會(huì)有穩(wěn)定且理想的幀率。當(dāng)這些任務(wù)執(zhí)行不滿足需求時(shí),渲染一幀將花費(fèi)更多的時(shí)間,并且?guī)蕰?huì)因此下降。

知道哪些任務(wù)花費(fèi)了過(guò)多的時(shí)間,是游戲性能問(wèn)題的關(guān)鍵。一旦我們知道了哪些任務(wù)降低了幀率,便可以嘗試優(yōu)化游戲的這一部分。這就是為什么性能分析工具是游戲優(yōu)化的重點(diǎn)之一。


Unity3d性能分析工具

工欲善其事必先利其器,這里我們來(lái)講解Unity3D優(yōu)化所需的工具

如果游戲存在性能問(wèn)題,游戲運(yùn)行就會(huì)出現(xiàn)緩慢、卡頓、掉幀甚至直接閃退等現(xiàn)象。在我們嘗試解決問(wèn)題前,需要先知道其問(wèn)題的起因,而嘗試不同的解決方案。若僅靠猜測(cè)或者依據(jù)自身原有的經(jīng)驗(yàn)去解決問(wèn)題,那我們可能會(huì)做無(wú)用功,甚至引申出更復(fù)雜的問(wèn)題。

在這些時(shí)候我們就需要用到性能分析工具,性能分析工具主要測(cè)試游戲運(yùn)行時(shí)各個(gè)方面性能,如CPU、GPU、內(nèi)存等。通過(guò)性能分析工具,我們能夠透過(guò)游戲運(yùn)行的外在表現(xiàn),獲取內(nèi)在信息,而這些信息便是我們鎖定引起性能問(wèn)題的關(guān)鍵所在。

在我們進(jìn)行Unity性能優(yōu)化的過(guò)程中,最主要用的到性能分析工具包括,Unity自帶的Unity Profile,IOS端的XCode?,以及一些第三方插件,如騰訊推出的UPA性能分析工具。

我們主要針對(duì)Unity Profile進(jìn)行講解,之后也會(huì)略微介紹另外一些性能分析工具。


Unity Profile

Unity Profile是Unity中最常用的官方性能分析工具,在使用Unity開(kāi)發(fā)游戲的過(guò)程中,借助Profiler來(lái)分析CPU、GPU及內(nèi)存使用狀況是至關(guān)重要的。

首先我們來(lái)了解Unity Profile的面板:
我們通過(guò)Window——>Profiler來(lái)激活Unity Profile面板


在下圖中我們可以看到Unity Profile面板,其中有很多profilers,每個(gè)profiler顯示我們當(dāng)前項(xiàng)目一個(gè)方面的信息,如CPU、GPU、渲染(Rendering)、內(nèi)存(Memory)、聲音(Audio)、視屏(Video)、物理(Physics)、ui及全局光照(global illumination)。

當(dāng)項(xiàng)目運(yùn)行時(shí),每個(gè)profilers會(huì)隨著運(yùn)行時(shí)間來(lái)顯示數(shù)據(jù),有些性能問(wèn)題是持續(xù)性的,有些僅在某一幀中出現(xiàn),還有些性能問(wèn)題可能會(huì)隨時(shí)間推移而逐漸顯出出來(lái)。

在面板的下半部分顯示了我們選中的profilers當(dāng)前幀的詳細(xì)內(nèi)容,我們可以通過(guò)選擇列標(biāo)題,通過(guò)這一列的信息值來(lái)排序。
在CPU usage profiler中的列表題分別為:
Total:當(dāng)前任務(wù)的時(shí)間消耗占當(dāng)前幀cpu消耗的時(shí)間比例。?
Self:任務(wù)自身時(shí)間消耗占當(dāng)前幀cpu消耗的時(shí)間比例。?
Calls:當(dāng)前任務(wù)在當(dāng)前幀內(nèi)被調(diào)用的次數(shù)。?
GC Alloc:當(dāng)前任務(wù)在當(dāng)前幀內(nèi)進(jìn)行過(guò)內(nèi)存回收和分配的次數(shù)。?
Time ms:當(dāng)前任務(wù)在當(dāng)前幀內(nèi)的耗時(shí)總時(shí)間。?
Self ms:當(dāng)前任務(wù)自身(不包含內(nèi)部的子任務(wù))時(shí)間消耗。

當(dāng)我們?cè)趯蛹?jí)視圖中點(diǎn)擊函數(shù)名字時(shí),CPU usage profiler將在Profiler窗口上部的圖形視圖中高亮顯示這個(gè)函數(shù)的信息。比如我們選中Cameta.Render,Rendering的信息就會(huì)被高亮顯示出來(lái)。

我們可以Profiler的左下的下拉菜單中選擇Timeline。

Timeline顯示了兩件事:cpu任務(wù)的執(zhí)行順序和哪個(gè)線程負(fù)責(zé)什么任務(wù)。線程允許不同的任務(wù)同時(shí)執(zhí)行。當(dāng)一個(gè)線程執(zhí)行一個(gè)任務(wù)時(shí),另外的線程可以執(zhí)行另一個(gè)完全不同的任務(wù)。和Unity的渲染過(guò)程相關(guān)的線程有三種:主線程,渲染線程和worker threads。了解哪個(gè)線程負(fù)責(zé)哪些任務(wù)的用處非常之大,一旦我們知道了在哪個(gè)線程上的任務(wù)執(zhí)行的速率最低,那么我們就應(yīng)該集中優(yōu)化在那個(gè)線程上的操作。

以上所顯示的數(shù)據(jù)依賴于我們當(dāng)前選擇的profiler。例如,當(dāng)選中內(nèi)存時(shí),這個(gè)區(qū)域顯示例如游戲資源使用的內(nèi)存和總內(nèi)存占用等。如果選中渲染profiler,這里會(huì)顯示被渲染的對(duì)象數(shù)量或者渲染操作執(zhí)行次數(shù)等數(shù)據(jù)。

這些profiler會(huì)提供很多詳細(xì)信息,但是我們并不總需要使用所有的profiler。實(shí)際上,我們?cè)诜治鲇螒蛐阅軙r(shí)通常只是觀察一個(gè)或者兩個(gè)profiler,而不需要觀察的我們可以通過(guò)右上角的”X”關(guān)閉,如果需要在添加回來(lái),可以通過(guò)左上角Add Profiler。
例如,當(dāng)我們的游戲運(yùn)行的比較慢時(shí),我們可能一開(kāi)始先查看CPU usage profiler,CPU usage profiler也是在我們進(jìn)行優(yōu)化分析時(shí)最常用的Profiler。

當(dāng)然,除了CPU usage profiler,Unity Profiler中其他的Profiler在一些場(chǎng)合也非常的有用,比如GPU、內(nèi)存、渲染等,其使用方法和CPU usage profiler也是大同小異,可以按照以上的步驟來(lái)查看并學(xué)習(xí)。

我們?cè)谟^察數(shù)據(jù)時(shí),需要觀察的目標(biāo)有如下幾點(diǎn):

CPU:
1. GC Allow:?任何一次性內(nèi)存分配大于2KB的選項(xiàng)。
每幀都具有20B以上內(nèi)存分配的選項(xiàng) 。

GC相關(guān)的問(wèn)題和優(yōu)化,在之后我們會(huì)詳細(xì)的介紹。

2. Time ms:

注意占用5ms以上的選項(xiàng)

內(nèi)存?
1. Texture: 檢查是否有重復(fù)資源和超大內(nèi)存是否需要壓縮等.。
2. AnimationClip: 重點(diǎn)檢查是否有重復(fù)資源.。
3. Mesh: 重點(diǎn)檢查是否有重復(fù)資源。



實(shí)際項(xiàng)目中的優(yōu)化建議

在了解了Unity Profiler后,現(xiàn)在我們?cè)谝粋€(gè)實(shí)際項(xiàng)目中來(lái)進(jìn)行一次性能分析。同時(shí)來(lái)了解一般在實(shí)際項(xiàng)目中,主要會(huì)引起也是我們主要去觀察的性能問(wèn)題出現(xiàn)在什么地方。

以下是我做的一個(gè)簡(jiǎn)單的游戲項(xiàng)目,并未做任何性能優(yōu)化并且有大量引起性能問(wèn)題的代碼,可以更方便大家觀察其性能問(wèn)題,在之后我會(huì)把工程上傳到github供初學(xué)者下載分析。

我們來(lái)看一下在CPU usage profiler面板中的可觀察項(xiàng),在項(xiàng)目中我們可以先關(guān)閉VSync垂直同步來(lái)提高幀率。

下圖中我關(guān)閉了除VSync之外的顯示,可以看到VSync的消耗

具體步驟是edit->project settings->Quality,在Inspector面板中,V Sync count選擇don’t Sync.

我們來(lái)簡(jiǎn)單的介紹一下什么是垂直同步,以及關(guān)閉它之后會(huì)發(fā)生什么。

要理解垂直同步,首先明白顯示器的工作原理。

顯示器上的所有圖像都是單個(gè)像素組成了水平掃描線,水平掃描線在垂直方向的堆積形成了完整的畫(huà)面,無(wú)論是隔行掃描還是逐行掃描,顯示器都有兩種同步參數(shù)——水平同步和垂直同步。?
垂直和水平是CRT顯示器中兩個(gè)基本的同步信號(hào),水平同步信號(hào)決定了CRT畫(huà)出一條橫越屏幕線的時(shí)間,垂直同步信號(hào)決定了CRT從屏幕頂部畫(huà)到底部,再返回原始位置的時(shí)間,而垂直同步代表著CRT顯示器的刷新率水準(zhǔn)。?
在游戲項(xiàng)目中,如果我們選擇等待垂直同步信號(hào)也就是打開(kāi)垂直同步,在游戲中或許性能較強(qiáng)的顯卡會(huì)迅速的繪制完一屏的圖像,但是沒(méi)有垂直同步信號(hào)的到達(dá),顯卡無(wú)法繪制下一屏,只有等85單位的信號(hào)到達(dá),才可以繪制。這樣FPS自然要受到刷新率運(yùn)行值的制約。?
而如果我們選擇不等待垂直同步信號(hào),那么游戲中繪制完一屏畫(huà)面,顯卡和顯示器無(wú)需等待垂直同步信號(hào)就可以開(kāi)始下一屏圖像的繪制,自然可以完全發(fā)揮顯卡的實(shí)力。?
但是,正是因?yàn)榇怪蓖降拇嬖冢拍苁沟糜螒蜻M(jìn)程和顯示器刷新率同步,使得畫(huà)面更加平滑和穩(wěn)定。取消了垂直同步信號(hào),固然可以換來(lái)更快的速度,但是在圖像的連續(xù)性上勢(shì)必會(huì)打折扣。?
需要注意,LCD顯示器其實(shí)也是存在刷新率的,但其機(jī)制與CRT不同,這里不做過(guò)多贅述,但是垂直同步和水平同步對(duì)于LCD顯示器來(lái)說(shuō),一樣是有必要的。

在關(guān)閉垂直同步后,我們繼續(xù)看我們的項(xiàng)目

可以看到,我們以Total和Time ms排序,在圖中拉黑的項(xiàng)(Camera Render)始終排在最前面。
Camera Render是相機(jī)渲染工作的CPU占用量,在實(shí)際項(xiàng)目中,渲染是最常見(jiàn)的引起性能問(wèn)題的原因。 而因?yàn)殇秩径鸬男阅軉?wèn)題的優(yōu)化是一個(gè)非常大的工程,這方面的優(yōu)化方法在我們后續(xù)的文章中會(huì)有詳細(xì)的教程去學(xué)習(xí)和分析。在這里,我們只需要先了解。
我們這個(gè)項(xiàng)目的優(yōu)化中,無(wú)疑,渲染造成的性能損耗是一個(gè)大頭。

如果說(shuō),在我們性能分析中,渲染已經(jīng)沒(méi)有什么問(wèn)題,那么我們接下來(lái)要重點(diǎn)觀察的就是GC,也就是垃圾回收性能分析。
我們按照GC Alloc的順序來(lái)顯示,可以看到下圖。


在之前我們提到過(guò),GC Alloc中,任何一次性內(nèi)存分配大于2KB的選項(xiàng),每幀都具有20B以上內(nèi)存分配的選項(xiàng) ,是需要我們重點(diǎn)關(guān)注的,顯而易見(jiàn),我們的項(xiàng)目中,對(duì)于GC的優(yōu)化,也有很大的問(wèn)題。關(guān)于CG的問(wèn)題,我們會(huì)在下一篇Unity3D性能優(yōu)化——CPU篇中,詳細(xì)的介紹。

這里我們大致介紹一下GC的機(jī)制,要想了解垃圾回收如何工作以及何時(shí)被觸發(fā),我們首先需要了解unity的內(nèi)存管理機(jī)制。Unity主要采用自動(dòng)內(nèi)存管理的機(jī)制,開(kāi)發(fā)時(shí)在代碼中不需要詳細(xì)地告訴unity如何進(jìn)行內(nèi)存管理,unity內(nèi)部自身會(huì)進(jìn)行內(nèi)存管理。?
Unity內(nèi)部有兩個(gè)內(nèi)存管理池,堆內(nèi)存和棧內(nèi)存,垃圾回收主要是指堆上的內(nèi)存分配和回收,unity中會(huì)定時(shí)對(duì)堆內(nèi)存進(jìn)行GC操作。?
當(dāng)堆內(nèi)存上一個(gè)變量不再處于激活狀態(tài)的時(shí)候,其所占用的內(nèi)存并不會(huì)立刻被回收,不再使用的內(nèi)存只會(huì)在GC的時(shí)候才會(huì)被回收。?
每次運(yùn)行GC的時(shí)候,GC會(huì)檢查堆內(nèi)存上的每個(gè)存儲(chǔ)變量,對(duì)每個(gè)變量會(huì)檢測(cè)其引用是否處于激活狀態(tài),如果變量的引用不再處于激活狀態(tài),則會(huì)被標(biāo)記為可回收,被標(biāo)記的變量會(huì)被移除,其所占有的內(nèi)存會(huì)被回收到堆內(nèi)存上。?
GC操作是一個(gè)極其耗費(fèi)的操作,堆內(nèi)存上的變量或者引用越多則其運(yùn)行的操作會(huì)更多,耗費(fèi)的時(shí)間越長(zhǎng)。

如果我們也排除了GC的問(wèn)題, 那么再接下來(lái),我們就要考慮到是否是腳本的一些問(wèn)題造成性能損耗。

這里的腳本,可能是我們自己寫(xiě)的代碼,也有可能是我們使用的一些插件的代碼。在CPU usage profiler面板中,我們可以關(guān)注Script這一項(xiàng)。

如果在一個(gè)很慢的幀中,一大部分時(shí)間被腳本運(yùn)行所消耗,這意味著這些慢的腳本可能就是引起性能問(wèn)題的主因。我們可以更加深入的分析數(shù)據(jù)來(lái)確認(rèn)。

首先我們按照Time ms來(lái)排序,然后選擇信息列表中的項(xiàng)目,如果是用戶腳本的函數(shù),那么在Profiler上方會(huì)有高亮腳本的部分。這種情況,說(shuō)明游戲的性能問(wèn)題是和用戶腳本相關(guān)的,如下圖中的顯示,這部分腳本性能問(wèn)題一定是與我們FixedUpdate有關(guān)。

同時(shí),我們還可以再關(guān)注一些物理、ui方面的性能問(wèn)題。

在上面我們討論的,是幾種最常見(jiàn)的性能問(wèn)題,在實(shí)際項(xiàng)目?jī)?yōu)化中,如果有性能問(wèn)題也逃不開(kāi)這些,如果在這些方向都已經(jīng)達(dá)到了我們的要求,但我們的游戲仍然有性能問(wèn)題,我們應(yīng)該遵循上面的方法解決問(wèn)題:收集數(shù)據(jù)——>使用CPU usage profiler查看信息——>找到引起問(wèn)題的函數(shù)。一旦我們知道了引起問(wèn)題函數(shù)的名字,我們便可以針對(duì)性的,對(duì)其進(jìn)行優(yōu)化處理。



其他性能分析工具

在開(kāi)頭我們說(shuō)過(guò),在我們進(jìn)行Unity性能優(yōu)化的過(guò)程中,最主要用的到性能分析工具包括,Unity自帶的Unity Profile,IOS端XCode Capture GPU frame以及一些第三方插件,如騰訊推出的UPA性能分析工具。

這里我們簡(jiǎn)單的介紹一下XCode和UPA.

Xcode是 Mac OS X上的集成開(kāi)發(fā)工具。在我們打包Unity IOS的項(xiàng)目時(shí),必須使用到Xcode來(lái)幫助我們打包及發(fā)布。

Xcode的功能也十分的強(qiáng)大,在我們開(kāi)發(fā)IOS端時(shí),可以使用其GPU frame Capture 功能為我們的項(xiàng)目進(jìn)行性能優(yōu)化分析。

在unity中,我們打包時(shí)在Run In Xcode as 選擇debug模式,并且勾選Development Build


打包完成后,使用Xcode打開(kāi)文件,在Xcode中選擇Product ——> Scheme——> Manage Schemes

然后會(huì)出現(xiàn)如下界面


我們雙擊這個(gè)項(xiàng)目會(huì)出現(xiàn)如下界面


然后我們?cè)谧髠?cè)選中Run,然后在右側(cè)面板選擇Options


在GPU frame Capture中選擇OpenGL ES或者M(jìn)etal。
在Debug模式下運(yùn)行項(xiàng)目,當(dāng)項(xiàng)目在真機(jī)上完全加載后,就可以進(jìn)入Debug Navigator(View ——> Navigators ——> Show Debug Navigator)


以下是GPU frame Capture具體功能的界面,在圖形化界面中,可以在游戲運(yùn)行時(shí)清晰的了解到CPU、GPU、內(nèi)存的使用情況。


XCode的Capture GPU frame功能能高效且定量地定位到GPU中shader的消耗。

UPA是騰訊和Unity聯(lián)合打造的一款性能分析工具,據(jù)說(shuō)王者榮耀的性能優(yōu)化分析就有使用到UPA,具體的使用方法可以通過(guò)?客戶端性能測(cè)試【騰訊WeTest】(http://wetest.qq.com/cube/)去了解。



最后想系統(tǒng)學(xué)習(xí)游戲開(kāi)發(fā)的童鞋,歡迎訪問(wèn):http://www.levelpp.com/

游戲開(kāi)發(fā)攪基QQ群:869551769??

微信公眾號(hào):皮皮關(guān)

Unity3D性能優(yōu)化——工具篇的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
衡阳县| 洛宁县| 临汾市| 岢岚县| 木里| 五寨县| 方城县| 陆川县| 毕节市| 裕民县| 新宾| 奎屯市| 新平| 汤阴县| 海南省| 庆城县| 湟中县| 子长县| 师宗县| 塔城市| 太原市| 汉寿县| 长乐市| 大余县| 绥芬河市| 苏尼特左旗| 灵璧县| 虹口区| 任丘市| 台前县| 兴安盟| 商河县| 清水河县| 长子县| 蕉岭县| 伊金霍洛旗| 资兴市| 柳林县| 西乌| 桐柏县| 青田县|