cy
  • NEW!
    NEW!  Connect Ideas Across Notes
    Save time and share insights. With Paragraph Citation, you can quote others’ work with source info built in. If someone cites your note, you’ll see a card showing where it’s used—bringing notes closer together.
    Got it
        • Sharing URL Link copied
        • /edit
        • View mode
          • Edit mode
          • View mode
          • Book mode
          • Slide mode
          Edit mode View mode Book mode Slide mode
        • Customize slides
        • Note Permission
        • Read
          • Owners
          • Signed-in users
          • Everyone
          Owners Signed-in users Everyone
        • Write
          • Owners
          • Signed-in users
          • Everyone
          Owners Signed-in users Everyone
        • Engagement control Commenting, Suggest edit, Emoji Reply
      • Invite by email
        Invitee

        This note has no invitees

      • Publish Note

        Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

        Your note will be visible on your profile and discoverable by anyone.
        Your note is now live.
        This note is visible on your profile and discoverable online.
        Everyone on the web can find and read all notes of this public team.

        Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

        Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

        Explore these features while you wait
        Complete general settings
        Bookmark and like published notes
        Write a few more notes
        Complete general settings
        Write a few more notes
        See published notes
        Unpublish note
        Please check the box to agree to the Community Guidelines.
        View profile
      • Commenting
        Permission
        Disabled Forbidden Owners Signed-in users Everyone
      • Enable
      • Permission
        • Forbidden
        • Owners
        • Signed-in users
        • Everyone
      • Suggest edit
        Permission
        Disabled Forbidden Owners Signed-in users Everyone
      • Enable
      • Permission
        • Forbidden
        • Owners
        • Signed-in users
      • Emoji Reply
      • Enable
      • Versions and GitHub Sync
      • Note settings
      • Note Insights New
      • Engagement control
      • Make a copy
      • Transfer ownership
      • Delete this note
      • Insert from template
      • Import from
        • Dropbox
        • Google Drive
        • Gist
        • Clipboard
      • Export to
        • Dropbox
        • Google Drive
        • Gist
      • Download
        • Markdown
        • HTML
        • Raw HTML
    Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Help
    Menu
    Options
    Engagement control Make a copy Transfer ownership Delete this note
    Import from
    Dropbox Google Drive Gist Clipboard
    Export to
    Dropbox Google Drive Gist
    Download
    Markdown HTML Raw HTML
    Back
    Sharing URL Link copied
    /edit
    View mode
    • Edit mode
    • View mode
    • Book mode
    • Slide mode
    Edit mode View mode Book mode Slide mode
    Customize slides
    Note Permission
    Read
    Owners
    • Owners
    • Signed-in users
    • Everyone
    Owners Signed-in users Everyone
    Write
    Owners
    • Owners
    • Signed-in users
    • Everyone
    Owners Signed-in users Everyone
    Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.

    Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Explore these features while you wait
    Complete general settings
    Bookmark and like published notes
    Write a few more notes
    Complete general settings
    Write a few more notes
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # 雲端遊戲串流技術 ###### tags: `RD1` ## 雲端遊戲串流簡介 ![](https://i.imgur.com/G1HpolE.png) **傳統遊戲**我們需要將遊戲安裝到==指定的平台裝置==上才能夠遊玩,像是:XBOX、PS4、手機、桌機。如果有需要多人遊戲還需要將數據藉由網路傳遞到後端伺服器進行處理。由於不同遊戲可能對平台裝置有不同程度上的要求,玩家可能要==花費額外的金錢購買指定的平台裝置才能玩到想玩的遊戲,而且許多遊戲無法進行跨平台多人連線。== **雲端串流遊戲**的想法是只要把操作指令藉由網路傳給遠端的串流伺服器,由遠端的伺服器進行遊戲程式的操作遊玩並且把遊戲畫面藉由網路傳回給玩家。==這樣就可以大幅降低接觸遊戲的硬體門檻,更可以進行跨平台的遊戲遊玩。== **雲端串流遊戲操作的過程如下:** ![](https://i.imgur.com/58Qm0wf.png) 1. 使用者使用操作手把或其他輸入設備透過網路傳送操作指令到串流遊戲平台。 2. 指令接收器收到指令後,再用此指令操作遊戲。 3. 遊戲收到指令後會改變畫面渲染。 4. 串流遊戲平台會捕捉渲染後的畫面,交由影音編碼器編碼。 5. 編碼後的畫面交由影音串流器透過網路回送到客戶端。 6. 透過解碼器解碼後顯示在玩家的裝置上。 ### 傳統遊戲痛點 1. 硬體設備的花費,常常由於硬體設備不足而放棄一款遊戲,而行動裝置上的遊戲由於效能不足,可以發揮的空間就小於主機跟PC了。 2. 許多不同平台上的遊戲無法進行多人連線遊玩。 3. 獨佔遊戲,可能某ㄧ款遊戲只在特定平台裝置上運行,就必須買這特定平台裝置。 ::: info 獨佔遊戲就是指只有在特定平台才能玩的到遊戲 ::: ### 串流遊戲解決以上痛點: 1. 不須在硬體裝置上花費額外金錢,只要網路速度夠快,有一個能夠解析1080p 60fps影片的裝置就能玩遊戲。 2. 跨平台遠端連線,由於遊戲都放在同一個雲端串流伺服器,多人跨平台遊玩就不是很大的問題。 3. 不須下載、安裝、更新遊戲,遊戲直接在雲端上,開了就能玩。 4. 由於遊戲程式都放在雲端串流伺服器,從根本上解決外掛、駭客跟盜版。 5. 串流遊戲平台玩家很多,遊戲廠商就可能會考慮在該串流遊戲平台開發遊戲,只要串流遊戲平台統一市場就不會有獨佔遊戲問題,甚至有可能終結遊戲主機。 ### 串流遊戲的實際問題: 1. 網路速度,串流遊戲雖然不吃硬體效能,但卻吃你的網路速度。玩一些卡牌遊戲或是不吃什麼操作的RPG遊戲可能不會有什麼影響,但賽車遊戲、射擊遊戲、音樂遊戲、動作遊戲這些很吃操作的類型的話,一點點的延遲就會造成遊戲體驗瞬間被摧毀。畫面、介面再好都沒用了。還有串流遊戲的網路串流品質不只牽扯到串流遊戲平台本身而已,還關係到你所處的地方網路基礎建設。 2. 不同的串流遊戲平台廠商可能會開發出不同的開發標準,根本上無法解決獨佔遊戲的問題。 ## 實踐案例 以下是雲端串流技術的實踐: ### 使用Parsec軟體與雲端虛擬機器 [Parsec](https://parsecgaming.com/)軟體類似於遠端桌面軟體,不過Parsec可以將控制器(滑鼠、鍵盤、手把)相關的操作命令傳到機器裡面,遠端操作的機器也必須安裝Parsec軟體,以及想要玩的遊戲或者是遊戲平台( 如Steam )。服務的系統架構圖如下: ![](https://i.imgur.com/ag69qCJ.png) 類似的遠端遊戲串流軟體有很多,像是steam link...等。將跑遊戲的機器架在雲端的運算平台上的虛擬機器也可以達到雲端串流遊戲的效果。不過此類方法只能部屬少量虛擬機器對於大量的玩家就顯的無能為力。 ![](https://i.imgur.com/rZbpnD1.png) > 圖片引用自[How to: Create a Remote Gaming Server using Parsec on AWS](https://www.richardneililagan.com/posts/create-game-server-aws-parsec) ### GameAnywhere(2013) > 此段文章圖片部分擷取自[GamingAnyWhere](https://gaminganywhere.org/)官網與相關論文[GamingAnywhere-The First Open Source Cloud Gaming System](https://www.iis.sinica.edu.tw/~swc/pub/gaming_anywhere_open_source_system.html) GameAnyWhere是由交通大學黃俊穎教授與清華大學徐正炘教授與相關團隊開發的一個開源雲端遊戲串流系統專案。其專案主要都是用一些開源的函式庫或工具進行開發,算是很早期的雲端串流遊戲系統。 #### 部署架構圖 ![](https://i.imgur.com/AW1oEpD.png =400x) 上面的架構圖主要在解釋該專案部署的架構,右下角為client端一開始會先向Portal Servers選擇遊戲來玩,Portal Servers通知Game Servers運行相對指定的遊戲並將該Game Servers的IP傳給client端後,client端與Game Servers進行連線並開始遊玩。 #### Cient與Game Server溝通的系統架構圖 ![](https://i.imgur.com/J0FUlsg.png) 上面的架構圖說明了Server端將遊戲影音encode後透過RTSP/RTP/RTCP網路協議傳輸到Client端,Client端再進行decode並把畫面顯示出來;而玩家輸入方面則是透過自訂的Protocol利用網路傳輸到Server端然後進行操作回放。 #### Server端的架構圖 ![](https://i.imgur.com/MSFFQDi.png) #### Client端的架構圖 ![](https://i.imgur.com/e9N0wdt.png) #### 使用的套件與模組 * Server端 - Video Source( platform dependent ) - Audio Source( platform dependent ) - Encoders( various encoders via ffmpeg ) - Replayer( platform dependent ) - RTSP/RTP Server( using ffmpeg ) * Client端 - RTSP/RTP client( using live555 ) - Decoders( via ffmpeg ) - Controller( using SDL ) - Renderer( using SDL ) #### Demo [youtube影片](https://www.youtube.com/watch?v=--y2A0Q8HmE) ### Stadia Stadia 是 Google 營運的雲端遊戲串流服務。Google 聲稱服務支援最高4K解析度、每秒60影格、高動態範圍影片,由世界各地的伺服器經高速網際網路串流至用戶裝置。 #### 成為Stadia開發者 ![](https://i.imgur.com/CSTP7n0.png) 想要成為Stadia的開發者必須先做一些表單的填寫,表單內容會問你是哪一間公司,開發過什麼遊戲,以及開發過的遊戲使用者評價,提交表單後Google可能會先做一些評估再決定要不要給你開發工具與相關文件。 要成為Stadia開發者有以下要求: ![](https://i.imgur.com/fvBs5ff.png) 不過Google有在Youtube上釋出一些開發者指引影片可以讓開發者先看。 [A Guide to Stadia game development - Unity at GDC 2019](https://www.youtube.com/watch?v=aq-GA_oP6hw) [GDC 2019 Developer Session: A Guide to Developing on Stadia](https://www.youtube.com/watch?v=9gTglc-vr-c) [Stadia Streaming Tech: A Deep Dive (Google I/O'19)](https://www.youtube.com/watch?v=9Htdhz6Op1I) 通過評核之後應該是會給你一個Google Games Platform網頁,上面會有Google遊戲開發相關的文件與工具。 ![](https://i.imgur.com/b8S6lD1.png) #### Stadia的系統架構 ![](https://i.imgur.com/xRgCaRc.png) #### Stadia開發 Stadia開發主要是以PaaS(平台即服務)的形式提供給開發者。 ![](https://i.imgur.com/sfl3Tch.png =200x) Stadia是將使用者開發的遊戲放在Google data center的Virtual Machine上進行運行,Virtual Machine使用的硬體配置: ![](https://i.imgur.com/usAL3dq.png =450x) Stadia在雲端所運行的Virtual Machine被稱為instance,Virtual Machine為了提供雲端串流遊戲有進行一些優化: ![](https://i.imgur.com/OKL8VdR.png) Stadia instance 可以在本地端或雲端運行,開發上你可以在自己的Server運行instance,但最終測試還是希望在雲端遊玩測試。 ![](https://i.imgur.com/JlEktn7.png =600x) ![](https://i.imgur.com/pNpwTTn.png =600x) ![](https://i.imgur.com/d4DlBSE.png =600x) Stadia instance作業系統使用的是Linux為核心的作業系統,Stadia會提供一系列底層(網路、畫面、輸入)的API函式庫與套件,像是:Vulkan。 ![](https://i.imgur.com/fQf0vsY.png =600x) Stadia會提供一系列的開發與管理的工具,裡面提供比較多比較面向於遊戲開發的工具,像是Unity、CryEngine、Visual Studio、RenderDoc、VTune。 Stadia主要會以Web UI,Command Line...,供開發者與Stadia平台做互動 ![](https://i.imgur.com/wTXHCf8.png) WebUI的管理工具 ![](https://i.imgur.com/7eFPTcV.png) #### 將開發好的遊戲放上Stadia instance ![](https://i.imgur.com/zS7Tmjo.png) ![](https://i.imgur.com/V8E91d2.png) ![](https://i.imgur.com/AhPfxpT.png) 開發好的二進制檔與相關檔案可以用類似掛載的方式掛載到遠端的Stadia instance,然後執行遊戲的二進制檔。 #### 使用Package管理你的遊戲 ![](https://i.imgur.com/iNWIXkZ.png) #### 關於技術導入 ![](https://i.imgur.com/UE0nBzd.png) Stadia所提供的方案,是如圖一這樣的規劃,其他雲端串流平台商應該也是如此規劃。客戶端會送出操作指令給串流雲端運算中心上的instance,instance接收到操作指令後對遊戲進行相對應的操作。遊戲接收到指令後會改變遊戲環境與狀態,遊戲引擎會進行運算將環境進行渲染,渲染後的場景影像會經由串流傳輸到客戶端。 要在Stadia開發遊戲必須使用Stadia提供的SDK進行遊戲的開發,這方面由於還沒獲得實際的開發工具,所以instance真正的開發環境與流程還不是很清楚。 #### Stadia與Parsec的差別 使用Stadia,Google會幫你處理好虛擬機器部署的問題,而Stadia Instance也會透過特殊的調整進行優化,就是一個專門跑遊戲的虛擬機器,基本上可以把它當作一個家用主機來看待。 使用Parsec就必須跑一台電腦,不管是架在本地或雲端,而這台電腦必須有安裝你要玩的遊戲,可以把它理解為是一款遠端控制軟體。 ### Project xCloud #### project xcloud開發 ![](https://i.imgur.com/ZQztRvU.png) [project xCloud開發](https://developer.microsoft.com/en-us/games/products/project-xcloud/) Microsoft有提供開發的文件給開發者做閱讀,提供的部分主要是關於client端與server端之間介接的操作說明文件,有提供「Getting Start」以及「Project xCloud | Game Developers Conference 2019」影片。 開發的流程 ![](https://i.imgur.com/14llQ8A.png) 介面配置對應實際操作 ![](https://i.imgur.com/DJi57uj.png) [Getting Start](https://docs.microsoft.com/zh-tw/gaming/game-streaming/get-started/stream-your-game) ![](https://i.imgur.com/i6tOT3m.png) 文件中也有提供能夠介接他們API的使用範例 ![](https://i.imgur.com/9xLJ02U.png) 透過這樣的設定能夠,將手機介面上所進行的的操作, 對應到實際上遊戲的操作。 ![](https://i.imgur.com/cG7Y6JZ.png) ``` javascrpt= { id: 'standard', name: 'Standard', left: { inner: [ { type: 'joystick', expand: false, axis: { input: 'axisXY', output: 'leftJoystick', deadzone: { threshold: 0.05, radial: true, }, }, }, ], outer: [ null, null, [ { type: 'directionalPad', }, ], { type: 'button', action: 'leftThumb', }, null, { type: 'button', action: 'leftTrigger', }, { type: 'button', action: 'leftBumper', }, ], }, right: { inner: [ { type: 'button', action: 'gamepadY', }, { type: 'button', action: 'gamepadB', }, { type: 'button', action: 'gamepadA', }, { type: 'button', action: 'gamepadX', }, ], outer: [ { type: 'button', action: 'rightBumper', }, { type: 'button', action: 'rightTrigger', }, null, { type: 'button', action: 'rightThumb', }, [ { type: 'joystick', axis: { input: 'axisXY', output: 'rightJoystick', deadzone: { threshold: 0.05, radial: true, }, }, }, ], ], }, upper: { leftCenter: [ { type: 'button', action: 'view', }, ], rightCenter: [ { type: 'button', action: 'menu', }, ], }, } ``` 將對手機螢幕的實際操作對應到App中按鍵的操作 ```C++= void ViewProvider::OnPointerPress( _In_ CoreWindow^ sender, _In_ PointerEventArgs^ args) { HandlePointerUpdateEvent( args->CurrentPoint->Properties->PointerUpdateKind, args->CurrentPoint->Timestamp, args->CurrentPoint->PointerDevice->PointerDeviceType == Windows::Device::Input::PointerDeviceType::Touch, args->CurrentPoint->Position.X, args->CurrentPoint->Position.Y); } ``` ```C++= if (Event.bTouch) { if (Cursor.IsValid()) { Cursor->SetPosition( static_cast<int32>(Event.TouchX), static_cast<int32>(Event.TouchY)); MessageHandler->onMouseMove; } } ``` 以下是一些基礎的API ```C++= // 判斷使用xCloud遊玩遊戲,是利用串流的方式或是連接到xbox主機 XGameStreamingIsStreaming() // 判斷連接的狀況,通常會使用在連線以及斷線 XGameStreamingRegisterConnectionStateChanged() ``` ## 結論 以上有介紹的雲端遊戲串流最簡單的架構圖以及原理,中間也有提到三個實踐的案例, 1. 使用第三方的軟體-Parsec與雲端虛擬機的方案,這就是一種遠端桌面,透過他人寫好的軟體來達成原端遊玩遊戲的方法。 2. 該如何將視訊串流、玩家控制在server與client端之間互相傳送進行比較深入的研究,自行開發出能夠遠端連線至桌面的方法。 3. Google已經實作好所有的溝通方法,給開發者一個能夠將自己的遊戲部署上去的空間,使用的開發引擎通常為Unity、Unreal等等的遊戲引擎,目前比較沒有實作面的資料。 來分析一下優缺點 1. 無法進行自動部署,第一種方法必須在虛擬機上面安裝Parsec並且還要進行登入才能將遊戲分享給其他人來做遊玩。 2. 管理不便以及對於虛擬機的擴展並沒有做很好的規劃,講者在演講中也有提到說並沒有特別去測試多人去擴展部署的部分,他們所開發的軟體包是git開源出來,要部署是能夠方便的部署出去,但是程式碼已經沒有在做維護,並且如果有新的使用者連線就要開一台全新的虛擬機給他一個人做使用,這樣的擴展方式太耗費資源了。 3. 使用Google的平台進行開發雖然很方便,但是要註冊成為他們的開發者,所在的國家必須要有可以運行Stadia instance的data center,台灣並沒有他們的data center。除了這個之外,他們所使用的開發引擎是屬於遊戲的開發引擎,所以如果不是使用那些開發引擎要部署上去也會遇上許多的問題。 所以 **==B > Z==** ## 參考資料 [云游戏解决方案](https://cloud.tencent.com/solution/gs) [遊戲解決方案](https://www.alibabacloud.com/tc/solutions/gaming#J_5121148540) [Getting Started with AWS Game Tech](https://www.aws.training/Details/eLearning?id=47467) [Stadia develope](https://stadia.dev/) [Microsoft project xcloud](https://developer.microsoft.com/en-us/games/products/project-xcloud/) [為您隆重介紹 Facebook Gaming 雲端遊戲平台](https://www.facebook.com/fbgaminghome/blog/cloud-gaming-meet-facebook-gaming) [2020 Microsoft Gaming Developer Conference 雲端遊戲開發者大會](https://seminar.ithome.com.tw/live/microsoftgdc2020/index.html) [已經進入SaaS / PaaS / IaaS 時代已久,還在用舊時代想法規劃網站嗎?](https://progressbar.tw/posts/51) [A Year in the life of a Stadia Game Developer](https://www.youtube.com/watch?v=V7CWcsJkORw) [Building a Best-in-Class Game Streaming Experience on Project xCloud | Game Stack Live](https://www.youtube.com/watch?v=e23n-eh8GiY) [Project xCloud | Game Developers Conference 2019](https://www.youtube.com/watch?v=azwGB5w_yfQ&list=PLRs2lXTYCDQ3q9WF-4aO2SgCCCL6rSmA6&index=35&t=0s) [Bringing Destiny to Stadia: A postmortem (Google Games Dev Summit)](https://www.youtube.com/watch?v=cEQkPe-H05I) [讓手機像Switch一樣玩3A級大作 使用雲端遊戲串流打造自己的Google Stadia](https://medium.com/%E9%AB%92%E6%A1%B6%E5%AD%90/%E8%AE%93%E6%89%8B%E6%A9%9F%E5%83%8Fswitch%E4%B8%80%E6%A8%A3%E7%8E%A93a%E7%B4%9A%E5%A4%A7%E4%BD%9C-%E4%BD%BF%E7%94%A8%E9%9B%B2%E7%AB%AF%E9%81%8A%E6%88%B2%E4%B8%B2%E6%B5%81%E6%89%93%E9%80%A0%E8%87%AA%E5%B7%B1%E7%9A%84google-stadia-e5896faf806d) [ELI5: Does Stadia basically work like Parsec with Google's server as the host?](https://www.reddit.com/r/Stadia/comments/bv9x9p/eli5_does_stadia_basically_work_like_parsec_with/) [webrtcH4cKS: ~ Open Source Cloud Gaming with WebRTC](https://webrtchacks.com/open-source-cloud-gaming-with-webrtc/) [What is Stadia Makers?](https://www.youtube.com/watch?v=c9oDavKLDj4) [走向天際─Stadia (天梯)雲端遊戲平台介紹與接受度調查](https://st2.ilvs.ilc.edu.tw/~pr108b05/pr108b05.pdf)

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password
    or
    Sign in via Google Sign in via Facebook Sign in via X(Twitter) Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    By signing in, you agree to our terms of service.

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully