<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: giongto35</title>
    <description>The latest articles on DEV Community by giongto35 (@giongto35).</description>
    <link>https://dev.to/giongto35</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F242092%2Fe001e848-52d7-4fd5-9e46-e7136fa95827.jpeg</url>
      <title>DEV Community: giongto35</title>
      <link>https://dev.to/giongto35</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/giongto35"/>
    <language>en</language>
    <item>
      <title>Blogs are harmful and we are learning wrongly!</title>
      <dc:creator>giongto35</dc:creator>
      <pubDate>Thu, 06 Feb 2020 11:37:02 +0000</pubDate>
      <link>https://dev.to/giongto35/blogs-are-harmful-and-we-are-learning-wrongly-19hl</link>
      <guid>https://dev.to/giongto35/blogs-are-harmful-and-we-are-learning-wrongly-19hl</guid>
      <description>&lt;p&gt;One of the common problems everyone is facing nowadays is "there is too much information on the internet". Every time you wake up, there are hundreds of articles throwing to your face.&lt;/p&gt;

&lt;p&gt;Do you ever feel you read a lot of blogs like spending 4 hours per day on HackerNews and your level is still nowhere? or even you feel knowledge-wise and invincible after reading a lot about a topic and then got shut down in a discussion when the material going to deep.&lt;/p&gt;

&lt;p&gt;It's because you are spending too much time reading blogs.&lt;/p&gt;

&lt;p&gt;Why blogs are harmful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The content is not written for you, it's for the writer&lt;/strong&gt;! The purpose of blogs mostly ends up in product promotion, technical advancement show-off. Writers rarely think about how much users can learn from it, instead, they tend to throw their experience and achievement to the post. Those typical blog types: How we migrate from X to Y. Why X is better than Y. How did we reach millions of users. Our journey to Y ...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blogs create misinformation bias&lt;/strong&gt;. If you are new to the topic, you easily feel super convinced as you don't have any context as well as exposure. For example, when you read something like "Why does some &lt;em&gt;favorite company&lt;/em&gt; choose Rust over Golang", it easily causes a subconscious that Rust is better than Go in most aspects because the favorite company did it. Then the next time you work on related stuff, you will prioritize Rust and find the reasons to choose it over Go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blogs are unstructured&lt;/strong&gt;. Blogs usually come up with only one post, so writers have to assume every reader has the same basic level of knowledge. Therefore, most blogs are shallow and duplicated. They cannot put a one-page explanation just for a difficult concept that is not so relevant to the post. Multiple misunderstanding gaps from unexplained material can accumulate to a &lt;strong&gt;fragile knowledge foundation&lt;/strong&gt;, which can hinder you from learning a subject more organized next time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blogs are written by unprofessional writers&lt;/strong&gt;. Most of the tech blogs are written by software engineers or people working in tech. Some are good of course, but most are bad because our profession is not writing. Outlining the writing or giving concise knowledge is an art and it's not easily obtained for new writers after. Moreover, when you switch between different writing styles, your reading speed is also slow down due to context switch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It consumes your time&lt;/strong&gt;. When you spent 30 mins reading blogs, you decided to give up your time reading a book chapter. Even if you cherry-pick blogs to read, you already waste time skimming all blogs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those reasons, I think we should reduce our time reading blogs and invest more in structured material like books or courses. If you cannot find the time or have less time for books, it's a red flag.&lt;/p&gt;

