[{"data":1,"prerenderedAt":500},["ShallowReactive",2],{"project-25934270":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":5,"maker":10,"posted_at":11,"year":12,"points":13,"comments":14,"rank_in_year":15,"shown_in_year":16,"top":17,"tier":18,"category":19,"subcategory":20,"format":21,"keywords":22,"reception":26,"sentiment":27,"stance_mix":28,"scored_comments":32,"aspects":33,"strip":44,"post_text":46,"what":47,"said":81,"maker_in_thread":225,"shape":236,"grid":240,"attempts":461,"same_week":462,"maker_shows":30,"maker_hidden":492,"reader_version":493,"card":494},"25934270","vnav.io","My multiplayer custom-engine game that loads in less than a second","title","Show HN: My multiplayer custom-engine game that loads in less than a second","http:\u002F\u002Fvnav.io","crazypython",1611783227,2021,198,85,237,2533,10,"notable","games","multiplayer browser game","web_app",[20,23,24,25],"io game","custom game engine","canvas game","mixed",-0.084,{"positive":17,"neutral":29,"mixed":30,"critical":31},22,3,13,48,{"performance":34,"design":36,"execution":39,"idea":42,"privacy":43},{"positive":30,"critical":35},4,{"positive":37,"critical":38},1,6,{"positive":40,"critical":41},0,2,{"positive":41,"critical":40},{"positive":40,"critical":37},[45,40,30,45,30,30,45,30,45,40,40,40,40,30,30,30,37,37,37,30,40,37,37,37,40,37,30,30,30,45,30,30,45,30,37,45,45,37,37,41],5,null,{"problem":46,"audience":46,"pricing":46,"motivation":46,"time_to_build":46,"stack":48,"openness":79,"stage":80,"team_size":79},[49,59,65,69,75],{"value":50,"source":51,"evidence":52},"JavaScript","maker",[53,56],{"id":54,"by":10,"text":55},"25934542","Hi. To make my game load quickly, it uses \u003Clink rel=preload> on JavaScript resources, smallest scripts first. While the game itself is loading, the server selector's inline…",{"id":57,"by":10,"text":58},"25934760","None. It's built completely from scratch, with no third-party dependencies. FullStory, Google Analytics, and Sentry for monitoring and analytics.",{"value":60,"source":51,"evidence":61},"WebSockets",[62],{"id":63,"by":10,"text":64},"25935120","WebSockets. I found that WebRTC was complicated, full of bloat, and less reliable. Most home TCP connections don't have enough packet dropping to warrant something like SCTP, the…",{"value":66,"source":51,"evidence":67},"Canvas2D custom engine",[68],{"id":57,"by":10,"text":58},{"value":70,"source":51,"evidence":71},"fasttalk2-re serialization library",[72],{"id":73,"by":10,"text":74},"25936914","It's currently using fasttalk2-re, a library capable of transmitting arbitrary dynamically typed values we developed in-house. While it uses the same protocol as…",{"value":76,"source":51,"evidence":77},"surge.sh CDN",[78],{"id":54,"by":10,"text":55},"unknown","launched",{"praise":82,"objections":114,"requests":157,"questions":188,"alternatives":203},[83,99],{"value":84,"source":85,"evidence":86},"Fast load time and snappy performance","commenter",[87,91,95],{"id":88,"by":89,"text":90},"25935875","smolder","Love to see this kind of craftsmanship. It's nice to make things snappy, especially because it broadens the reach to people who don't have the best hardware or connections.",{"id":92,"by":93,"text":94},"25937551","schemescape","Nice work taking the time to make your game load quickly! I'm sure I'm not the only person who closes most browser games' tabs when they take longer than a couple seconds to…",{"id":96,"by":97,"text":98},"25934949","phreack","Whoa I opened this on mobile (Opera) and it was a mess of overlapping text. I suggest you add a screen saying it's desktop only.",{"value":100,"source":85,"evidence":101},"Fun gameplay",[102,106,110],{"id":103,"by":104,"text":105},"25941176","dgellow","Fantastic work, and very fun game! Thanks for sharing :)",{"id":107,"by":108,"text":109},"25938508","felipemnoa","Awesome Game! It is actually a lot of fun!",{"id":111,"by":112,"text":113},"25935381","imperio59","Cool game, very fun to play, well done!",[115,131,146],{"value":116,"source":85,"evidence":117},"Does not work well on mobile browsers",[118,119,123,127],{"id":96,"by":97,"text":98},{"id":120,"by":121,"text":122},"25935512","edoceo","Chrome and FF mobile as well.",{"id":124,"by":125,"text":126},"25935568","visox","Yeah looks wrong on my mobile Chrome.",{"id":128,"by":129,"text":130},"25935413","jonplackett","This might win the award for least mobile friendly website ever!",{"value":132,"source":85,"evidence":133},"Lag and choppy movement on distant servers and in Firefox",[134,138,142],{"id":135,"by":136,"text":137},"25939232","ggambetta","Very nicely done, congrats! I connected to a geographically far away server (US West, from Europe) and there's a bit of a delay between keypresses and movement, and the movement…",{"id":139,"by":140,"text":141},"25935117","dom96","Nice! Interesting approach. I'll have to try to replicate this for my game[1] where the loading of some JS scripts is sometimes annoyingly high (in particular for the cookie…",{"id":143,"by":144,"text":145},"25938280","abhayhegde","I am using Firefox 84.02 and it is not working. Takes considerably more than a minute to show fill username screen.",{"value":147,"source":85,"evidence":148},"Lacks visual background and texture",[149,153],{"id":150,"by":151,"text":152},"25935596","sfgweilr4f","Put a star field or some other background so movement is more obvious. Some instructions might help or even a highlight on the points allocations at the bottom left. or did I…",{"id":154,"by":155,"text":156},"25938688","swayvil","space needs some kind of texture so I can see my movement better",[158,169,177],{"value":159,"source":85,"evidence":160},"Keyboard aiming and rebindable keys",[161,165],{"id":162,"by":163,"text":164},"25937068","lovelyviking","Very nice game, but would you add aiming with keys? I have no mouse for instance ... very difficult to win shooting in one direction only :)",{"id":166,"by":167,"text":168},"25934936","neodymiumphish","Just a suggestion: I'd love a way to change the keybinds; using Dvorak means this is wholy unplayable for me (also a mech keyboard that doesn't have up-down-left-right in a…",{"value":170,"source":85,"evidence":171},"Client-side prediction and interpolation",[172,173],{"id":135,"by":136,"text":137},{"id":174,"by":175,"text":176},"25935720","nosefrog","Cool, this is great! I was working on a multiplayer game and I found it difficult to make client movement smooth. Are you using client-side prediction for the player's movements?",{"value":178,"source":85,"evidence":179},"Better game balancing",[180,184],{"id":181,"by":182,"text":183},"25939812","Trung0246","Welp that was fun :) https:\u002F\u002Fi.imgur.com\u002F47f7IhU.png Honestly the game really needs more balancing as I took a while to find a build which can defeat Necromancer.",{"id":185,"by":186,"text":187},"25939575","gamegoblin","Yes, just played and Necromancer with auto-fire on, maxed out bullet damage, bullet speed, and reload speed. Got boring winning easily after half an hour. Fun game though! Just…",[189,196],{"value":190,"source":85,"evidence":191},"Why preload tags are used with immediate script loading",[192],{"id":193,"by":194,"text":195},"25940824","chrismorgan","This is a pattern that I have seen quite regularly in recent times, mostly via Next.js, I think: ``` \u003Clink rel=preload href=FOO.js as=script> \u003Cscript async src=FOO.js>\u003C\u002Fscript>…",{"value":197,"source":85,"evidence":198},"Whether the game will be open sourced",[199],{"id":200,"by":201,"text":202},"25935834","VectorLock","I dug down into your comment history where you said you were using a custom Canvas2D engine. Hopefully you'll open source it like you said, this is right up my alley.",[204,214,218],{"value":205,"source":85,"evidence":206},"diep.io",[207,210],{"id":208,"by":201,"text":209},"25934649","I like the diep.io a-like game. What other JavaScript resources did you use to build this?",{"id":211,"by":212,"text":213},"25935108","surround","See also https:\u002F\u002Fdiep.io - original, abandoned https:\u002F\u002Farras.io - fan made sequel http:\u002F\u002Fwoomy-arras.io - sequel of sequel (None of these load as fast)",{"value":215,"source":85,"evidence":216},"arras.io",[217],{"id":211,"by":212,"text":213},{"value":219,"source":85,"evidence":220},"agar.io",[221],{"id":222,"by":223,"text":224},"25935420","jlbribeiro",".io are indeed \"expensive\", but to add one datapoint to your question: there's a concept\u002Fgenre called \"io games\", mostly involving browser-based multiplayer games like this one…",{"comments":226,"answered":227,"key":228},18,9,[229,230,233],{"id":54,"text":55},{"id":231,"text":232},"25937190","> (in particular for the cookie consent for some reason) I suggest making that script async, so it loads after defer scripts, which you should add to your main game scripts. >…",{"id":234,"text":235},"25936402","Author here. I'm 17 years old and applying for college. If you work at or are an alum of a decently good college (or a great college like Yale and Stanford), I'd appreciate if…",{"commenters":237,"max_depth":45,"maker_replies":226,"first_comment_mins":238,"lifespan_hours":239},62,21,151,[241,243,247,251,255,259,261,262,263,266,268,272,273,277,280,284,287,290,293,295,298,301,304,305,308,311,314,317,320,321,324,327,330,332,333,337,340,343,344,347,348,351,353,355,358,360,362,363,364,365,369,370,373,376,379,383,385,386,388,392,394,399,401,403,404,408,409,413,414,415,417,419,422,424,427,430,431,433,438,440,443,446,448,452,457],[54,40,40,242,10,37],"project\u002Fneutral\u002Fperformance",[244,40,45,245,246,40],"25934642","project\u002Fpositive\u002Fperformance","michaelpb",[248,40,40,249,250,40],"25939888","commenter\u002Fneutral\u002Fnone","onion2k",[252,40,40,253,254,40],"25940040","other\u002Fneutral\u002Fperformance","iforgotpassword",[256,40,40,257,258,40],"25940582","other\u002Fneutral\u002Fnone","skinkestek",[139,40,30,260,140,40],"project\u002Fmixed\u002Fperformance",[231,40,40,242,10,37],[88,40,45,245,89,40],[264,40,40,257,265,40],"25935963","tobr",[162,40,30,267,163,40],"project\u002Fneutral\u002Fdesign",[269,40,30,270,271,40],"25937604","project\u002Fneutral\u002Fexecution","soared",[234,37,40,257,10,37],[274,37,45,275,276,40],"25936681","maker\u002Fpositive\u002Fidea","chairmanwow1",[278,37,40,279,10,37],"25936750","maker\u002Fneutral\u002Fnone",[281,37,30,282,283,40],"25938287","project\u002Fneutral\u002Fidea","airstrike",[285,37,40,286,10,37],"25946670","maker\u002Fneutral\u002Fidea",[288,37,30,242,289,40],"25940874","XCSme",[291,37,40,292,10,37],"25943099","project\u002Fneutral\u002Fnone",[103,37,45,294,104,40],"project\u002Fpositive\u002Fnone",[296,41,40,257,297,40],"25935127","listic",[299,41,40,257,300,40],"25935154","redmattred",[302,41,40,257,303,40],"25935318","reidjs",[222,41,40,257,223,40],[306,41,40,257,307,40],"25935723","Aeolun",[309,41,40,257,310,40],"26010512","rovr138",[312,41,40,257,313,40],"25937191","healeycodes",[315,41,40,257,316,40],"25939164","hayksaakian",[318,41,40,257,319,40],"25938428","torbital",[135,30,30,242,136,40],[322,30,30,242,323,40],"25939494","tjchear",[325,30,30,242,326,40],"25939513","seangrogg",[328,30,40,329,136,40],"25940532","commenter\u002Fneutral\u002Fperformance",[331,30,40,257,289,40],"25940884",[211,35,30,242,212,40],[334,45,37,335,336,40],"25935078","project\u002Fcritical\u002Fperformance","defanor",[338,45,30,242,339,40],"25935471","neogodless",[341,45,40,342,10,37],"25936770","maker\u002Fneutral\u002Fperformance",[143,45,37,335,144,40],[345,45,30,242,346,40],"25939704","shakna",[193,38,37,335,194,40],[349,38,30,242,350,40],"25941130","__alias",[352,38,40,329,194,40],"25942441",[354,38,40,342,10,37],"25943230",[356,357,40,242,10,37],"25935159",7,[150,359,30,267,151,40],8,[96,227,37,361,97,40],"project\u002Fcritical\u002Fdesign",[120,227,37,361,121,40],[124,227,37,361,125,40],[128,17,37,361,129,40],[366,367,30,242,368,40],"25934634",11,"psawaya",[63,367,40,342,10,37],[371,367,40,257,372,40],"25938300","gibs0ns",[374,367,40,257,375,40],"25938520","hathawsh",[377,367,40,257,378,40],"25938560","spijdar",[380,381,37,335,382,40],"25937027",12,"tcbasche",[384,381,40,342,10,37],"25937135",[166,31,30,267,167,40],[387,31,40,267,10,37],"25936698",[389,390,30,267,391,40],"25936143",14,"ALittleLight",[393,390,40,279,10,37],"25936677",[395,396,30,397,398,40],"25936277",15,"maker\u002Fneutral\u002Fprivacy","iruoy",[181,400,30,260,182,40],16,[92,402,45,245,93,40],17,[174,226,30,270,175,40],[405,406,30,270,407,40],"25935665",19,"munro",[73,406,40,270,10,37],[410,411,30,267,412,40],"25949321",20,"jtms",[208,238,30,270,201,40],[57,238,40,270,10,37],[200,238,45,416,201,40],"project\u002Fpositive\u002Fidea",[418,238,40,286,10,37],"25936713",[420,238,30,286,421,40],"25936888","daotoad",[423,238,30,286,201,40],"25962149",[425,238,37,426,289,40],"25940897","project\u002Fcritical\u002Fprivacy",[428,238,40,429,10,37],"25943652","maker\u002Fneutral\u002Fpricing",[107,29,45,294,108,40],[111,432,45,294,112,40],23,[434,435,45,436,437,40],"25936990",24,"project\u002Fpositive\u002Fdesign","timothyduong",[185,435,30,439,186,40],"project\u002Fmixed\u002Fdesign",[441,435,37,361,442,40],"25942161","SamBam",[444,435,40,445,10,37],"25943737","maker\u002Fneutral\u002Fdocs",[154,447,37,361,155,40],25,[449,450,45,294,451,40],"25940271",26,"joshxyz",[453,454,37,455,456,40],"25935393",27,"project\u002Fcritical\u002Fexecution","swyx",[458,459,37,455,460,40],"25940341",28,"mnw21cam",[],[463,468,472,477,482,487],{"id":464,"name":465,"points":466,"category":467},"25872922","Iconduck",528,"creative",{"id":469,"name":470,"points":471,"category":467},"25885760","Filmulator",282,{"id":473,"name":474,"points":475,"category":476},"25902165","I made an alarm clock",271,"hardware",{"id":478,"name":479,"points":480,"category":481},"25879238","Rysolv",250,"web_saas",{"id":483,"name":484,"points":485,"category":486},"25870482","Timeflake",205,"dev_tools",{"id":488,"name":489,"points":490,"category":491},"25889420","Gutensearch",202,"learning_science",false,"v2",{"id":495,"name":5,"line":6,"ai":492,"cat":19,"year":12,"points":13,"comments":14,"rec":26,"s":496,"top":17,"kw":497,"maker":10,"domain":5,"tier":18,"attempts":40,"strip":498,"url":9,"mix":499,"praise":84,"objection":116,"sub":20},25934270,-0.08,[20,23,24,25],"5035335350000333111301110133353353155112",[17,29,30,31],1794036602124]