{"action":"created","comment":{"url":"https://api.github.com/repos/aframevr/aframe/pulls/comments/58967622","id":58967622,"diff_hunk":"@@ -0,0 +1,133 @@\n+var geometries = require('../core/geometry').geometries;\r\n+var registerSystem = require('../core/system').registerSystem;\r\n+var THREE = require('../lib/three');\r\n+\r\n+/**\r\n+ * System for geometry component.\r\n+ * Handle geometry caching.\r\n+ *\r\n+ * @member {object} cache - Mapping of stringified component data to THREE.Geometry objects.\r\n+ * @member {object} cacheCount - Keep track of number of entities using a geometry to\r\n+ *         know whether to dispose on removal.\r\n+ */\r\n+module.exports.System = registerSystem('geometry', {\r\n+  init: function () {\r\n+    this.cache = {};\r","path":"src/systems/geometry.js","position":15,"original_position":15,"commit_id":"63f79d9ee461ed7273e922b827c114a29d071114","original_commit_id":"63f79d9ee461ed7273e922b827c114a29d071114","user":{"login":"ngokevin","id":674727,"avatar_url":"https://avatars.githubusercontent.com/u/674727?v=3","gravatar_id":"","url":"https://api.github.com/users/ngokevin","html_url":"https://github.com/ngokevin","followers_url":"https://api.github.com/users/ngokevin/followers","following_url":"https://api.github.com/users/ngokevin/following{/other_user}","gists_url":"https://api.github.com/users/ngokevin/gists{/gist_id}","starred_url":"https://api.github.com/users/ngokevin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ngokevin/subscriptions","organizations_url":"https://api.github.com/users/ngokevin/orgs","repos_url":"https://api.github.com/users/ngokevin/repos","events_url":"https://api.github.com/users/ngokevin/events{/privacy}","received_events_url":"https://api.github.com/users/ngokevin/received_events","type":"User","site_admin":false},"body":"Hm, actually, it complicates the code a little bit. Because now you have to check whether a key exists and always be creating an inner object if it doesn't. Adds bits of code everywhere. Also it's a bit more clear what the data structure looks like if separate. Is it okay to keep them separate? ","created_at":"2016-04-08T00:46:45Z","updated_at":"2016-04-08T00:46:45Z","html_url":"https://github.com/aframevr/aframe/pull/1347#discussion_r58967622","pull_request_url":"https://api.github.com/repos/aframevr/aframe/pulls/1347","_links":{"self":{"href":"https://api.github.com/repos/aframevr/aframe/pulls/comments/58967622"},"html":{"href":"https://github.com/aframevr/aframe/pull/1347#discussion_r58967622"},"pull_request":{"href":"https://api.github.com/repos/aframevr/aframe/pulls/1347"}}},"pull_request":{"url":"https://api.github.com/repos/aframevr/aframe/pulls/1347","id":65544042,"html_url":"https://github.com/aframevr/aframe/pull/1347","diff_url":"https://github.com/aframevr/aframe/pull/1347.diff","patch_url":"https://github.com/aframevr/aframe/pull/1347.patch","issue_url":"https://api.github.com/repos/aframevr/aframe/issues/1347","number":1347,"state":"open","locked":false,"title":"geometry caching system (fixes #1306)","user":{"login":"ngokevin","id":674727,"avatar_url":"https://avatars.githubusercontent.com/u/674727?v=3","gravatar_id":"","url":"https://api.github.com/users/ngokevin","html_url":"https://github.com/ngokevin","followers_url":"https://api.github.com/users/ngokevin/followers","following_url":"https://api.github.com/users/ngokevin/following{/other_user}","gists_url":"https://api.github.com/users/ngokevin/gists{/gist_id}","starred_url":"https://api.github.com/users/ngokevin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ngokevin/subscriptions","organizations_url":"https://api.github.com/users/ngokevin/orgs","repos_url":"https://api.github.com/users/ngokevin/repos","events_url":"https://api.github.com/users/ngokevin/events{/privacy}","received_events_url":"https://api.github.com/users/ngokevin/received_events","type":"User","site_admin":false},"body":"**Description:** \r\n\r\n- Uses **JSON.stringify** on component data to determine which geometry components should share geometries.\r\n\r\n**Changes proposed:**\r\n- Add **geometry system** that handles geometry creation, caching, and disposal\r\n- Remove geometry.translate which is going to be removed in https://github.com/aframevr/aframe/pull/1339\r\n- [x] docs\r\n- [x] update tests\r\n\r\n**Perf:** \r\n\r\n- In the number of entities stress test, reduced 4000 geometries to just 1.\r\n- Reduced memory usage from 85MB to just 60MB. Previously without buffer geometries, it was at 150MB!\r\n- Cut scene load time to 1/3 (e.g., reduced by 66%). From 6-7 seconds to 2-3 seconds.\r\n\r\n<img width=\"1302\" alt=\"screen shot 2016-04-06 at 3 23 29 pm\" src=\"https://cloud.githubusercontent.com/assets/674727/14334838/ecb75b3e-fc0b-11e5-8f85-ae6e1c7fbb0d.png\">\r\n","created_at":"2016-04-06T22:04:08Z","updated_at":"2016-04-08T00:46:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0171d9c64643c947913820c89a3262cadd823e01","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/aframevr/aframe/pulls/1347/commits","review_comments_url":"https://api.github.com/repos/aframevr/aframe/pulls/1347/comments","review_comment_url":"https://api.github.com/repos/aframevr/aframe/pulls/comments{/number}","comments_url":"https://api.github.com/repos/aframevr/aframe/issues/1347/comments","statuses_url":"https://api.github.com/repos/aframevr/aframe/statuses/63f79d9ee461ed7273e922b827c114a29d071114","head":{"label":"ngokevin:geometrycache","ref":"geometrycache","sha":"63f79d9ee461ed7273e922b827c114a29d071114","user":{"login":"ngokevin","id":674727,"avatar_url":"https://avatars.githubusercontent.com/u/674727?v=3","gravatar_id":"","url":"https://api.github.com/users/ngokevin","html_url":"https://github.com/ngokevin","followers_url":"https://api.github.com/users/ngokevin/followers","following_url":"https://api.github.com/users/ngokevin/following{/other_user}","gists_url":"https://api.github.com/users/ngokevin/gists{/gist_id}","starred_url":"https://api.github.com/users/ngokevin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ngokevin/subscriptions","organizations_url":"https://api.github.com/users/ngokevin/orgs","repos_url":"https://api.github.com/users/ngokevin/repos","events_url":"https://api.github.com/users/ngokevin/events{/privacy}","received_events_url":"https://api.github.com/users/ngokevin/received_events","type":"User","site_admin":false},"repo":{"id":48299418,"name":"aframe","full_name":"ngokevin/aframe","owner":{"login":"ngokevin","id":674727,"avatar_url":"https://avatars.githubusercontent.com/u/674727?v=3","gravatar_id":"","url":"https://api.github.com/users/ngokevin","html_url":"https://github.com/ngokevin","followers_url":"https://api.github.com/users/ngokevin/followers","following_url":"https://api.github.com/users/ngokevin/following{/other_user}","gists_url":"https://api.github.com/users/ngokevin/gists{/gist_id}","starred_url":"https://api.github.com/users/ngokevin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ngokevin/subscriptions","organizations_url":"https://api.github.com/users/ngokevin/orgs","repos_url":"https://api.github.com/users/ngokevin/repos","events_url":"https://api.github.com/users/ngokevin/events{/privacy}","received_events_url":"https://api.github.com/users/ngokevin/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ngokevin/aframe","description":"Building Blocks for the VR Web","fork":true,"url":"https://api.github.com/repos/ngokevin/aframe","forks_url":"https://api.github.com/repos/ngokevin/aframe/forks","keys_url":"https://api.github.com/repos/ngokevin/aframe/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ngokevin/aframe/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ngokevin/aframe/teams","hooks_url":"https://api.github.com/repos/ngokevin/aframe/hooks","issue_events_url":"https://api.github.com/repos/ngokevin/aframe/issues/events{/number}","events_url":"https://api.github.com/repos/ngokevin/aframe/events","assignees_url":"https://api.github.com/repos/ngokevin/aframe/assignees{/user}","branches_url":"https://api.github.com/repos/ngokevin/aframe/branches{/branch}","tags_url":"https://api.github.com/repos/ngokevin/aframe/tags","blobs_url":"https://api.github.com/repos/ngokevin/aframe/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ngokevin/aframe/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ngokevin/aframe/git/refs{/sha}","trees_url":"https://api.github.com/repos/ngokevin/aframe/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ngokevin/aframe/statuses/{sha}","languages_url":"https://api.github.com/repos/ngokevin/aframe/languages","stargazers_url":"https://api.github.com/repos/ngokevin/aframe/stargazers","contributors_url":"https://api.github.com/repos/ngokevin/aframe/contributors","subscribers_url":"https://api.github.com/repos/ngokevin/aframe/subscribers","subscription_url":"https://api.github.com/repos/ngokevin/aframe/subscription","commits_url":"https://api.github.com/repos/ngokevin/aframe/commits{/sha}","git_commits_url":"https://api.github.com/repos/ngokevin/aframe/git/commits{/sha}","comments_url":"https://api.github.com/repos/ngokevin/aframe/comments{/number}","issue_comment_url":"https://api.github.com/repos/ngokevin/aframe/issues/comments{/number}","contents_url":"https://api.github.com/repos/ngokevin/aframe/contents/{+path}","compare_url":"https://api.github.com/repos/ngokevin/aframe/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ngokevin/aframe/merges","archive_url":"https://api.github.com/repos/ngokevin/aframe/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ngokevin/aframe/downloads","issues_url":"https://api.github.com/repos/ngokevin/aframe/issues{/number}","pulls_url":"https://api.github.com/repos/ngokevin/aframe/pulls{/number}","milestones_url":"https://api.github.com/repos/ngokevin/aframe/milestones{/number}","notifications_url":"https://api.github.com/repos/ngokevin/aframe/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ngokevin/aframe/labels{/name}","releases_url":"https://api.github.com/repos/ngokevin/aframe/releases{/id}","deployments_url":"https://api.github.com/repos/ngokevin/aframe/deployments","created_at":"2015-12-19T22:31:05Z","updated_at":"2016-03-29T22:44:31Z","pushed_at":"2016-04-07T23:26:21Z","git_url":"git://github.com/ngokevin/aframe.git","ssh_url":"git@github.com:ngokevin/aframe.git","clone_url":"https://github.com/ngokevin/aframe.git","svn_url":"https://github.com/ngokevin/aframe","homepage":"https://aframe.io/","size":97460,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"aframevr:master","ref":"master","sha":"9a1e0bb6a0712ba8f8ccf7224d643b5b0eb995f0","user":{"login":"aframevr","id":16024092,"avatar_url":"https://avatars.githubusercontent.com/u/16024092?v=3","gravatar_id":"","url":"https://api.github.com/users/aframevr","html_url":"https://github.com/aframevr","followers_url":"https://api.github.com/users/aframevr/followers","following_url":"https://api.github.com/users/aframevr/following{/other_user}","gists_url":"https://api.github.com/users/aframevr/gists{/gist_id}","starred_url":"https://api.github.com/users/aframevr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aframevr/subscriptions","organizations_url":"https://api.github.com/users/aframevr/orgs","repos_url":"https://api.github.com/users/aframevr/repos","events_url":"https://api.github.com/users/aframevr/events{/privacy}","received_events_url":"https://api.github.com/users/aframevr/received_events","type":"Organization","site_admin":false},"repo":{"id":42488903,"name":"aframe","full_name":"aframevr/aframe","owner":{"login":"aframevr","id":16024092,"avatar_url":"https://avatars.githubusercontent.com/u/16024092?v=3","gravatar_id":"","url":"https://api.github.com/users/aframevr","html_url":"https://github.com/aframevr","followers_url":"https://api.github.com/users/aframevr/followers","following_url":"https://api.github.com/users/aframevr/following{/other_user}","gists_url":"https://api.github.com/users/aframevr/gists{/gist_id}","starred_url":"https://api.github.com/users/aframevr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aframevr/subscriptions","organizations_url":"https://api.github.com/users/aframevr/orgs","repos_url":"https://api.github.com/users/aframevr/repos","events_url":"https://api.github.com/users/aframevr/events{/privacy}","received_events_url":"https://api.github.com/users/aframevr/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aframevr/aframe","description":"Building Blocks for the VR Web","fork":false,"url":"https://api.github.com/repos/aframevr/aframe","forks_url":"https://api.github.com/repos/aframevr/aframe/forks","keys_url":"https://api.github.com/repos/aframevr/aframe/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aframevr/aframe/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aframevr/aframe/teams","hooks_url":"https://api.github.com/repos/aframevr/aframe/hooks","issue_events_url":"https://api.github.com/repos/aframevr/aframe/issues/events{/number}","events_url":"https://api.github.com/repos/aframevr/aframe/events","assignees_url":"https://api.github.com/repos/aframevr/aframe/assignees{/user}","branches_url":"https://api.github.com/repos/aframevr/aframe/branches{/branch}","tags_url":"https://api.github.com/repos/aframevr/aframe/tags","blobs_url":"https://api.github.com/repos/aframevr/aframe/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aframevr/aframe/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aframevr/aframe/git/refs{/sha}","trees_url":"https://api.github.com/repos/aframevr/aframe/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aframevr/aframe/statuses/{sha}","languages_url":"https://api.github.com/repos/aframevr/aframe/languages","stargazers_url":"https://api.github.com/repos/aframevr/aframe/stargazers","contributors_url":"https://api.github.com/repos/aframevr/aframe/contributors","subscribers_url":"https://api.github.com/repos/aframevr/aframe/subscribers","subscription_url":"https://api.github.com/repos/aframevr/aframe/subscription","commits_url":"https://api.github.com/repos/aframevr/aframe/commits{/sha}","git_commits_url":"https://api.github.com/repos/aframevr/aframe/git/commits{/sha}","comments_url":"https://api.github.com/repos/aframevr/aframe/comments{/number}","issue_comment_url":"https://api.github.com/repos/aframevr/aframe/issues/comments{/number}","contents_url":"https://api.github.com/repos/aframevr/aframe/contents/{+path}","compare_url":"https://api.github.com/repos/aframevr/aframe/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aframevr/aframe/merges","archive_url":"https://api.github.com/repos/aframevr/aframe/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aframevr/aframe/downloads","issues_url":"https://api.github.com/repos/aframevr/aframe/issues{/number}","pulls_url":"https://api.github.com/repos/aframevr/aframe/pulls{/number}","milestones_url":"https://api.github.com/repos/aframevr/aframe/milestones{/number}","notifications_url":"https://api.github.com/repos/aframevr/aframe/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aframevr/aframe/labels{/name}","releases_url":"https://api.github.com/repos/aframevr/aframe/releases{/id}","deployments_url":"https://api.github.com/repos/aframevr/aframe/deployments","created_at":"2015-09-15T02:04:40Z","updated_at":"2016-04-08T00:27:52Z","pushed_at":"2016-04-07T23:26:22Z","git_url":"git://github.com/aframevr/aframe.git","ssh_url":"git@github.com:aframevr/aframe.git","clone_url":"https://github.com/aframevr/aframe.git","svn_url":"https://github.com/aframevr/aframe","homepage":"https://aframe.io/","size":104847,"stargazers_count":1652,"watchers_count":1652,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":230,"mirror_url":null,"open_issues_count":224,"forks":230,"open_issues":224,"watchers":1652,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/aframevr/aframe/pulls/1347"},"html":{"href":"https://github.com/aframevr/aframe/pull/1347"},"issue":{"href":"https://api.github.com/repos/aframevr/aframe/issues/1347"},"comments":{"href":"https://api.github.com/repos/aframevr/aframe/issues/1347/comments"},"review_comments":{"href":"https://api.github.com/repos/aframevr/aframe/pulls/1347/comments"},"review_comment":{"href":"https://api.github.com/repos/aframevr/aframe/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/aframevr/aframe/pulls/1347/commits"},"statuses":{"href":"https://api.github.com/repos/aframevr/aframe/statuses/63f79d9ee461ed7273e922b827c114a29d071114"}}}}