OpenGL ES 框架詳細解析(十三) —— Xcode OpenGL ES工具概述

版本記錄

版本號 時間
V1.0 2017.10.03

前言

OpenGL ES是一個強大的圖形庫,是跨平臺的圖形API,屬于OpenGL的一個簡化版本。iOS系統(tǒng)可以利用OpenGL ES將圖像數(shù)據(jù)直接送入到GPU進行渲染,這樣避免了從CPU進行計算再送到顯卡渲染帶來的性能的高消耗,能帶來來更好的視頻效果和用戶體驗。接下來幾篇就介紹下iOS 系統(tǒng)的 OpenGL ES框架。感興趣的可以看上面幾篇。
1. OpenGL ES 框架詳細解析(一) —— 基本概覽
2. OpenGL ES 框架詳細解析(二) —— 關(guān)于OpenGL ES
3. OpenGL ES 框架詳細解析(三) —— 構(gòu)建用于iOS的OpenGL ES應用程序的清單
4. OpenGL ES 框架詳細解析(四) —— 配置OpenGL ES的上下文
5. OpenGL ES 框架詳細解析(五) —— 使用OpenGL ES和GLKit進行繪制
6. OpenGL ES 框架詳細解析(六) —— 繪制到其他渲染目的地
7. OpenGL ES 框架詳細解析(七) —— 多任務,高分辨率和其他iOS功能
8. OpenGL ES 框架詳細解析(八) —— OpenGL ES 設(shè)計指南
9. OpenGL ES 框架詳細解析(九) —— 調(diào)整您的OpenGL ES應用程序
10. OpenGL ES 框架詳細解析(十) —— 使用頂點數(shù)據(jù)的最佳做法
11. OpenGL ES 框架詳細解析(十一) —— 并發(fā)和OpenGL ES
12. OpenGL ES 框架詳細解析(十二) —— 采用OpenGL ES 3.0

Xcode OpenGL ES Tools Overview - Xcode OpenGL ES工具概述

用于調(diào)試,分析和調(diào)整OpenGL ES應用程序的Xcode工具在開發(fā)的所有階段都很有用。 FPS Debug Gauge和GPU報告總結(jié)了每次從Xcode運行時的應用程序GPU性能,因此您可以在設(shè)計和構(gòu)建渲染器時快速查看性能問題。 找到故障點后,捕獲一幀并使用Xcode的OpenGL ES Frame Debugger界面來精確定位渲染問題并解決性能問題。

有效地使用Xcode OpenGL ES功能需要熟悉Xcode的調(diào)試界面。 有關(guān)背景信息,請閱讀Xcode User Guide。


Using the FPS Debug Gauge and GPU Report - 使用 the FPS Debug Gauge and GPU 報告

如圖B-1所示,F(xiàn)PS調(diào)試指示器和隨附的GPU報告提供了應用程序運行時的OpenGL ES性能的高級摘要。 通過在開發(fā)應用程序時監(jiān)控這些顯示,您可以發(fā)現(xiàn)性能問題,并考慮在哪里集中調(diào)整工作。

Figure B-1 FPS Debug Gauge and GPU Report

注意:FPS測量儀和GPU報告的某些功能依賴于display link定時器。 如果您不使用CADisplayLinkGLKViewController類來動畫化OpenGL ES顯示,則儀表和報告將無法顯示相對于目標幀速率的性能或提供準確的CPU幀時間信息。

調(diào)試計和報告包含以下顯示:

  • FPS Gauge。顯示您的應用程序的當前動畫速率(以每秒幀數(shù)(FPS))和最近的FPS讀數(shù)歷史記錄。 單擊此計量器可在Xcode的主編輯器中顯示GPU報告。
  • Frames Per Second。 顯示當前幀速率,相對于您的應用設(shè)置的目標幀速率(通常為30或60 FPS)。 藍色弧表示最近的FPS讀數(shù)范圍。
  • Utilization。 顯示三個條狀圖,分解您的應用程序?qū)PU上不同處理資源的使用情況,并指出在使用圖形硬件時性能瓶頸的可能位置。
    • The Tiler bar可以測量GPU的幾何處理資源的使用。 高層次利用率可以表明OpenGL ES流水線的頂點和原始處理階段的性能瓶頸,例如使用無效的頂點著色器代碼或每幀畫出過多數(shù)量的頂點或圖元。
    • The Renderer bar可以使用GPU的像素處理資源。 高渲染器利用率可以指示OpenGL ES管道的片段和像素處理階段的性能瓶頸,例如使用無效的片段著色器代碼或處理每個幀用于顏色混合的附加片段。
    • The Device bar顯示了GPU的整體使用情況,并結(jié)合了tilerrenderer的使用。
  • Frame Time。 顯示在CPU和GPU上處理每個幀的時間。 此圖可以指示您的應用程序是否有效使用CPU / GPU并行性。

