8000 java-design-patterns/game-loop at master · dbh/java-design-patterns · GitHub
[go: up one dir, main page]

Skip to content
{"payload":{"allShortcutsEnabled":false,"path":"game-loop","repo":{"id":247618471,"defaultBranch":"master","name":"java-design-patterns","ownerLogin":"dbh","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2020-03-16T05:29:20.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/664513?v=4","public":true,"private":false,"isOrgOwned":false},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1614764407.16123","canEdit":false,"refType":"branch","currentOid":"0ad67c872635f0246453a4b9ce1a3ea30b5a0cc4"},"tree":{"items":[{"name":"etc","path":"game-loop/etc","contentType":"directory"},{"name":"src","path":"game-loop/src","contentType":"directory"},{"name":"README.md","path":"game-loop/README.md","contentType":"file"},{"name":"pom.xml","path":"game-loop/pom.xml","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":{"displayName":"README.md","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003elayout\u003c/th\u003e\n \u003cth\u003etitle\u003c/th\u003e\n \u003cth\u003efolder\u003c/th\u003e\n \u003cth\u003epermalink\u003c/th\u003e\n \u003cth\u003ecategories\u003c/th\u003e\n \u003cth\u003etags\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cdiv dir=\"auto\"\u003epattern\u003c/div\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cdiv dir=\"auto\"\u003eGame Loop\u003c/div\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cdiv dir=\"auto\"\u003egame-loop\u003c/div\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cdiv dir=\"auto\"\u003e/patterns/game-loop/\u003c/div\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cdiv dir=\"auto\"\u003eBehavioral\u003c/div\u003e\u003c/td\u003e\n \u003ctd\u003e\u003cdiv dir=\"auto\"\u003e\u003ctable\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cdiv dir=\"auto\"\u003eGame programming\u003c/div\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIntent\u003c/h2\u003e\u003ca id=\"user-content-intent\" class=\"anchor\" aria-label=\"Permalink: Intent\" href=\"#intent\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA game loop runs continuously during gameplay. Each turn of the loop, it processes user input without blocking, updates the game state, and renders the game. It tracks the passage of time to control the rate of gameplay.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis pattern decouple the progression of game time from user input and processor speed.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eApplicability\u003c/h2\u003e\u003ca id=\"user-content-applicability\" class=\"anchor\" aria-label=\"Permalink: Applicability\" href=\"#applicability\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis pattern is used in every game engine.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExplanation\u003c/h2\u003e\u003ca id=\"user-content-explanation\" class=\"anchor\" aria-label=\"Permalink: Explanation\" href=\"#explanation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eGame loop is the main process of all the game rendering threads. It drives input process, internal status update, rendering, AI and all the other processes.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThere are a lot of implementations of game loop:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eFrame-based game loop\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFrame-based game loop is the easiest implementation. The loop always keeps spinning for the following three processes: processInput, update and render. The problem with it is you have no control over how fast the game runs. On a fast machine, that loop will spin so fast users won’t be able to see what’s going on. On a slow machine, the game will crawl. If you have a part of the game that’s content-heavy or does more AI or physics, the game will actually play slower there.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eVariable-step game loop\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe variable-step game loop chooses a time step to advance based on how much real time passed since the last frame. The longer the frame takes, the bigger steps the game takes. It always keeps up with real time because it will take bigger and bigger steps to get there.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eFixed-step game loop\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFor fixed-step game loop, a certain amount of real time has elapsed since the last turn of the game loop. This is how much game time need to be simulated for the game’s “now” to catch up with the player’s.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eClass diagram\u003c/h2\u003e\u003ca id=\"user-content-class-diagram\" class=\"anchor\" aria-label=\"Permalink: Class diagram\" href=\"#class-diagram\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/dbh/java-design-patterns/blob/master/game-loop/etc/game-loop.urm.png\"\u003e\u003cimg src=\"/dbh/java-design-patterns/raw/master/game-loop/etc/game-loop.urm.png\" alt=\"alt text\" title=\"Game Loop pattern class diagram\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCredits\u003c/h2\u003e\u003ca id=\"user-content-credits\" class=\"anchor\" aria-label=\"Permalink: Credits\" href=\"#credits\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"http://gameprogrammingpatterns.com/game-loop.html\" rel=\"nofollow\"\u003eGame Programming Patterns - Game Loop\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/article\u003e","errorMessage":null,"headerInfo":{"toc":[{"level":2,"text":"Intent","anchor":"intent","htmlText":"Intent"},{"level":2,"text":"Applicability","anchor":"applicability","htmlText":"Applicability"},{"level":2,"text":"Explanation","anchor":"explanation","htmlText":"Explanation"},{"level":2,"text":"Class diagram","anchor":"class-diagram","htmlText":"Class diagram"},{"level":2,"text":"Credits","anchor":"credits","htmlText":"Credits"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fdbh%2Fjava-design-patterns%2Ftree%2Fmaster%2Fgame-loop"}},"totalCount":4,"showBranchInfobar":true},"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"abstract-document","path":"abstract-document","contentType":"directory"},{"name":"abstract-factory","path":"abstract-factory","contentType":"directory"},{"name":"acyclic-visitor","path":"acyclic-visitor","contentType":"directory"},{"name":"adapter","path":"adapter","contentType":"directory"},{"name":"aggregator-microservices","path":"aggregator-microservices","contentType":"directory"},{"name":"ambassador","path":"ambassador","contentType":"directory"},{"name":"api-gateway","path":"api-gateway","contentType":"directory"},{"name":"async-method-invocation","path":"async-method-invocation","contentType":"directory"},{"name":"balking","path":"balking","contentType":"directory"},{"name":"bridge","path":"bridge","contentType":"directory"},{"name":"builder","path":"builder","contentType":"directory"},{"name":"business-delegate","path":"business-delegate","contentType":"directory"},{"name":"bytecode","path":"bytecode","contentType":"directory"},{"name":"caching","path":"caching","contentType":"directory"},{"name":"callback","path":"callback","contentType":"directory"},{"name":"chain","path":"chain","contentType":"directory"},{"name":"circuit-breaker","path":"circuit-breaker","contentType":"directory"},{"name":"collection-pipeline","path":"collection-pipeline","contentType":"directory"},{"name":"combinator","path":"combinator","contentType":"directory"},{"name":"command","path":"command","contentType":"directory"},{"name":"commander","path":"commander","contentType":"directory"},{"name":"composite","path":"composite","contentType":"directory"},{"name":"converter","path":"converter","contentType":"directory"},{"name":"cqrs","path":"cqrs","contentType":"directory"},{"name":"dao","path":"dao","contentType":"directory"},{"name":"data-bus","path":"data-bus","contentType":"directory"},{"name":"data-locality","path":"data-locality","contentType":"directory"},{"name":"data-mapper","path":"data-mapper","contentType":"directory"},{"name":"data-transfer-object","path":"data-transfer-object","contentType":"directory"},{"name":"decorator","path":"decorator","contentType":"directory"},{"name":"delegation","path":"delegation","contentType":"directory"},{"name":"dependency-injection","path":"dependency-injection","contentType":"directory"},{"name":"dirty-flag","path":"dirty-flag","contentType":"directory"},{"name":"double-buffer","path":"double-buffer","contentType":"directory"},{"name":"double-checked-locking","path":"double-checked-locking","contentType":"directory"},{"name":"double-dispatch","path":"double-dispatch","contentType":"directory"},{"name":"eip-aggregator","path":"eip-aggregator","contentType":"directory"},{"name":"eip-message-channel","path":"eip-message-channel","contentType":"directory"},{"name":"eip-publish-subscribe","path":"eip-publish-subscribe","contentType":"directory"},{"name":"eip-splitter","path":"eip-splitter","contentType":"directory"},{"name":"eip-wire-tap","path":"eip-wire-tap","contentType":"directory"},{"name":"etc","path":"etc","contentType":"directory"},{"name":"event-aggregator","path":"event-aggregator","contentType":"directory"},{"name":"event-asynchronous","path":"event-asynchronous","contentType":"directory"},{"name":"event-driven-architecture","path":"event-driven-architecture","contentType":"directory"},{"name":"event-queue","path":"event-queue","contentType":"directory"},{"name":"event-sourcing","path":"event-sourcing","contentType":"directory"},{"name":"execute-around","path":"execute-around","contentType":"directory"},{"name":"extension-objects","path":"extension-objects","contentType":"directory"},{"name":"facade","path":"facade","contentType":"directory"},{"name":"factory-kit","path":"factory-kit","contentType":"directory"},{"name":"factory-method","path":"factory-method","contentType":"directory"},{"name":"feature-toggle","path":"feature-toggle","contentType":"directory"},{"name":"fluentinterface","path":"fluentinterface","contentType":"directory"},{"name":"flux","path":"flux","contentType":"directory"},{"name":"flyweight","path":"flyweight","contentType":"directory"},{"name":"front-controller","path":"front-controller","contentType":"directory"},{"name":"game-loop","path":"game-loop","contentType":"directory"},{"name":"guarded-suspension","path":"guarded-suspension","contentType":"directory"},{"name":"half-sync-half-async","path":"half-sync-half-async","contentType":"directory"},{"name":"hexagonal","path":"hexagonal","contentType":"directory"},{"name":"intercepting-filter","path":"intercepting-filter","contentType":"directory"},{"name":"interpreter","path":"interpreter","contentType":"directory"},{"name":"iterator","path":"iterator","contentType":"directory"},{"name":"layers","path":"layers","contentType":"directory"},{"name":"lazy-loading","path":"lazy-loading","contentType":"directory"},{"name":"leader-election","path":"leader-election","contentType":"directory"},{"name":"marker","path":"marker","contentType":"directory"},{"name":"master-worker-pattern","path":"master-worker-pattern","contentType":"directory"},{"name":"mediator","path":"mediator","contentType":"directory"},{"name":"memento","path":"memento","contentType":"directory"},{"name":"model-view-controller","path":"model-view-controller","contentType":"directory"},{"name":"model-view-presenter","path":"model-view-presenter","contentType":"directory"},{"name":"module","path":"module","contentType":"directory"},{"name":"monad","path":"monad","contentType":"directory"},{"name":"monostate","path":"monostate","contentType":"directory"},{"name":"multiton","path":"multiton","contentType":"directory"},{"name":"mute-idiom","path":"mute-idiom","contentType":"directory"},{"name":"mutex","path":"mutex","contentType":"directory"},{"name":"naked-objects","path":"naked-objects","contentType":"directory"},{"name":"null-object","path":"null-object","contentType":"directory"},{"name":"object-mother","path":"object-mother","contentType":"directory"},{"name":"object-pool","path":"object-pool","contentType":"directory"},{"name":"observer","path":"observer","contentType":"directory"},{"name":"page-object","path":"page-object","contentType":"directory"},{"name":"partial-response","path":"partial-response","contentType":"directory"},{"name":"pipeline","path":"pipeline","contentType":"directory"},{"name":"poison-pill","path":"poison-pill","contentType":"directory"},{"name":"priority-queue","path":"priority-queue","contentType":"directory"},{"name":"private-class-data","path":"private-class-data","contentType":"directory"},{"name":"producer-consumer","path":"producer-consumer","contentType":"directory"},{"name":"promise","path":"promise","contentType":"directory"},{"name":"property","path":"property","contentType":"directory"},{"name":"prototype","path":"prototype","contentType":"directory"},{"name":"proxy","path":"proxy","contentType":"directory"},{"name":"queue-load-leveling","path":"queue-load-leveling","contentType":"directory"},{"name":"reactor","path":"reactor","contentType":"directory"},{"name":"reader-writer-lock","path":"reader-writer-lock","contentType":"directory"},{"name":"repository","path":"repository","contentType":"directory"},{"name":"resource-acquisition-is-initialization","path":"resource-acquisition-is-initialization","contentType":"directory"},{"name":"retry","path":"retry","contentType":"directory"},{"name":"role-object","path":"role-object","contentType":"directory"},{"name":"saga","path":"saga","contentType":"directory"},{"name":"semaphore","path":"semaphore","contentType":"directory"},{"name":"servant","path":"servant","contentType":"directory"},{"name":"serverless","path":"serverless","contentType":"directory"},{"name":"service-layer","path":"service-layer","contentType":"directory"},{"name":"service-locator","path":"service-locator","contentType":"directory"},{"name":"sharding","path":"sharding","contentType":"directory"},{"name":"singleton","path":"singleton","contentType":"directory"},{"name":"spatial-partition","path":"spatial-partition","contentType":"directory"},{"name":"specification","path":"specification","contentType":"directory"},{"name":"state","path":"state","contentType":"directory"},{"name":"step-builder","path":"step-builder","contentType":"directory"},{"name":"strategy","path":"strategy","contentType":"directory"},{"name":"subclass-sandbox","path":"subclass-sandbox","contentType":"directory"},{"name":"template-method","path":"template-method","contentType":"directory"},{"name":"thread-pool","path":"thread-pool","contentType":"directory"},{"name":"throttling","path":"throttling","contentType":"directory"},{"name":"tls","path":"tls","contentType":"directory"},{"name":"tolerant-reader","path":"tolerant-reader","contentType":"directory"},{"name":"trampoline","path":"trampoline","contentType":"directory"},{"name":"twin","path":"twin","contentType":"directory"},{"name":"typeobjectpattern","path":"typeobjectpattern","contentType":"directory"},{"name":"unit-of-work","path":"unit-of-work","contentType":"directory"},{"name":"update-method","path":"update-method","contentType":"directory"},{"name":"value-object","path":"value-object","contentType":"directory"},{"name":"visitor","path":"visitor","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".travis.yml","path":".travis.yml","contentType":"file"},{"name":"CONTRIBUTING.MD","path":"CONTRIBUTING.MD","contentType":"file"},{"name":"LICENSE.md","path":"LICENSE.md","contentType":"file"},{"name":"PULL_REQUEST_TEMPLATE.md","path":"PULL_REQUEST_TEMPLATE.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"checkstyle-suppressions.xml","path":"checkstyle-suppressions.xml","contentType":"file"},{"name":"license-plugin-header-style.xml","path":"license-plugin-header-style.xml","contentType":"file"},{"name":"pom.xml","path":"pom.xml","contentType":"file"},{"name":"update-website.sh","path":"update-website.sh","contentType":"file"}],"totalCount":139}},"fileTreeProcessingTime":13.717481,"foldersToFetch":[],"treeExpanded":true,"symbolsExpanded":false,"csrf_tokens":{"/dbh/java-design-patterns/branches":{"post":"uRnlgWM8DVRtCFg183e_nsRFurKme8janwi44vNY9RzV3vlv695bny5qVFQsZCk6ULpKywpeU_qZ_iG5xqn0Iw"},"/dbh/java-design-patterns/branches/fetch_and_merge/master":{"post":"goVUKNbcbEO7YjpX98EVnbGXiazj2tje2_abH6kOShkyLCpX2-OKF3GQip7g1OJCOGfs0GTKmpJh8WC_tE0wpw"},"/dbh/java-design-patterns/branches/fetch_and_merge/master?discard_changes=true":{"post":"9rgZqFx4YgB6GpQKWgpnyob1cI8BzFc2XFRvufsYLc5GEWfXUUeEVLDoJMNNH5AVDwUV84bcFXrmU5QZ5ltXcA"}}},"title":"java-design-patterns/game-loop at master · dbh/java-design-patterns","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-263cab1760dd.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-b84e9496fc59.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true}}}
0