&lt;p&gt;I still find tech blogs are helpful for the career: they bring you to the outside world, offers diverse perspective, keep you up-to-date with this fast-changing world... But if you are considering Blogs as your source of knowledge, you are learning technology wrongly!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>computerscience</category>
      <category>news</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How I built a cloud Gaming service, part 1</title>
      <dc:creator>giongto35</dc:creator>
      <pubDate>Wed, 04 Dec 2019 21:41:50 +0000</pubDate>
      <link>https://dev.to/giongto35/cloud-gaming-the-art-of-extremely-latency-streaming-4777</link>
      <guid>https://dev.to/giongto35/cloud-gaming-the-art-of-extremely-latency-streaming-4777</guid>
      <description>&lt;p&gt;&lt;em&gt;(This is a part of my cloudretro.io series. Introduced in &lt;a href="https://dev.to/giongto35/i-write-a-cloud-gaming-service-for-retro-games-in-go-lkn"&gt;https://dev.to/giongto35/i-write-a-cloud-gaming-service-for-retro-games-in-go-lkn&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This part of the series will introduce the challenges of cloud gaming technology and describe how I design the cloud gaming system.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and technology
&lt;/h2&gt;

&lt;p&gt;Cloud gaming is innovative not only in its application but also in the technical aspect of game streaming. If Google or Microsoft succeeds with Stadia and XCloud, it will mark the new milestone of technology.&lt;/p&gt;

&lt;p&gt;Behind Cloud gaming is the art of extremely low latency streaming to ensure user interaction is as smooth as possible. There is no other application in history requiring this tight delay. Taking comparison with live stream platforms like Twitch or Youtube, it is acceptable for them to have a few seconds delay as long as they can broadcast an undisruptive stream. On the other hand, the goal of Cloud Gaming is to keep the gap between input from users and media unnoticeable while maintaining media quality. In this tight gap, &lt;strong&gt;Game logic + Heavy Video/Audio Encoding Decoding + Network Round Trip... must run with 60 FPS, less than 20ms per frame&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  To a &lt;a href="https://github.com/giongto35/cloud-game"&gt;Github&lt;/a&gt; trending POC
&lt;/h2&gt;

&lt;p&gt;I found cloud gaming is very challenging, so I decided to make a Cloud Gaming POC to test how good the system I can achieve. I loosen the requirement to make it more feasible to start.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I target Retro Games (NES/GBA/PS) instead of modern AAA games. These games don't require much computation resources and have less image entropy. &lt;/li&gt;
&lt;li&gt;The service runs on the browser directly to demonstrate the spirit of cloud gaming: bring the most comfortable gaming experience without any initialization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/GUBrJGAxZZg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Design cloud gaming service: Tech stack
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1. CloudGaming like Stadia hosts offline single-player games, not online games.
&lt;/h4&gt;

&lt;p&gt;This requirement sounds not relevant and simple but it’s one of my key findings. It makes cloud gaming different from trivial streaming service. If we focus on a single-player, we don’t need to distribute the game stream and get rid of a centralized server or CDN.&lt;/p&gt;

&lt;p&gt;Therefore, instead of uploading a stream to ingest server or passing media packets to a centralized WebSocket server, the server will set up a peer to peer communication with the user. Multiple streaming servers will be managed by a central coordinator. You can check the infrastructure diagram below for more understanding. &lt;/p&gt;

&lt;h4&gt;
  
  
  2. Full control of Game Emulator internal for easier state manipulation.
&lt;/h4&gt;

&lt;p&gt;I need full control from Game Emulator, so I can hook the image/audio out directly from the emulator and manage game state easier. I picked &lt;a href="https://www.libretro.com/"&gt;libretro&lt;/a&gt; using its &lt;a href="https://github.com/libretro/ludo"&gt;GoLang Wrapper&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Low Latency media stream
&lt;/h4&gt;

&lt;p&gt;A compression algorithm for media is a must for these latency-sensitive projects. The compression algorithm needs to perform fast encoding and decoding speed per frame. H264/VP8/VP9 Video Codec and Opus Audio Codec are famous in this field and I applied them to my project. These compression algorithms are designed to run on GPU and optimized for network transmission.&lt;/p&gt;

&lt;p&gt;As I know, Google Stadia has some other optimization on this compression flow such as&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Researching a better Video Encoding algorithm dedicated to cloud gaming use case.&lt;/li&gt;
&lt;li&gt;Applying distributed GPU to empower and scale compression flow. This distributed GPU infrastructure likely also comes from Google's existing machine learning foundation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Reduce network latency
&lt;/h4&gt;

&lt;p&gt;No matter how good your compression and how optimal your code is, the network still contributes the most to latency. To deal with that, we distribute the streaming servers around the world and the infrastructure has a mechanism to pick the closest server to the user.&lt;br&gt;&lt;br&gt;
In Google Stadia's introduction, Google built an infrastructure to distribute their stream server around the globe for Stadia.&lt;/p&gt;
&lt;h4&gt;
  
  
  5. Browser Compatible
&lt;/h4&gt;

&lt;p&gt;One of cloud gaming service goals is to make the gaming experience as comfortable as possible. Being able to run on the browser as a web service can get rid of any gaming software or hardware, and achieve cross-platform flexibility on Mobile, Desktop.&lt;/p&gt;
&lt;h4&gt;
  
  
  6. Horizontal scaling
&lt;/h4&gt;

&lt;p&gt;And Last but not least, as every SAAS nowadays, it must be designed to be Horizontally scalable. The infrastructure is self-implemented to distribute and match game sessions properly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Infrastructure
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lCaGblrx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p1vo8t1driu0hmyjrpej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lCaGblrx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p1vo8t1driu0hmyjrpej.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  More on &lt;a href="http://cloudretro.io"&gt;CloudRetro.io&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This is the end of the first part in my series. You can check my presentation in GopherCon Vietnam 2019 about this topic: &lt;a href="https://www.youtube.com/watch?v=tVQ269gzZcE&amp;amp;list=PLtTY3_zVDGOCLIKrfeCMHYoYVtDVopbTC&amp;amp;index=12&amp;lt;br&amp;gt;%0ASlide"&gt;&lt;strong&gt;Video&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://docs.google.com/presentation/d/1VFv8l2hVUINv2U36r7L11g4Oa_zVjHlr6MYymUbQXT4/edit#slide=id.g6fb5703b68_0_10"&gt;&lt;strong&gt;Slide&lt;/strong&gt;&lt;/a&gt; here. I attached my speaker note in the slide as well. &lt;strong&gt;The blog series will have more detailed and clearer explanation, so please still keep following.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please give me more motivation to write by upvote this post or staring &lt;a href="https://github.com/giongto35/cloud-game"&gt;Github&lt;/a&gt; repo&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/giongto35"&gt;
        giongto35
      &lt;/a&gt; / &lt;a href="https://github.com/giongto35/cloud-game"&gt;
        cloud-game
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Web-based Cloud Gaming service for Retro Game
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
CloudRetro&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/giongto35/cloud-game/actions?query=workflow:build"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K65t11kG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/giongto35/cloud-game/workflows/build/badge.svg" alt="Build"&gt;&lt;/a&gt;
&lt;a href="https://github.com/giongto35/cloud-game/releases/latest"&gt;&lt;img src="https://camo.githubusercontent.com/2e7d6a4a2a40ea9c6bda8f0561a34f8ac054955f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f67696f6e67746f33352f636c6f75642d67616d652e737667" alt="Latest release"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open-source Cloud Gaming Service For Retro Games&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Video demo&lt;/strong&gt;: &lt;a href="https://www.youtube.com/watch?v=GUBrJGAxZZg" rel="nofollow"&gt;https://www.youtube.com/watch?v=GUBrJGAxZZg&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Technical wrapup&lt;/strong&gt;: &lt;a href="https://webrtchacks.com/open-source-cloud-gaming-with-webrtc/" rel="nofollow"&gt;https://webrtchacks.com/open-source-cloud-gaming-with-webrtc/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Introduction&lt;/h2&gt;
&lt;p&gt;CloudRetro provides an open-source cloud gaming platform for retro games. It started as an experiment for testing cloud gaming performance with &lt;a href="https://github.com/pion/webrtc/"&gt;WebRTC&lt;/a&gt; and &lt;a href="https://www.libretro.com/" rel="nofollow"&gt;libretro&lt;/a&gt;, and now it aims to deliver the most modern and convenient gaming experience through the technology.&lt;/p&gt;
&lt;p&gt;Theoretically, in cloud gaming, games are run on remote servers and media are streamed to the player optimally to ensure the most comfortable user interaction. It opens the ability to play any retro games on web-browser directly, which are fully compatible with multi-platform like Desktop, Android, &lt;del&gt;IOS&lt;/del&gt;.&lt;/p&gt;
&lt;h2&gt;
Try the service at&lt;/h2&gt;
&lt;p&gt;Single play: &lt;strong&gt;&lt;a href="http://cloudretro.io" rel="nofollow"&gt;http://cloudretro.io&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Direct play an existing game: &lt;strong&gt;&lt;a href="https://cloudretro.io/?id=4a5073a4b05ad0fe___Pokemon%20-%20Emerald%20Version%20(U)" rel="nofollow"&gt;Pokemon Emerald&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;*In ideal network condition and less resource contention on servers, the game will run smoothly as in the video demo. Because I only hosted the platform on limited servers in…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/giongto35/cloud-game"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>go</category>
      <category>computerscience</category>
      <category>distributedsystems</category>
      <category>github</category>
    </item>
    <item>
      <title>CloudRetro - Open Source Cloud Gaming Service for Retro Games written in Go</title>
      <dc:creator>giongto35</dc:creator>
      <pubDate>Sun, 01 Dec 2019 16:58:54 +0000</pubDate>
      <link>https://dev.to/giongto35/i-write-a-cloud-gaming-service-for-retro-games-in-go-lkn</link>
      <guid>https://dev.to/giongto35/i-write-a-cloud-gaming-service-for-retro-games-in-go-lkn</guid>
      <description>&lt;p&gt;2019 is the Year of Cloud gaming with the multiple announcements from Google Stadia, Microsoft XCloud, Playstation Now... and recently Google Stadia released this 19th November. Looking back, I was so excited when I first read the news from Google Stadia. Cloud gaming is a very innovative idea and it will definitely become the next generation of not only Game but also other fields of computer science. My curiosity about this technology motivated me to make a POC of Cloud-Gaming for Retro Game.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/giongto35" rel="noopener noreferrer"&gt;
        giongto35
      &lt;/a&gt; / &lt;a href="https://github.com/giongto35/cloud-game" rel="noopener noreferrer"&gt;
        cloud-game
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Web-based Cloud Gaming service for Retro Game
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Video Demo
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/GUBrJGAxZZg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  About Cloud Gaming technology
&lt;/h1&gt;

&lt;p&gt;As we know about web-server, the more information backend can provide, the more flexible the frontend can render. Cloud Gaming &lt;strong&gt;maximizes backend control&lt;/strong&gt; and &lt;strong&gt;minimizes frontend logic&lt;/strong&gt; by running Game on server and streaming images/audio to users. In this way, clients are totally decoupled from heavy logic and no longer limited by hardware constraints. If we apply the same methodology to other heavy offline applications like an operating system, E.g run Microsoft Window on Google Chrome Browser like this&lt;/p&gt;

&lt;p&gt;Behind Cloud gaming is an &lt;strong&gt;art of extremely low latency streaming&lt;/strong&gt; to ensure user interaction is as smooth as possible. At first, I have a doubt on Google claim because I don't believe the streaming technology reached this advance yet. For that reason, I made this project to verify that claim and the result is above my expectation. In this project, I applied &lt;a href="https://github.com/pions/webrtc/tree/master/examples/sfu-minimal" rel="noopener noreferrer"&gt;WebRTC&lt;/a&gt; with Video/Audio Compression (VP8/OPUS) to optimize package size and implemented a distributed &lt;a href="https://github.com/giongto35/cloud-game/wiki/Infrastructure" rel="noopener noreferrer"&gt;infrastructure&lt;/a&gt; to enable horizontal scaling and optimal server pairing for better network latency. &lt;/p&gt;

&lt;p&gt;I picked Golang for my POC because I’m familiar with it the most, then it turned out to work perfectly in my case. Go concurrency design greatly helped when dealing with concurrency and event stream. For example, I can achieve CrowdPlay with just a few lines of code using Golang Fan-in Fan-out pattern.&lt;/p&gt;

&lt;h1&gt;
  
  
  Feature
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Cloud gaming&lt;/strong&gt;: Game logic and storage is hosted on cloud service. Images and audio are streamed to users in the most optimal way.&lt;br&gt;
&lt;strong&gt;Cross-platform&lt;/strong&gt;: The game is run on web browser, the most universal built-in app. No console, plugin, external app or devices are needed. Chrome with the latest version is recommended for the game.&lt;br&gt;
&lt;strong&gt;Emulator agnostic&lt;/strong&gt;: The game can be played directly without any extra effort to set up the gaming emulator or platform. It is based on &lt;a href="https://libretro.com" rel="noopener noreferrer"&gt;Libretro library&lt;/a&gt; and &lt;a href="https://github.com/libretro/ludo" rel="noopener noreferrer"&gt;ludo&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Crowdplay&lt;/strong&gt;: Follow the idea of crowdplay (TwitchPlaysPokemon), multiple players can play the same game together by addressing the same deeplink. This is the feature Google Stadia promised couldn't deliver for the first release.&lt;br&gt;
&lt;strong&gt;Vertically scaled&lt;/strong&gt;: The infrastructure is designed to be able to scale under high traffic by adding more instances.&lt;br&gt;
&lt;strong&gt;Cloud storage&lt;/strong&gt;: the Game state is storing on online storage, so you can come back and continue playing your incomplete game.&lt;/p&gt;
&lt;h1&gt;
  
  
  Demo
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Single play&lt;/strong&gt;: &lt;a href="//cloudretro.io"&gt;&lt;strong&gt;http://cloudretro.io&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Crowd play&lt;/strong&gt;: &lt;a href="http://cloudretro.io/?id=652e45d78d2b91cd%7CPokemon%20-%20Emerald%20Version%20%28U%29" rel="noopener noreferrer"&gt;&lt;strong&gt;Pokemon Emerald&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
Arrow key + H (Help) + Z X C V + S (Save) + A (Load) + F (Full screen)&lt;br&gt;
&lt;strong&gt;Chrome&lt;/strong&gt; and &lt;strong&gt;Chrome on Android&lt;/strong&gt; is recommended. It's not working on IPhone and some other explorers. In an ideal network condition, the Game should be run smoothly as in the Video. Because I only hosted the platform on limited servers in US East, US West, Eu, Singapore, you may experience some latency issues + connection problem. You can try hosting the service following the instruction on Github.&lt;/p&gt;
&lt;h1&gt;
  
  
  Crowdplay
&lt;/h1&gt;

&lt;p&gt;By clicking these deep-link, you can join the game directly and play it together with other people joining the same link.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://cloudretro.io/?id=652e45d78d2b91cd%7CPokemon%20-%20Emerald%20Version%20%28U%29" rel="noopener noreferrer"&gt;Play Pokemon Emerald&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cloudretro.io/?id=3f7462269e976303___Harvest%20Moon%20-%20Back%20to%20Nature%20%28USA%29" rel="noopener noreferrer"&gt;Harvest Moon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cloudretro.io/?id=1953c570fee1f9e4___Super%20Mario%20Bros" rel="noopener noreferrer"&gt;Mario&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you can host the new game by yourself by accessing &lt;a href="//cloudretro.io"&gt;cloudretro.io&lt;/a&gt; and click "share" button to generate a deeplink to your current game.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer&lt;/em&gt;: You may experience lagging when joining a room, it is because the room is in a different zone. In that case, you can create a new room.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg7s3vn5hn5heiemyp68z.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg7s3vn5hn5heiemyp68z.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
(&lt;em&gt;Two players are playing the Pokemon Emerald together&lt;/em&gt;)&lt;/p&gt;
&lt;h1&gt;
  
  
  How I implemented it in Golang
&lt;/h1&gt;

&lt;p&gt;I had presentation in &lt;strong&gt;GopherCon Vietnam 2019&lt;/strong&gt; about this topic, you can find the &lt;a href="https://www.youtube.com/watch?v=tVQ269gzZcE&amp;amp;list=PLtTY3_zVDGOCLIKrfeCMHYoYVtDVopbTC&amp;amp;index=12&amp;lt;br&amp;gt;%0ASlide" rel="noopener noreferrer"&gt;&lt;strong&gt;Video&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://docs.google.com/presentation/d/1VFv8l2hVUINv2U36r7L11g4Oa_zVjHlr6MYymUbQXT4/edit#slide=id.g6fb5703b68_0_10" rel="noopener noreferrer"&gt;&lt;strong&gt;Slide&lt;/strong&gt;&lt;/a&gt; here. You can see my speaker note in the slide as well. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2p6yie0so6al81jq1391.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2p6yie0so6al81jq1391.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
(&lt;em&gt;GoCode Diagram from slide&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;Please check  &lt;a href="https://github.com/giongto35/cloud-game" rel="noopener noreferrer"&gt;Github&lt;/a&gt; repo and Wiki for more details.&lt;/p&gt;
&lt;h1&gt;
  
  
  Next in the series
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/giongto35/cloud-gaming-the-art-of-extremely-latency-streaming-4777"&gt;&lt;strong&gt;Part 1: How I design a cloud gaming service&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/giongto35" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F242092%2Fe001e848-52d7-4fd5-9e46-e7136fa95827.jpeg" alt="giongto35"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/giongto35/cloud-gaming-the-art-of-extremely-latency-streaming-4777" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How I built a cloud Gaming service, part 1&lt;/h2&gt;
      &lt;h3&gt;giongto35 ・ Dec 4 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#go&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#computerscience&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#distributedsystems&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  Author
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/huuthanhnguyen/" rel="noopener noreferrer"&gt;Nguyen Huu Thanh&lt;/a&gt;&lt;br&gt;
&lt;a href="https://trich.im" rel="noopener noreferrer"&gt;Tri Dang Minh&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  If you like the project, please give me a &lt;strong&gt;star&lt;/strong&gt; or contribute to &lt;a href="https://github.com/giongto35/cloud-game" rel="noopener noreferrer"&gt;Github&lt;/a&gt;
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/giongto35" rel="noopener noreferrer"&gt;
        giongto35
      &lt;/a&gt; / &lt;a href="https://github.com/giongto35/cloud-game" rel="noopener noreferrer"&gt;
        cloud-game
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Web-based Cloud Gaming service for Retro Game
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CloudRetro&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/giongto35/cloud-game/actions?query=workflow:build" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/giongto35/cloud-game/workflows/build/badge.svg" alt="Build"&gt;&lt;/a&gt;
&lt;a href="https://github.com/giongto35/cloud-game/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/93a9c791ad46ee5a90c91b837c3dd5fb9ec6de1cbf229847060aa633851e43ec/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f67696f6e67746f33352f636c6f75642d67616d652e737667" alt="Latest release"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open-source Cloud Gaming Service For Retro Games&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Video demo&lt;/strong&gt;: &lt;a href="https://www.youtube.com/watch?v=GUBrJGAxZZg" rel="nofollow noopener noreferrer"&gt;https://www.youtube.com/watch?v=GUBrJGAxZZg&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Technical wrapup&lt;/strong&gt;: &lt;a href="https://webrtchacks.com/open-source-cloud-gaming-with-webrtc/" rel="nofollow noopener noreferrer"&gt;https://webrtchacks.com/open-source-cloud-gaming-with-webrtc/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;CloudMorph&lt;/strong&gt;: &lt;a href="https://github.com/giongto35/cloud-morph" rel="noopener noreferrer"&gt;https://github.com/giongto35/cloud-morph&lt;/a&gt;: My current focus
on generic solution for cloudgaming&lt;/p&gt;
&lt;p&gt;Discord: &lt;a href="https://discord.gg/sXRQZa2zeP" rel="nofollow noopener noreferrer"&gt;Join Us&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/846874/235532552-8c8253df-aa8d-48c9-a58e-3f54e284f86e.jpg"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F846874%2F235532552-8c8253df-aa8d-48c9-a58e-3f54e284f86e.jpg" alt="screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Try it at &lt;strong&gt;&lt;a href="https://cloudretro.io" rel="nofollow noopener noreferrer"&gt;cloudretro.io&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Direct play an existing game: &lt;strong&gt;&lt;a href="https://cloudretro.io/?id=1bd37d4b5dfda87c___Pokemon%20-%20Emerald%20Version%20(U)" rel="nofollow noopener noreferrer"&gt;Pokemon Emerald&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;CloudRetro provides an open-source cloud gaming platform for retro games. It started as an experiment for testing cloud
gaming performance with &lt;a href="https://github.com/pion/webrtc/" rel="noopener noreferrer"&gt;WebRTC&lt;/a&gt; and &lt;a href="https://www.libretro.com/" rel="nofollow noopener noreferrer"&gt;Libretro&lt;/a&gt;, and now it
aims to deliver the most modern and convenient gaming experience through the technology.&lt;/p&gt;
&lt;p&gt;Theoretically, in cloud gaming, games are run on remote servers and media are streamed to the player optimally to ensure
the most comfortable user interaction. It opens the ability to play any retro games on web-browser directly, which are
fully compatible with multi-platform like Desktop, Android, &lt;del&gt;IOS&lt;/del&gt;.&lt;/p&gt;
&lt;p&gt;In ideal network condition and less resource contention on servers, the game will run smoothly as in the…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/giongto35/cloud-game" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>go</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>githunt</category>
    </item>
  </channel>
</rss>