如果您的應用程序花費更多的CPU處理時間,您可以通過將工作轉(zhuǎn)移到GPU來提高性能。 例如,如果每個幀需要許多類似的glDrawArraysglDrawElements調(diào)用,那么可以使用硬件實例來減少CPU開銷。 (有關(guān)詳細信息,請參閱 Use Instanced Drawing to Minimize Draw Calls

如果您的應用程序在GPU處理中花費更多時間,則可以通過將工作移到CPU來提高性能。 例如,如果著色器在特定繪制調(diào)用期間對每個頂點或片段執(zhí)行與相同結(jié)果相同的計算,則可以在CPU上執(zhí)行該計算一次,并將其結(jié)果傳遞給均勻變量中的著色器。 (請參閱Use Uniforms or Constants Instead of Computing Values in a Shader)。

  • Program Performance。捕獲幀后才會出現(xiàn)(請參閱下面的Capturing and Analyzing an OpenGL ES Frame ),顯示渲染捕獲幀時花費在每個著色器程序中的時間,以毫秒為單位,占總幀渲染時間的百分比。 擴展程序的列表顯示使用該程序進行的繪圖調(diào)用和每個渲染時間的貢獻。 選擇列表中的程序以在助理編輯器中查看其著色器源代碼,或單擊繪圖調(diào)用旁邊的箭頭圖標,以在框架導航器中選擇該調(diào)用(請參閱下面的Navigator Area)。

注意:僅在支持OpenGL ES 3.0的設(shè)備上進行調(diào)試時,才會顯示“程序性能”視圖(無論您的應用程序是使用OpenGL ES 3.0還是2.0上下文)。

調(diào)整應用程序時,您可以使用此圖形來查找優(yōu)化的機會。 例如,如果一個程序占用幀渲染時間的50%,則通過優(yōu)化它可以獲得更多的性能,而不是通過提高僅占幀時間的10%的程序的速度。 雖然這個視圖通過著色器程序組織幀時間,但請記住,改善著色器算法不是優(yōu)化應用程序性能的唯一方法 - 例如,您還可以減少使用昂貴的著色器程序的繪圖調(diào)用次數(shù),或者減少 由慢片段著色器處理的片段數(shù)。

  • Problems & Solutions。只有在Xcode分析幀捕獲后才會顯示(請參閱Capturing and Analyzing an OpenGL ES Frame),此區(qū)域列出了分析期間發(fā)現(xiàn)的可能問題以及提高性能的建議。

當您在捕獲的幀中更改GLSL著色器程序(請參閱下面的Editing Shader Programs)時,幀時間和程序性能圖展開,以顯示原始捕獲的幀的基線渲染時間和使用已編輯的渲染著色器的當前渲染時間。


Capturing and Analyzing an OpenGL ES Frame - 采集和分析OpenGL ES幀

要詳細了解您的應用程序的OpenGL ES使用情況,請捕獲用于渲染單幀動畫的OpenGL ES命令的順序。 Xcode提供了幾種開始幀捕獲的方法:

  • Manual capture。在Xcode中運行應用程序時,單擊調(diào)試欄中的相機圖標(如圖B-2所示),或者從Debug菜單中選擇Capture OpenGL ES Frame。
Figure B-2 Debug Bar with Capture OpenGL ES Frame button

注意:只有當您的項目與OpenGL ES或Sprite Kit框架相連時,Capture Open ES ES Frame按鈕才會自動出現(xiàn)。 您可以通過編輯活動方案來選擇是否顯示給其他項目。 (請參閱About the Scheme Editing Dialog)。

  • Breakpoint action。斷點動作。 選擇Capture OpenGL ES Frame作為任何斷點的操作。 當調(diào)試器通過此操作到達斷點時,Xcode會自動捕獲一個幀。 (請參閱Setting Breakpoint Actions and Options),如果在開發(fā)應用程序時使用此操作與OpenGL ES錯誤斷點(請參閱 Adding an OpenGL ES Error Breakpoint),每當發(fā)生錯誤的時候,可以使用OpenGL ES Frame Debugger調(diào)查OpenGL ES錯誤的原因 。

  • OpenGL ES event marker。通過在OpenGL ES命令流中插入事件標記以編程方式觸發(fā)幀捕獲。 以下命令插入如下標記:

glInsertEventMarkerEXT(0, "com.apple.GPUTools.event.debug-frame")

當OpenGL ES客戶端到達此標記時,它完成渲染幀,然后Xcode自動捕獲用于渲染該幀的整個命令序列。

Xcode捕獲幀后,會顯示OpenGL ES Frame Debugger界面。 使用此界面來檢查渲染幀的OpenGL ES命令的順序,并檢查OpenGL ES資源,參見Touring the OpenGL ES Frame Debugger。

此外,Xcode可以對應用程序的OpenGL ES使用情況進行自動分析,以確定渲染器和著色器架構(gòu)的哪些部分可以從性能優(yōu)化中獲益最多。 要使用此選項,請單擊GPU報告頂部的分析按鈕(如Figure B-1右上方所示)。

當您單擊“分析”按鈕時,Xcode將捕獲一個框架(如果尚未被捕獲),則通過使用附加的iOS設(shè)備進行一系列實驗來運行渲染代碼。 例如,要查看渲染速度是否受到紋理大小的限制,Xcode將運行OpenGL ES命令的捕獲序列,同時將您的應用程序提交到GPU的紋理數(shù)據(jù)和大小減小的紋理集合。 在Xcode完成分析之后,GPU報告的Problems & Solutions領(lǐng)域列出了所發(fā)現(xiàn)的任何問題,并提出可能的性能改進建議。


Touring the OpenGL ES Frame Debugger - 瀏覽OpenGL ES幀調(diào)試器

Xcode捕獲幀后,會自動重新配置OpenGL ES調(diào)試界面。 OpenGL ES Frame Debugger界面修改了Xcode工作區(qū)窗口的幾個區(qū)域,以提供有關(guān)OpenGL ES渲染過程的信息,如圖B-3和圖B-4所示,并在下面進行了總結(jié)。 (框架調(diào)試器不使用檢查器或庫工作板,因此您可能希望在OpenGL ES調(diào)試期間隱藏Xcode的實用程序區(qū)域。)

Figure B-3 Frame debugger examining draw calls and resources
Figure B-4 Frame debugger examining shader program performance and analysis results

1. Navigator Area - 導航區(qū)域

在OpenGL ES幀調(diào)試器界面中,調(diào)試導航器由OpenGL ES幀導航器替代。 該導航儀顯示OpenGL ES命令,可以渲染捕獲的幀,按順序或根據(jù)其相關(guān)的著色器程序進行組織。 使用框架導航器頂部的Frame View Options彈出菜單在視圖樣式之間切換。

Figure B-5 View Frame By popup menu in navigator

View Frame By Call - 按調(diào)用查看幀

當您要依次研究OpenGL ES命令以查明錯誤,診斷呈現(xiàn)問題或識別常見性能問題時,通過調(diào)用查看捕獲的幀。 在此模式下,框架導航器按照您的應用程序所稱的順序列出命令。 導致OpenGL ES錯誤或可能指示性能問題的命令旁邊出現(xiàn)錯誤或警告圖標。

您可以通過使用glPushGroupMarkerEXTglPopGroupMarkerEXT函數(shù)為OpenGL ES命令組添加結(jié)構(gòu)來添加結(jié)構(gòu),這些組顯示為可以展開或折疊以顯示更多或更少細節(jié)的文件夾。 (有關(guān)詳細信息,請參閱 Annotate Your OpenGL ES Code for Informative Debugging and Profiling),您還可以展開OpenGL ES命令,以顯示堆棧跟蹤,指示應用程序代碼中發(fā)出命令的位置。

使用上下文菜單來選擇是否縮寫命令名稱以及要顯示的命令,組和警告。 使用導航器底部的標志圖標在顯示所有OpenGL ES命令之間切換,并僅顯示繪制到幀緩沖區(qū)中的那些。

單擊OpenGL ES命令列表將導航到OpenGL ES命令序列中的那一點,影響幀調(diào)試器接口其他區(qū)域的內(nèi)容,如下所述,并顯示OpenGL ES調(diào)用的效果并附加設(shè)備的顯示。

View Frame By Program - 按程序查看幀

當您要分析在每個著色器程序上花費的GPU時間和繪制命令時,可以通過程序查看捕獲的幀。

展開程序的列表,以查看每個著色器在程序和每個繪圖調(diào)用中的時間貢獻。 展開一個繪圖調(diào)用的列表,以顯示一個堆棧跟蹤,指示您的應用程序代碼中發(fā)出該命令的位置。

使用上下文菜單來優(yōu)化顯示 - 您可以選擇程序是按照其時間貢獻進行排序的,以及時間信息是否以總渲染時間的百分比顯示。

單擊程序或著色器將在主編輯器中顯示相應的GLSL源代碼。 單擊OpenGL ES命令將導航到幀捕獲序列中的那一點。

注意:按程序查看幀選項僅在支持OpenGL ES 3.0的設(shè)備上進行調(diào)試時可用(無論您的應用程序是否使用OpenGL ES 3.0或2.0上下文)。 在其他設(shè)備上,框架視圖選項彈出菜單被禁用。

2. Editor Area - 編輯區(qū)

使用幀捕獲時,您可以使用主編輯器預覽要渲染的幀緩沖區(qū),還可以使用助手編輯器來檢查OpenGL ES資源并編輯GLSL著色器程序。 默認情況下,助理編輯器顯示OpenGL ES上下文所有資源的圖形概述,如圖Figure B-3.所示。 使用助理編輯器的跳轉(zhuǎn)欄僅顯示為框架導航器中選擇的調(diào)用使用的資源,或者選擇一個單獨的資源進行進一步檢查。 您也可以雙擊概述中的資源進行檢查。 當您選擇資源時,助理編輯器將更改為適合該資源類型的任務的格式。

Previewing Framebuffer Contents - 預覽Framebuffer內(nèi)容

主編輯器顯示由幀導航器中當前選擇的繪圖調(diào)用渲染的幀緩沖區(qū)的內(nèi)容。 (如果幀導航器中所選的OpenGL ES命令不是繪圖命令,例如,設(shè)置諸如glUseProgram之類的狀態(tài)的命令,則framebuffer會反映在選擇之前由最近的繪圖調(diào)用完成的渲染。)您也可以 使用主編輯器頂部的跳轉(zhuǎn)條導航OpenGL ES命令的序列。

Figure B-6 Framebuffer info popover

編輯器顯示當前為繪圖綁定的每個幀緩沖附件的預覽。 例如,3D渲染的大多數(shù)方法都使用具有顏色和深度附件的幀緩沖區(qū),如圖所示。 使用編輯器左下角的控件選擇當前顯示的幀緩沖附件。 單擊每個幀緩沖附件名稱左側(cè)的信息按鈕,顯示一個彈出窗口,詳細說明附件的屬性,如圖B-6所示。 單擊framebuffer附件名稱右側(cè)的設(shè)置按鈕,以顯示具有調(diào)整預覽圖像的控件的彈出窗口。 例如,您可以使用這些控件在深度緩沖區(qū)中在其灰階預覽中使一定范圍的Z值更可見,如圖B-7所示。

Figure B-7 Framebuffer settings popover

每個幀緩沖附件預覽還顯示一個綠色線框,突出顯示當前繪圖調(diào)用的效果(如圖 Figure B-3所示)。 使用預覽圖像中的上下文菜單來選擇是否突出顯示在預覽中或顯示連接的設(shè)備上。

Editing Shader Programs - 編輯著色器程序

當您在助手編輯器的跳轉(zhuǎn)欄或資源概述中選擇著色程序時,助手編輯器將顯示該程序片段著色器的GLSL源代碼(如圖B-8所示)。 當您在框架導航器中選擇一個程序(請參閱View Frame By Program)時,主編輯器顯示程序的片段著色器,助手編輯器顯示其頂點著色器。 在顯示片段著色器的任何編輯器中,您可以使用跳轉(zhuǎn)條切換到其對應的頂點著色器,反之亦然。

Figure B-8 GLSL shader source editor with update button

著色器源代碼的每一行在右邊距中突出顯示,表示其對渲染時間的相對貢獻。 使用這些來集中您的著色器優(yōu)化工作 - 如果幾行占用更多的渲染時間,可以查看更快的替代方案。 (有關(guān)著色器性能提示,請參閱Best Practices for Shaders。)

您可以在編輯器中更改著色器源代碼。 然后,單擊編輯器下方的更新按鈕(如圖Figure B-8所示)重新編譯著色器程序,并查看其對捕獲幀的影響。 如果編譯著色器會導致GLSL編譯器發(fā)生錯誤或警告消息,則Xcode會為每個問題注釋著色器源代碼。 重新編譯的著色器程序在設(shè)備上仍然使用,因此您可以恢復運行應用程序。 單擊調(diào)試欄中的繼續(xù)按鈕以查看您的著色器更改的操作。

Inspecting Vertex Data - 檢查頂點數(shù)據(jù)

當您檢查數(shù)組緩沖區(qū)時,助理編輯器顯示緩沖區(qū)的內(nèi)容(參見圖B-9)。 因為OpenGL ES內(nèi)存中的緩沖區(qū)沒有定義的格式,您可以使用編輯器底部的彈出菜單來選擇其內(nèi)容的顯示方式(例如,32位整數(shù)或浮點值,或兩倍于 許多16位整數(shù)或半浮點值)以及Xcode用于顯示數(shù)據(jù)的列數(shù)。

Figure B-9 Assistant editor previewing array buffer contents

頂點數(shù)組對象(VAO)將一個或多個數(shù)據(jù)緩沖區(qū)封裝在OpenGL ES存儲器中,以及用于將頂點數(shù)據(jù)從緩沖區(qū)提供給著色器程序的屬性綁定。 (有關(guān)使用VAO的詳細信息,請參閱Consolidate Vertex Array State Changes Using Vertex Array Objects)由于VAO綁定包含有關(guān)緩沖區(qū)內(nèi)容格式的信息,因此檢查VAO會顯示OpenGL ES解釋的內(nèi)容(參見圖B-10)。

Figure B-10 Assistant editor previewing vertex array object

Viewing Textures or Renderbuffers - 查看紋理或幀緩沖區(qū)

當您檢查紋理或渲染緩沖區(qū)時,助理編輯器將顯示其內(nèi)容的圖像預覽。 您可以使用主編輯器中找到的相同控件來獲取有關(guān)紋理對象或渲染緩沖區(qū)的更多信息,并調(diào)整圖像預覽。 對于紋理,您可以使用助手編輯器左下角的附加控件預覽多維數(shù)據(jù)集地圖紋理的每個面的紋理和(如果適用)的每個mipmap級別(如圖B-11所示)。

Figure B-11 Assistant editor previewing cube map texture

3. Debug Area - 調(diào)試區(qū)

調(diào)試欄提供多個控件,用于瀏覽捕獲的OpenGL ES命令序列(如圖B-12所示)。 您可以使用其菜單來跟蹤幀導航器中顯示的層次結(jié)構(gòu),并選擇一個命令,也可以使用箭頭和滑塊按順序前后移動。 按繼續(xù)按鈕結(jié)束框架調(diào)試并返回運行應用程序。

Figure B-12 OpenGL ES debug bar

框架調(diào)試器沒有調(diào)試控制臺。 相反,Xcode提供了多個變量視圖,每個視圖都提供了OpenGL ES渲染過程當前狀態(tài)的不同摘要。 使用彈出菜單在可用變量視圖之間進行選擇,在以下部分中討論。

The All GL Objects View - 所有GL對象視圖

所有GL對象視圖與圖B-13右側(cè)所示的“綁定GL對象”視圖類似,列出了與輔助編輯器中圖形概述相同的OpenGL ES資源。 然而,與圖形概述不同,當您擴展其顯示三角形時,此視圖可以提供有關(guān)資源的更詳細信息。 例如,擴展幀緩沖區(qū)或緩沖區(qū)對象的列表顯示僅通過OpenGL ES查詢功能(如glGetBufferParameterglGetFramebufferAttachmentParameter)可用的信息。 擴展著色器程序的列表顯示其狀態(tài),屬性綁定和每個統(tǒng)一變量的當前綁定值。

The Bound GL Objects View - 綁定GL對象視圖

B-13右側(cè)所示的“綁定GL對象”視圖的行為與All GL Objects view視圖相同,但僅列出當前要綁定的資源,用于框架導航器中所選的OpenGL ES命令。

Figure B-13 Debug area with GL Context and Bound GL Objects views

The GL Context View - GL上下文視圖

B-13左側(cè)的GL上下文視圖列出了OpenGL ES渲染器的整個狀態(tài)向量,并將其組織成功能組。 當您在更改OpenGL ES狀態(tài)的框架導航器中選擇一個調(diào)用時,更改的值將突出顯示。 例如,調(diào)用glCullFaceglFrontFace函數(shù)會更改并突出顯示狀態(tài)列表的“剔除”部分中的值。 使用glEnable(GL_BLEND)調(diào)用或使用glBlendFunc函數(shù)更改混合參數(shù)來啟用混合,可以在狀態(tài)列表的“混合”部分中更改和突出顯示值。

The Context Info View - 上下文信息視圖

B-14右側(cè)所示的The Context Info View列出了有關(guān)正在使用的OpenGL ES渲染器的靜態(tài)信息:名稱,版本,功能,擴展名和類似數(shù)據(jù)。 您可以查看此數(shù)據(jù),而不是編寫自己的代碼來查詢渲染器屬性,如GL_MAX_TEXTURE_IMAGE_UNITSGL_EXTENSIONS。

Figure B-14 Debug area with Auto and Context Info views

The Auto View - 自動視圖

B-14左側(cè)所示的自動視圖會自動列出在其他變量視圖中通常找到的項目的子集以及適用于框架導航器中所選調(diào)用的其他信息。 例如:

  • 如果所選的調(diào)用導致OpenGL ES錯誤,或者Xcode已經(jīng)確定了所選調(diào)用的可能的性能問題,則該視圖列出了每個的錯誤或警告和建議的修復。
  • 如果所選調(diào)用更改OpenGL ES上下文狀態(tài)的一部分,或者其行為取決于上下文狀態(tài),則視圖會自動從GL Context view中列出相關(guān)項。
  • 如果所選擇的調(diào)用綁定資源或使用諸如頂點數(shù)組對象,程序或紋理的綁定資源,則視圖會自動列出“綁定GL對象”視圖中的相關(guān)項目。
  • 如果選擇了繪圖調(diào)用,則視圖列出了程序性能信息,包括在繪制調(diào)用期間在每個著色器中花費的總時間,如果你自捕獲幀以來已更改并重新編譯著色器,則在每一個著色器中花費的基線時間都是不同的。 (僅在支持OpenGL ES 3.0的設(shè)備上進行調(diào)試時,程序性能信息才可用)。

此外,此視圖列出了有關(guān)幀渲染性能的匯總統(tǒng)計信息,包括繪制數(shù)量和幀速率。

后記

有點小困,睡了,未完,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內(nèi)容