https://loglog.games/blog/leaving-rust-gamedev/
say sorry to Jon Blow RIGHT NOW. he was right about all of this in 2018, 6 years ago.
https://loglog.games/blog/leaving-rust-gamedev/
say sorry to Jon Blow RIGHT NOW. he was right about all of this in 2018, 6 years ago.
he's right.
> relentless positivity and praise
that's part of the marketing. meanwhile as they jerk off each other they organize raids to flood reddit, IQfy, forums and other places with lies, harassment, attacks and bullying because you aren't sucking on corporate wieners. as anons and many others highlight the obvious dangers of having a bunch of corporations having full control of a language (and every other lie associated with it - such as "safety") they lose their fricking minds.
Then that is why Biden want us to use it?
The funny thing is rust troons still don’t understand the point he’s making in the video. Its so reasonable he probably thought it was safe from a flamewar, but he just didn’t know how rabid rust troons are
So
Rewrite it in Rust: probably an OK idea
Write your first, very exploratory version in Rust: probably not a good idea
rewriting a video game after it is done is a ridiculous idea lol you'll go bankrupt or take double the time shipping in the best case
rewrites in general are a bad idea.
if you have shipped software to users then you are a serious dev. Blow has shipped games to millions of players.
the core problem is gross misuse of the language. mozilla made rust as a fast but memory safe language for security purposes (web browsers). people are making the imo ridiculous decision of using it for game dev.
>people are making the imo ridiculous decision of using it for game dev.
yeah. people have been trying to use it for anything that has nothing to do with security. some of the extremely moronic programmers somehow think rust code can't be hacked or exploited, as if it has some magical layer of protection nobody else can see except rust trannies with severe schizophrenia. meanwhile on CVE databases, it still suffers from the same problems as C/C++
By your definition Notch is the most serious dev because he shipped to the most people / manhours played on his game
unironically yes notch is a serious dev because he made and sold something that works and that people liked
i doubt people can give me reasons as to why that is not the case other than vague
>but java
>but performance
>but code quality (what i believe to be aesthetically pleasing)
>he made and sold something that works and that people liked
That applies to Blow's games too
>blowie games
>anywhere near minecraft level
b***h aint even out of indie status yet lmao. Fricking stardew valley is more relevant than anything blowie ever did. blow is a grifter
>made
Stole infiniminer
Notch actually is an extremely competent dev.
Results are the most important thing, not just in development, but in everything in life. Never let anyone convince you otherwise.
>Results are the most important thing
survivorship bias
I mean he's right though. At the end of the day if you don't produce any results you are deemed worthless by society and the people around you. No one cares how much you try they only care if you succeed.
Would you rather take programming advice from Carmack or Notch? That kind of mentality means you'd take Notch because he made the most money. The guy who made WORDLE was a first year student and sold it for a million dollars. That's a project tons of people could have implemented if they had the idea. Is he a god programmer for having the idea?
The point is that it's silly to use money as a proxy for programming credibility. "Getting results" has more to do with business, economics, and timing than programming ability.
Carmack is rich and is still getting tons of money funneled to him to work on stuff while Notch just got a lump sum. Not a good example.
Carmack: 1 million made per game
Notch: 1 billion made per game
i.e. Notch is a greater programmer
>Donald Knuth
frick all, idk
clearly he can't program for shit
Donald Knuth is a serious academic, maybe even programmer depending on how you define things. He is not a serious developer.
Correction: Hasn't been for a long time. TeX is useful I guess.
Carmack also made his millions in the 80s. You’ve gotta adjust for inflation if you’re going to go full moron with this example.
Even with inflation that's not 1 billion and obviously he made them in the 90s-00s no the 80s. Notch is the best programmer after Gates, Zuck and Brin. He even beats Jeff Dean.
If i needed to do something as extreme as to squeeze out ever bit of performance out of P4 for software rendering for Q1 its carmack, if its just getting shit out of the door and getting youtubers playing it (java was enough to mesh the voxels and get it running on the browser) its my bald swedish gay that is telling me what to do, all in all its a shit analogy because everything depends on the context and you picking the right tool for the job depends on your competence level. Carmack said on so him self on lex slopcast
Anon you only care about the experiences of people who have succeeded, that's why you referenced Notch and Carmack. You never mentioned a good programmer for a game that never sold well, or was never even published, you picked two people who have results.
That was my point.
>Would you rather take programming advice from Carmack or Notch?
I would take advice from either of them depending on the situation. I have communicated with Carmack over email before, and for things such as
has said, he is the man to talk to.
If I wanted to talk about game design itself, I would talk to Notch.
You are being obtuse and creating an arguably moronic strawman
YOU are being obtuse. It's a simple illustration for why more money doesn't equal more skill. There are people who are better than Notch at game design as well but you've never heard of them.
> There are people who are better than Notch at game design as well but you've never heard of them.
Because they, ironically, probably haven't shipped anything of note. You are the one that has brought up money. Notch could have open sourced Minecraft for all I care, and I would still value his opinion of some no name homosexual on this website, least of all (You)
You're just proving my point. Minecraft is nothing incredible and also poorly coded and it only got Notch a billion dollars because he was born at a certain time. There are many better games out there and you can't name their creators. You just know OOGA MONEY MEAN GOOD like a brainlet.
And they are still no name homosexuals who couldn't turn a profit from their abilities. Just this fact alone means their opinion is worthless if they can't derive a few bucks from their supposed "skills".
Money creates status. I know this is hard for you to accept.
The common denominator is that he stopped posting here because he was serious. You (and myself) still post here.
notch kept browsing IQfy for a while after minecraft became successful, hence his "problematic" phase. sometimes he used to even post under a known tripcode (maybe you can still find the tweet proving that it's his)
well, he did make 1B dollars out of that, so yes i would say hes a serious dev.
>Dude just write you're entire system twice!
>In a completely different language no less!
It's all so tiresome. If you're going to go the moron path to a full rewrite, then just rewrite it in the same language and you will get just as many benefits as if you write it in Rust.
This is pretty standard
most startups use a language that's very quick to iterate on like js. this is garbage of course and bites them later but most startups don't even reach later, goal is to build it very quickly
Once they make it, then the rewrite comes in something more scalable, java, c#, elixir, haskell, ...
most game companies dont have vc hype money to burn like startups... they gotta ship something and it has to be good
startups do a lot of dumb shit because they can afford it.
the opposite, they can't afford it and they don't know its dumb until they do it (there are exceptions)
too many dumb moves and they're out
Top jej, people were literally warning about the iteration speeds for years. Instead, Rust community went deeper into async hell, not caring about build and iteration times. It will be so much fun watching the community fall apart over the years, and maybe some fork overtaking Rust lang. The absolute state of Rust is mix of incomplete async crap, lack of many useful linker options available in other native languages, abandoned rewrite projects, incorrect planning warranting a full re-write of existing Rust projects..
Jesus.
I'll say sorry when more games are made in jai than rust LOL
jai has a somehow working sokoban clone
rust has.. nothing?
Veloren is far more impressive than Blowjob's unfinished Sokoban clone thoughbeit. You have to do better.
What's impressive about it? Looks like another unfinished Cubeworld clone.
What's impressive about the Sokoban clone? Looks like a two-months-in-Unity project.
Yeah, I wouldn't actually play it.
blow has a knack for making superficially unimpressive games that turn out to be complete bangers:
>braid: lmao 2d platformer mario clone there aint no point
>witness: lmao cereal box maze walking simulator game
both of those games did very well and are widely respected as being really high quality and full of interesting ideas.
>well-respected
>interesting ideas
sounds like you need a reminder, Blow
soulja boy was having fun thoughever
This is how Blow made his fortune... having a game on the fricking xbox arcade as a download during the time where you still had to physically go get your games and so all the NFL madden playing people thought they'd try this one mario game that was available there while waiting for their bro to bring the madden disk and some weed
yo bro, the homie liked it so much
I certainly hope it'll be good when he actually finishes it. It's just not as impressive now.
The Witness was genuinely too bland for me tbqh, but I get why other people liked it.
Oh no anon, you praised something. You’ve called out all the shitters who wouldn’t dare say they like something.
nta but I looked it up
>autistic voxel shit
lmao typical rust troon garbage
blow's games also suck though
Dumb metric, because jai is not being aggressively marketed as ready for mainstream production use.
We are looking at yet another wayland/systemd situation where the maintainer thinks his ideas are the best and everyone should obey.. right? It'll be fun to watch Rust community imploding in the following years. It's also so tiring, just same mistakes being repeated in the OSS community.
Wayland and systemd are diametrically opposite.
One is ugly, but works. The other is beautiful, but doesn't work.
>It'll be fun to watch Rust community imploding in the following years
it's not going well for them as it is. their lofty ambitions of everyone abandoning every other language for rust hasn't happened and never will. when the NSA released some press about how they were using rust for various things (god knows what) they also stated they weren't replacing everything with rust and estimated it would take 30-40 years to rid their systems of everything coded in C.
the blog post is written by a moron who still doesn't understand ownership semantics 3 years into using rust
rewriting things for the sake of rewriting them is obviously dumb, but having 40 years of legacy c cruft doesn't make it a sane choice for every new project. they picked java for ghidra for a reason
>attacking the messenger and not remotely arguing the message
...
>complaining about this on an east german messenger-shooting forum
>rewriting things for the sake of rewriting them is obviously dumb,
rust trannies don't think like this. in their drug addled minds they seriously believe people will just delete everything they have and rewrite it in rust for no apparent reason whatsoever. since rust trannies don't have jobs and aren't in any positions of power they can't comprehend how much it would cost. they assume everyone is working for free or some shit.
It would be to everyone's benefit if NSA used rust to 41% their spying systems
So what language am I supposed to learn then?
c go perl
The industry standard
moron, this whole thread is about game development
>He's not making his game in electron and node
You can make a game in pure css because its turing complete
https://speckyboy.com/pure-css-games/
Vampire Survivors is written in JS and that's a top seller.
>it's actually real
Holy shit. Completely proves OP's point.
If you can make a massive success game with JS, rust trannies should seriously invest in rope.
Dynamic scripting language + C++ is unironically the way to go.
Like Lua, angelscript, wren or homemade I guess if you like making interpreters.
Yes.
Jai.
If you’re using anything but Unreal, you aren’t a serious dev. That includes Blow.
why would you try to write a game in something that has never been used for games before
making games is not cutting edge research there is nor eason to do something wired
Games were using C++ before it was even standardised.
And according to Seamus Blackley, doing so was a massive mistake. They found so many bugs in the Compiler related to things not working due to no standard to follow.
I feel doing something in Rust would result in the same shit
it does show that c++ is very practical for gamedev. i feel like jai is similar, people (not just jon blow) are programming serious games in it right now, with it still in private beta.
rust on the other hand...
so much funding ($7k for bevy alone!), and yet, no games...
it's practical because it has 30 years and millions of man hours put into tooling to make it work, nothing inherent with the language
rust friend... did you even read the reply chain? they were using it before it was even standardized.
GIVE UP, BRUCE.
yes, because nothing else existed
>they were using it before it was even standardized.
Just like companies using Rust now...which then proves it is a practical language by your logic. Thanks for the confirmation
where are the GAME companies SHIPPING GAMES written in rust?
really? no languages existed before sepples?
i am by no means a sepples fan but it is a practical language for building complicated software. not ideal, but practical.
I feel like C++ (and C for that matter) are practical because they allow you talk to hardware implicitly through "unsafe" pointer access. Want to allocate a shared DRAM/GDRAM buffer? No worries, just call this OpenGL function.
I've never understood the whole "borrow checker memory safety" bullshit that moronic Rust advocates (usually trannies) espouse. Either you shit, or you get off the pot, there's no real in-between.
If I'm going to be slowed down by some moronic Rust construct, that's the total opposite of streamlining my development when I could just log/set breakpoints in my C/C++ code and work out what happened instead of insisting that the compiler hold my hand like I'm a moron or have a brain addled by sex hormone injections. The same goes for embedded where you do MMIO every second function. What's the point if I've got "unsafe" littered in my code? It's like using a sledgehammer to nail a fence together.
No, it's because it literally "just works" without anything getting in the way of the developer
The whole argument for the average rustacean is "its too hard or takes too much practice to develop the skill of allocating and freeing memory therefore I will project and assume it's hard for everyone and in conclusion if you don't adopt Rust you're just unsafe." While boiling plastic grocery bags during the lockdown
I wonder if this comes from the fact that proper debugging skills aren't really taught any more. Everything is so large and abstract now, that doing any sort of debugging for the average programming socks wearing zoomzoom triggers their anxiety
Back in the 80s/90s, systems were small enough you could debug the whole thing to gain some understanding. Now they feel like they need the compiler to hand hold them while they develop, instead of relying on something like warnings, static analysis and an actual fricking IDE lmfao
Their argument will be "muh segfaults" but the key to debugging is assuming you made the mistake yourself and then finding where you went wrong, but the average rustroon is a sociopath incapable of self criticism
i will use a compiler that can solve issues at compile time instead of using a debugger or sanitizer every single time
if only that came at no cost...
did you read the blog post? or are you here just to shill?
for me, the cost is worth it because i spend less time debugging than i do in c++
broken record...
i have personal experience that contradicts the blog, i know you have no experience whatsoever
nice projection
im sure your experience writing an ls clone is plenty
no clones, just original utilities that have a bunch of downloads
>my experience programming cli tools is more relevant than your experience making games when talking about gamedev
crazy
i've also worked on games in unreal and unity
so.... not written in rust?
my experience in games and writing rust leads me to different conclusions than the author. rust is a force multiplier for me because i know how to use it and plan out my systems. i'm not doing massive refactors constantly like he was because i sit down and think about the problems i want to solve before hand, have a scope that i won't expand, and then i execute the plan
>i sit down and think about the problems i want to solve before hand, have a scope that i won't expand, and then i execute the plan
that results in bad games, you really need to iterate on things
>that results in bad games, you really need to iterate on things
nowhere did i say iteration doesn't happen. you can still iterate within the confines of the scope you've set up, and then iterate on more ideas in your next game. getting the feeling everyone else here is larping about writing games...
>you can still iterate within the confines of the scope you've set up
You also need to iterate on the scopes you've set up
The belief that "all issues can be solved at compile time" is a dangerously naive assumption to have. I strongly believe that a large uptake in rust will actually generate significant security holes in software if people programming rust genuinely believe this.
You should always be skeptical of the compilers output.
That blog post was all I needed to avoid Rust forever. Borrow checkers are shit. Either have the IQ to manage memory yourself and reap the performance rewards, or play in a fully managed language. His observation that Rust trannies are like teenagers in their opinions is also spot on, just look at this board.
>C dev: it can be great for high performance but it's not for everything.
>C++ dev: very good performance, good features, some draw backs, it's not for everything.
>Rust dev: OMFG EVERYONE SHOULD USE RUST ALL THE GOD DAMN TIME IF YOU'RE NOT USING RUST YOU'RE A CNILE AND YOU SHOULD BE SHOT YOU'RE THE REASON WE HAVE HACKERZ!!!
Oh, and I've come to realize that Python devs are also like children in their opinions.
>good morning sir, do you have a moment to talk about our Lord and Savior, Python?
>"ehhh...interpreted is too slow for my needs and frick indentation why did they do that?"
>REEEEEEEE
>YOU DON'T NEED COMPILED
>AND WE COULD COMPILE IT IF WE WANTED, WE JUST DON'T
>THEY'RE IMPROVING THE SPEED
>INDENTATION IS ACTUALLY BETTER
>I WANT YOU TO DIE FOR REJECTING PYTHON!!!!!
schizo
YWNBAW
>Either have the IQ to manage memory yourself and reap the performance rewards, or play in a fully managed language.
Or just use C++ and get both high performance and automatic memory management. The only memory management I ever have to do is for graphics API stuff and even then it mostly just consists of packing the cleanup instructions into an array of lambda functions whenever something is initialized, and unwinding it on shutdown.
>Borrow checkers are shit. Either have the IQ to manage memory yourself and reap the performance rewards, or play in a fully managed language
fricking amen to that
idk why you decided to attack python completely out of the blue with a straw man that doesnt actually happen
literally everyone knows python is slow, but it doesnt matter for what python is used for
shitting on python is one of the surest signs that someone is basically nocoder or is an autistic maintainer who doesnt actually make anything
>python devs
>elitists
lmao. the average vocal python user is some casual boomer hobbyist that just wants to make a quick script for something to share with his bros
I’ve given rust a shot a few times but there’s always something dumb I bump into which usually involves screaming at the borrow checker. They also have some weird obsession of nesting generics in generics which gets incredibly annoying and long-winded, it reminds me too much of inheritance hell in c++.
How whole post is based on a false assumption.
Rust is a language much more productive than cpp if you actually know it.
He is just trying to fud for his unrealized j meme.
>Rust is a language much more productive than cpp if you actually know it
Then where are all the other Rust games?
Video games are a meme and productive people build more important stuff.
can you link me your published video game written in rust as proof?
if a language is productive it will video games will be used made with it this did not happen once in 20 yrs
Ah thanks for clarification, could you post your finished and stable AAA game written in Rust please? Thanks anon!
The dude literally spent years and wrote tens of thousands of lines of code in Rust. He opened his blog post with a discussion about the "just git gud" mentality in the Rust community. He went into detail on why that's not the case for his problem space (indy game dev where he wants to rapidly iterate his game). And you think the correct response to him is "just git gud?"
You didn't even read his blog post.
>You didn't even read
And I'm going to add: when he brought up the borrow checker I immediately knew what he was going to b***h about. I would rather deal with C++ any day of the week than Rust's borrow checker.
when you look at this meme rust evangelism unironically starts to look like marxism and i am not saying this as a joke
1) you did not read the blog post.
2) you are midwit because you made this argument.
>you did not read the blog post
I skimmed it and stopped reading when he unironically suggested cloning as being the way to deal with dangling references
compile time isn't the only thing game devs mean when they talk about fast iteration time
>dangling references
that was not even the problem that was described lmao midiwit
in c this is just
struct Character {
char* name;
};
struct Context {
Character* selected_duck;
int other;
};
void character_select_duck_detail(..., Character*, Context*);
void Update(Context* context) {
if (context->selected_duck) {
character_select_duck_detail(..., context->selected_duck, context);
}
}
and it works fine!
the problem is that rust's borrow checker is not sophisticated enough to realize when aliasing is safe.
>the problem is that rust's borrow checker is not sophisticated enough to realize when aliasing is safe.
Bingo. I don't even have experience with Rust and when he started to describe that problem I intuitively understood where he was going. But that goes against the Rust narrative so it has to be mocked rather than understood and acknowledged.
I'll defend C when brainlets attack it on IQfy. But I would never, ever suggest it for everything except as sarcasm. I don't deny that it has problems, in fact I fricking hate null terminated strings (though if you're using C to accelerate string processing you simply don't do it that way and ignore standard library string calls). But C has its strengths and its place. Rust (and some Python) evangelists just can't admit the language is not perfect. Criticism and using another language literally triggers them.
There are no perfect languages, frameworks, etc. Use the best one for the job.
Hi anon, brainlet here. Can you explain to me what this code is able to do that Rust can't? I don't know any Rust at all, but this C snippet is something quite simple. What's the problem with Rust when trying to rewrite this?
>Can you explain to me what this code is able to do that Rust can't?
access selected_duck from two different pointers lol
I dont get it, where does it happen?
(..., context->selected_duck, context)
or
if (context->selected_duck) and (..., context->selected_duck, ...)
you are passing two pointers to the function: a pointer to a character and a pointer to a context. but the context pointer points to a struct that has a pointer to the same character. so now you effectively have two pointers to the same character. rust doesn't like this.
Frick Rust then lmao, I am happy in my simple C world
Sounds about right? Good on rust for automatically pointing out shit programming...
you are a midwit!
you have no argument!
>le nocoder has arrived
if you automate memory management you permit weak programmers to have jobs which is contrary to principles of social darwinism
C has allowed weak programmers to push security nightmare after security nightmare for almost 70 years with no social repercussion
>t. doesn't understand the blog post or the patterns used in rapid, iterative game dev
>noooo only c has memory exploi...
Pic is for you. I can post more pics for any language you like. The CPU is not "memory safe" which means safety is a skill issue, even in "muh safe" languages.
>t. never had to write truly high performance code
>>t. never had to write truly high performance code
cope harder, midwit
>no reply but seethe
Your concession is accepted anon.
>no reply but harder cope
yep
>rust CVEs
>they're buffer overflows
What was the point of this language again?
People seem to have forgotten that we need "unsafe" code to do anything useful in systems programming. It's no surprise that there's unsafe C-style code sprinkled throughout the entire standard library, that's practically a requirement.
However, Rust is the only systems language that gives users this dangerous false sense of perfect security. Those buffer overflow CVEs from the standard library are just a consequence of their own arrogance.
pretty sure airplanes and rockets don't need it
They literally do. They have used and continue to use "unsafe" languages. But they look for a minimum skill level and have standards, and the code must meet those standards in review.
Unless you're modern Boeing. Then H1B pajeets can write the software and have it tested in India and then the planes can crash.
>But they look for a minimum skill level and have standards
by standards and minimum skill you mean they use formal verification? Or do you mean in your fantasy world we rely on the god given skill of Cniles to make sure planes software doesn't have unwanted behavior?
give up bruce. rust lost. cniles won.
I've run into morons on IQfy that actually think Rust can prevent memory leaks. The cult doesn't even understand basic terminology.
Which bizarre for something that is critical to safety. Everything else related to safety or shit that *has* to be correct in all sorts of engineering, software, technology etc contexts is standardized. Yet here the Whitehouse wants people to use Rust and there's no standard or spec to speak of. A standard's committee would at least be able to sit down and get ahead of these issues before they become bugs in an implementation that everyone uses. People could at least run conformance tests put out by the committees against their implementations too.
y'know maybe this wouldn't be such a big deal if there was a fricking standard instead of just an implementation
>if there was a fricking standard
There won't be one, standards give people the power to write competing implementations.
We can't have that with corporate Rust, the foundation won't willingly give away any of its power in the ecosystem.
>having to drag CVEs from 3 years ago
raise
I never said it wasn't less likely in a "memory safe" language. It is. But it still has happened and will happen. In all of them. It's also less likely in C/C++ with qualified engineers who understand security.
The difference is that there are dozens of classes of exploits. So if you assume that your code is "safe" because of the language not only will you get your ass bit by the other types, you might even get bit by the type you believed could never happen.
tl;dr - qualified engineers should be writing code that needs to be safe/secure. That's more important than anything else.
>I never said it wasn't less likely in a "memory safe" language. It is.
backpedal
>So if you assume that your code is "safe" because of the language not only will you get your ass bit by the other types, you might even get bit by the type you believed could never happen.
did anyone claim otherwise?
try asking for unsafe rust help on the usual places without reading the unsafe docs, you will (rightfully) be yelled at
>>I never said it wasn't less likely in a "memory safe" language. It is.
>backpedal
No, I'm correcting your straw man.
>did anyone claim otherwise?
Repeatedly on this forum Rust fans act as if Rust is absolutely immune to buffer overflow errors.
>try asking for unsafe rust help on the usual places without reading the unsafe docs, you will (rightfully) be yelled at
Not everything can be safe anon. Do you understand that the CPU is not safe, and systems programming therefore cannot 100% be guaranteed to be safe? Also, you're assuming all of those were "unsafe code" when a bug at a lower level can result in an exploit in "safe code."
here is an example of the type of problem rust's language design is centered around preventing:
std::vector<int> xs;
xs.push_back(1);
int& ref = xs[0];
// can segfault: xs was moved in memory after resize, we're accessing stale memory.
xs.push_back(ref);
xs.push_back(ref);
xs.push_back(ref);
the way rust does this is by making mutable references exclusive:
let mut xs = Vec::new(); // 1.
xs.push(0); // 2.
let refval = &xs[0]; // 3.
xs.push(*refval); // 4.
xs.push(*refval); // 5. <- compile error! xs borrowed in (3) and used in (5), but was also borrowed mutably in (4)
what it is doing is preventing you from aliasing a value. this means your code can't hold more than one mutable reference to a thing simultaneously.
the analysis that rust is trying to do is fundamentally conservative.
if it can't prove that your code is safe, it will not compile it; as opposed to refusing to compile when it can prove that your code is unsafe (much, much, much harder).
so in some cases, you might have aliasing that is perfectly safe to do when taking into account what the code does but rust will just refuse to compile the code because it conservatively rejects all mutable aliasing.
in this specific case, the author presumably wanted to borrow a struct mutably whilst also borrowing one of its fields at the same time.
basically yes. the correct answer is the boring one. just evaluate requirements and use the thing that's suitable for the task. then nuanced part is knowing how to evaluate requirements and correctly pick the tool in an objective way that's not influenced by hype or emotion.
You will get compile error at 4 not 5.
The index operator has a signature fn(&Self,usize)->&T which after removing lifetime ellision is fn(&'a Self,usize)->&'b T where 'a: 'b. That last part with where means lifetime of 'a (the vector borrow) is encompasses (outlives) lifetime of 'b (borrow of specific element). Or if you inverse the wording, as long as an element is borrowed (referenced), the whole vector is borrowed. Makes sense, can't get rid of the whole container while something may be referencing into it.
push-back takes a &mut Self, so it borrows the container mutably. Something can be either not borrowed, uniquely borrowed mutably, or borrowed immutably one or multiple times over. The Vec is still borrowed immutably so you can't borrow mutably.
Mental illness
Very succinct explanation of why rust is complete shit. Its aspiration is a language beyond complete shit
>We are a small indie game dev studio of two people, working on various games across different engines over the past few years.
>holding mic to twitter user.jpg
No shit. Rust is a horrible choice for videogames
Is it time to learn zig? Why can't there just be something good like C but better?
No, zig has the same iteration speed problems the article author is complaining about: https://github.com/ziglang/zig/issues/335
and it's going to get worse as they implement more of these. They don't want to add warnings to the compiler so you're forced to put up with this bullshit.
>moving the lamp post
>rapid iteration
Skill issue.
If you you can't run through like 10 consecutives steps of your game loop in your head you're a fraud.
I also wonder if this guy had multiple crates for his project or was just compiling the whole world every time lol
language skill issue. jai can compile 100klocs in less than a second.
Duh. He's ALWAYS right!
The blog post is right and it extends to far more than just making games.
Manual memory management in a non-trivial project is a fool's errand.
Just use garbage collection.
https://crates.io/crates/crossbeam-epoch
What's the point of using Rust at that point? Just use Go
Even airplanes and rockets will have to make system calls (unsafe) into whatever kernel they're running on, and the kernel has to interface with the hardware (unsafe) to provide a number of those system calls.
If they aren't running on top of one then they're directly interfacing with the hardware and likely have access to the entire memory (absolutely unsafe).
Was meant as a reply to
Yeah pretty much, even the official Rust support in the Linux kernel is just one giant blob of code wrapped in unsafe {} which throws all of the Rust benefits out of the window.
for Linus, its just that kids don't wanna learn C and wanna learn Rust because its the cool new thing. Despite google's shilling he has no delusions of Rust's safety like the cargo cult does. He just supports it because eventually the current gen of maintainers will die off. And tbh, from what I've seen of zoomers, they are all utter morons so I don't blame him going after the Rust community. They tend to be filled with troon autists but that's still better than the average CS grad these days
I absolutely love Linus, and you forgot to include the explanation.
Also Rust still doesn't have a stable ABI and probably never will, so why the hell are they trying to push it into the Linux kernel?
>if you can't deal with the rules that the kernel requires, then just don't do kernel programming.
>Linus Torvalds
LMAO RUST TROONS IN SHAMBLES
Linus is such a bigot.
>t. Rust Foundation Sponsored Brainlet
>for Linus, its just that kids don't wanna learn C and wanna learn Rust because its the cool new thing.
This isn't really true though. I can't think of any unis teaching Rust right now meanwhile pretty much any uni worth its salt still teaches C as well as a basic operating systems class.
well at any rate zoomers are the most useless generation for programming by far
god help us when Linus dies and Microsoft and Google fight over who can frick over the kernel harder
>kids don't wanna learn C and wanna learn Rust because its the cool new thing.
People don't want to learn C because it's just tedious as frick. Linus himself summarized it well: good programmers want to deal with data structures and their relations, they don't want to deal with the code itself more than strictly necessary.
>because it's just tedious as frick
And dealing with the annoying screeches of the borrow checker and forced thread safety even on single-threaded code isn't? And all the type masturbation needed to get anything done in Rust?
>hey don't want to deal with the code itself more than strictly necessary.
This applies more to Rust than to C and C++, that's the entire point of the article in this thread...
>rust is a huge pain in the ass to deal with but also it's a crutch for brainlets
You don't like change. Man up and admit it.
>but also it's a crutch for brainlets
Brainlets shouldn't be doing systems programming. They shouldn't be anywhere near the linux kernel codebase trying to push their brainlet language into it.
Maybe learn an easier GC'd language if you can't deal with it?
Linus completely understands why you'd use Rust and is on their side. Try living in the present
>Linus completely understands
Your screenshot doesn't seem to demonstrate this, he's talking about the safety obsession in Rust and how the unsafe parts are necessary to make it all work. Otherwise, you get a straitjacket language that can't do what C is capable of.
Tell this to your average rustroon and you'll get incomprehensible screeching. Most don't believe "unsafe" code should be used at all.
> Most don't believe "unsafe" code should be used at all.
Yes, which is why when confronted with
they earn their status as a… cargo cult
If unsafe is considered harmful (TM), then the STL shouldn’t use it, Rusttards unironically act like cult members trying to explain why they need to be celibate but the Supreme Leader gets to frick four chicks a day
Come back to earth and reality. He's saying how Rust does it, siloing off the unsafe bits into a small part that experts write and application developers can use without dipping into unsafe themselves, is a good thing.
>a small part that experts write and application developers
Do you even hear how ridiculous your own propaganda sounds?
Rust is a systems programming language, not something you'd normally use for user applications. There are better languages for that that are easier to write in and with much better GUI support.
The only reason rustroons keep pushing for Rust outside of systems programming is because it hilariously failed at it with its safety at all cost obsession.
>Tell this to your average rustroon and you'll get incomprehensible screeching.
No you won't. The trannies in your head are not real people
>trannies aren't real
Now we're agreeing. They're delusional.
based and understands why unsafe exists unlike the cretins that troll IQfy
You moved the goalpost from internally unsafe code to external calls
2018 was 6 years ago? Why does it feel so recent?
>rust isn't good for making cheap rushed sloppy buggy corpjank so it's bad
>getting filtered this hard by the borrow checker
jblow once again shows off his 300 iq
>i dont understand how to do this
>3 years later
>i still dont understand how to do this, and im going back to python
yeah im gonna keep using rust
>not good for game development
>too high-level for system dev
>too low-level and tedious for webshit
>by laws, can't be used in most safety-critical systems because there's no standard
>areweguiyet: no
What's this language for again?
>What's this language for again?
Advertising to others that you are proudly transgender and have regime-approved politics.
I don't understand why gamedevs switch to Go. It's the best mix of being both fast as a language and being able to prototype rapidly.
if gamedevs wanted to spend all day reinventing wheels they would still be making their own game engines
>making your own engine == reinventing the wheel
So if I wanted to make a Paradox-style game, given that Europa & Clausewitz are closed-source, which engine would I use for that?
Unreal or Unity
Unity runs many large simulation games just fine like City Skylines
>Unreal or Unity
Oh no, you're moronic.
Simulation games made in those engines run better than Paradox's pieces of shit
Simulation games that actually have a large workload run horribly in those engines (see: Per Aspera, Endless Legend). Additionally, their simulations aren't deterministic, which means either a brutal amount of network traffic or routine desyncs.
Compare that with the blazing fast speed of modern Clausewitz Engine games like Crusader Kings 3. You're probably looking at older single-threaded Paradox games and not the newer ones.
You can't make a grand strategy game in Unity or Unreal or Godot.
>Endless Legend
lol what, it's turn-based
>You're probably looking at older single-threaded Paradox games
I'm looking at HoI4, runs like complete dogshit
If you want a deterministic sim you can just use integers
Go is a stunted language, no generics
No reason to use that instead of C#
Wtf are you talking about? Go added generics over a year or two ago.
my bad, still probably worse than C# though
Nah, it's better then C# for sure.try programming in it. It is extremely trivial.
>it's better then C# for sure
Why?
It doesn't follow OOP dogma.
Any objective reasons?
The language haa been designed to help you write faster code, plus it share's a lot of great things with C, plus the standard library is head and shoulders above other languages.
What’s so better about it? Honest question. No MSFT baggage?
12 years of "people" crying about lack of generic support. 2 years of having generic support and yet hardly any use found for them that wasn't already satisfied with interfaces or the base types.
>yet hardly any use found for them
Generics aren't some experimental feature the're heavily used in many languages
That can be said for a lot of features. You failed to make a case for their inclusion in Go. Let alone a point at all. Dynamic types with defined interfaces have proven to be sufficient for over a decade, and the addition of generic support doesn't seem to reflect the importance people implied it had when they where complaining about it for that decade.
>Dynamic types with defined interfaces have proven to be sufficient for over a decade
No they haven't, I need static generic data structures, so does anyone else making a game
>need
For what purpose? I strongly doubt you have a collection of arbitrary data that is so generic there is no commonality amongst the objects that their behavior can't be described in an interface. It's more likely your abstractions and control flow is terrible.
Ok I have a vector of ints and a vector of bytes
They're exactly the same thing except they contain a different data type
How you gonna do that without generics?
I fail to see why you can't just have a slice of an interface which has methods that defines the common behavior they have.
ints and bytes are different data types with different sizes that need a different underlying data structure to store them
That doesn't change anything. I'll write you a contrived example.
Yes it does
You can't do generic data structures with interfaces, you can only do generic dynamically dispatched behaviour
I don't get what you're talking about, especially without any code examples.
You can define a method on a slice of ints and bytes, describe the commonality between them, and utilize the interface type regardless of the underlying type. The same can be done for a slice of slices if that's what you're doing.
https://go.dev/play/p/DJfxBLy0MfH
This applies for things like encoding too. Even if you have different underlying types, you're still going to funnel towards some common behavior somewhere, like encoding a collection of items to a byte sequence before writing it to disk or the wire, it doesn't matter what their underlying type is as long as it has some common interface. Which you're going to need anyway if you're passing around generic types and doing the type discrimination and dispatch manually.
You've gotten around this by making an interface to either an array of ints or an array of bytes
But what if you want to make a generic data structure that could hold an int, a float, a struct, or whatever, and the underlying data structure would actually need to change based on what type it was holding? You can't do this via interfaces
>You've gotten around this by making an interface to either an array of ints or an array of bytes
You specifically said
>I have a vector of ints and a vector of bytes
So that's what I used. And
>How you gonna do that without generics?
I showed you how.
>But what if you want to make a generic data structure that could hold an int, a float, a struct, or whatever
Nothing prevents you from using the interface type as the type of your struct's field.
>and the underlying data structure would actually need to change based on what type it was holding?
You'll have to explain why the struct "needs to change" based on what type it's holding, because that sounds like fragile and bad design.
Again even in situations where a types size matters, that is easily abstracted out.
And to reiterate, if you're in that situation already and not utilizing an interface, it implies you're doing the same thing somewhere anyway, but manually. There's no reason I can think of to do that instead of allowing the language and compiler to aid you here.
>>I have a vector of ints and a vector of bytes
>So that's what I used
I'm asking you how you would IMPLEMENT a vector of ints or a vector of bytes, you're using the existing implementations
>Nothing prevents you from using the interface type as the type of your struct's field.
I'm assuming the interface is a tagged union in that case, so it would be the size of the biggest option. An array of interfaces to a byte or an int is going to be the size of an int, wasting memory
>You'll have to explain why the struct "needs to change" based on what type it's holding
Performance
You can implement everything via dynamically typed interfaces, but you're wasting memory and execution time
>I'm asking you how you would IMPLEMENT a vector of ints or a vector of bytes, you're using the existing implementations
The same principle applies. Now the question is why you're choosing such an example. Because there are theoretical problems and real problems, and choosing to implement your own vector of ints seems like a contrived problem made up just for argument sake and I don't want to have that discussion.
I already showed how you can have a vector of arbitrary types so long as each type within the set conforms to an interface's method set.
>I'm assuming the interface is a tagged union so it would be the size of the biggest option
It's tagged, but not a union. It's a type descriptor paired with the data. So if your interface implementation is a slice of ints (a pointer to an array), then an interface value holding one is the type information and the slice itself.
>Performance
>You can implement everything via dynamically typed interfaces, but you're wasting memory and execution time
Without any measurements you're simply assuming. I can just as easily say the the cost of doing the discrimination and dispatch by hand is equal or more than the time it takes for the runtime to do it, if the compiler hasn't already optimized the dispatch out.
The same can be said for memory usage. Without measurements you're just assuming.
Considering what you've said so far, I wouldn't be surprised if your structures are suboptimal in that regard. Not to small size not being important on all architectures. Alignment typically matters more, but as always you have to measure on your target machine to find out.
>I already showed how you can have a vector of arbitrary types so long as each type within the set conforms to an interface's method set.
To clarify, you could do the same thing to implement your own vector of ints if you were inclined to. Or a vector of any collection. But again, Go has slices and arrays built in to its type system.
>Not to small size not being important on all architectures.
Not to mention, small size is not important on all architectures*
Yeah you don't need to implement a vector yourself, but you have to implement more complex and specialized data structures yourself, I chose a vector because everyone knows what it is
>Without any measurements you're simply assuming
It's the way computers work. If you want a vector of something that might be an byte (1 byte) or an int (4 bytes) at runtime, it's going to be at least 4 bytes per element, which is going to be wasteful
And dynamic dispatch is slower than static dispatch, this is fact
>I wouldn't be surprised if your structures are suboptimal
This feels like a strange thing to say, you're advocating for suboptimal data structures
>Yeah you don't need to implement a vector yourself, but you have to implement more complex and specialized data structures yourself
In regard to our topic, you're not making any point here. I already demonstrated that any type within Go can have methods attached to it, and those can be stored and referenced via an interface type.
So no matter what your game objects are, you can put method on them, and no matter what type needs to store them, be it a struct, a vector, map, etc. you can do so by utilizing the interface type. This extends to function parameters as well. And moreover, your types can implicitly implement multiple interfaces and thus be assigned and passed around between any of them.
>If you want a vector of something that might be an byte (1 byte) or an int (4 bytes) at runtime, it's going to be at least 4 bytes per element
I already said that's not the case. It's not a union.
>And dynamic dispatch is slower than static dispatch, this is fact
And I already said the compiler can optimize dispatches out. If you care about performance you're likely going to implement the call stack in such a way the types can be inferred at compile time. Because you're not likely going to be utilizing reflection or other runtime dynamic features which would prevent such optimizations. It's not much different from how C++ can do the same with templated calls.
>This feels like a strange thing to say, you're advocating for suboptimal data structures
I'm not advocating for anything. You said these things are not possible without generics which is false. Now the topic is shifting into how it can't be done in a performant way which is also false. You also have no data to back your claim, or have any bar set.
You can make the argument it might be slower, but you have no implementation to compare. And even if you did, without numbers you can't even say if the delta is negligible or not.
>I already said that's not the case. It's not a union.
You said it's a "type descriptor paired with the data". That's a union. What else could it be? These are the fundamental rules of reality, you either have compile time generics or you're wasting extra space accounting for any possible value. You don't need data for this, it's a logically provable fact. The same way that dynamic dispatch is slower than static dispatch, more work needs to be done at runtime
You specifically eluded to the C type of union where a type is as big as it's largest type which is not the case here. For Go specifically the interface semantics can be implemented however the compiler wants, as long as it conforms to the spec.
Regardless, you're still driving off topic. First you said it wasn't possible, now you're just saying you're not satisfied with it.
If you want to argue about the hypothetical difference in performance, we can do that.
Go might not be the fastest language but it's usually ranked pretty high. And it allows you to interop with C code, as well as implement functions in assembly for really-really hot paths if that's your requirement. There's also several implementations of the compiler, including ones for embedded and high performance systems.
If we're going to pull numbers out of our ass, lets assume your game is nanoseconds slower on average. Unless you're Grace Hopper's ghost, it aint gonna matter. And I'm saying this with utmost confidence because we've had several decades of people saying shit like "you can't write games in a garbage collected language!" yet here we are where there's many many successful games without performance issues implemented in Java, C#, JavaScript, et al.
The language is not going to be your performance bottleneck, I promise. If you write it shit enough in Go that it causes frame rate issues, you're going to write it just as shit in C.
This is important to remember for this topic too because far too often do people get tricked into using languages like C and writing their engines from scratch and they never ever just make the damn game at all, let alone a performant one.
>And I'm saying this with utmost confidence because we've had several decades of people saying shit like "you can't write games in a garbage collected language!" yet here we are where there's many many successful games without performance issues implemented in Java, C#, JavaScript, et al.
More importantly we have the opposite case where games written in C++ from AAA studios run like absolute dogshit. The language matters less than the implementation of the game.
A recent successful game Balatro is a Love2D game (Lua game engine) and from what I heard the implementation isn't the best, yet it runs fine.
>More importantly we have the opposite case where games written in C++ from AAA studios run like absolute dogshit.
Not really
Many games might not hit 60 FPS but that's not because they're badly programmed
>You specifically eluded to the C type of union where a type is as big as it's largest type
That's how it HAS to work, there's literally no other way to do it
>First you said it wasn't possible
Generic data structures aren't possible. This is a non-generic data structure that operates on generic objects. Generic data structures need to be able to change their data representation based on the generic parameter
You can write games in Go or C# or any garbage collected language, it's perfectly fine for many tasks, but if you want to do anything that deals with primitive data types or has high performance requirements you're going to have issues. You can't optimize interface dispatches very well unless you're willing to generate different function variants for every type
>That's how it HAS to work, there's literally no other way to do it
I cited the reference implementation that shows you exactly how it works, and I've said several times it's not a C style union. You're simply wrong.
implements it as a tuple of a value's type and a pointer to the underlying value. I.e. not a C style union type.
>Generic data structures aren't possible.
That's wrong considering Go has generic types.
I said originally that you don't need them, and you said it's impossible to do certain things without them which I demonstrated was not the case.
Now you're going on about how they might use more memory in a hypothetical program that doesn't exist and we can't measure with any of the compilers. Which is moot regardless since you can do the thing you're talking about with generic type parameters in Go, the fact of the matter is that you never required them to accomplish the same ends.
Pretty much everything you've said so far is obtuse, vague, and inaccurate. And even after being told and cited you're still not understanding things so I'm going to back out of this discussion with you.
At least give some examples of excuses if you're going to make that claim. Because evidence suggest that lots of AAA games don't even function properly, let alone are they programmed well or in some optimized way.
>le business CRUD developer handling 2 pieces of state at a time think he's better at making video games that juggle thousands of pieces of independent interacting state at a time
the reason video games are buggy (not unlike other software) is because they're really fricking hard to make.
>video games are hard to make and they're buggy
>this somehow means they're not programmed badly
You sure convinced me with that one Reddit-san.
what doesprogrammed "badly" mean? does it not mean worse relative to other software? my point is that you coudnt do better.
Video games are terribly programmed, except when you compare them to all other software which is even worse
>a pointer to the underlying value
Having a pointer to a byte stored randomly in memory is WAY worse for performance
>Now you're going on about how they might use more memory in a hypothetical program that doesn't exist and we can't measure
I gave you a concrete example
If you have a generic array that can hold a byte or an int, it's either going to have to allocate enough memory for the maximum size or it's going to be a pointer to some allocated block of memory somewhere else which is way worse
>I'm going to back out of this discussion with you.
This is always what bullshitters say when they're on the verge of having to admit they're wrong about something
Generic does not mean dynamically typed.
Obviously if it is a list of byte it's a block of n bytes.
If it's a list of a larger type it's a larger block of memory.
If it a list of interfaces to a byte or an int, that interface is going to be fricking huge and slow compared to just a byte. That's what you need generic data structures for
You cannot compare an interface to a byte array or int array to an array of interfaces to a byte or an int, these are not the same thing
Right, obviously the list has the interface and it's a list of some primitive type or something else.
>This is always what bullshitters say when they're on the verge of having to admit they're wrong about something
Sounds like your way to cope and/or projection. Sorry I ran out of patience with you bro.
It just seems like you're genuinely not able to grasp the concepts so it's not worth talking to you about it.
Remember, it's not my job to educate you, and I gain nothing if I convince you of anything. And it seems like you've made up your mind and are trying to go in circles or divert to another topic, so it's frustrating to talk to you. Sorry man, it is what it is.
I fail to see how any program that hardly functions isn't somehow "programmed badly".
>my point is that you coudnt do better
Whether this was the case or not wouldn't change the fact or somehow excuse them.
Me being worse at something wouldn't somehow make their results acceptable. That's a horrible argument.
In any case it didn't convince me that they're programmed well or optimized. Neither of them.
>It just seems like you're genuinely not able to grasp the concepts
You can't grasp what I'm talking about. You don't understand how generics are fricking implemented so you're arguing about terms and false equivalencies and basically anything beside the point. You're comparing {byte[],int[]} to {byte,int}[]. These aren't the same fricking thing at all. You're suggesting that holding a pointer to a single byte is something worth considering. That's ridiculous.
>I fail to see how any program that hardly functions isn't somehow "programmed badly".
All programs have bugs, there's no game released that "hardly functions"
Actually laughed at the irony of this post. I suspected you were trolling and this part specifically confirmed it
>All programs have bugs, there's no game released that "hardly functions"
GG you tricked me.
>I suspected you were trolling
I'm not trolling. You're being a typically confident ignorant, close-minded idiot and refusing to engage with any facts. You don't know and you don't need to know, because you know everything despite knowing nothing. You asked what you needed generic data structures for, I told you, and then you showed me an example of something that wasn't equivalent and said you'd solved the problem. Are you being ignorant on purpose because you have some bias towards Go, or is this just stupidity?
Name a single AAA game that "barely functions"
>You're being a typically confident ignorant, close-minded idiot and refusing to engage with any facts.
Bro, I replied to you like several times. You're not even being fair. I'm not reading the rest if you're gonna act this way. It just reinforces my judgment that it's not worth it.
That's a generalization that can't be substantiated. You're clowning if you think all AAA games are releasing in some optimized state.
Which isn't the argument regardless.
The original point is that the timing difference between languages is not likely to be the primary cause of your suboptimal performance. Everyone jumping out of the woodwork to defend AAA games as if this will change that fact.
That changes nothing. An optimal engine doesn't automatically equal an optimal game. You can surely find countless examples of people using an engine poorly.
I like the game The Citidel, it uses the Unreal engine. It's comparable to Marathon in terms of looks and gameplay.
Yet randomly sometimes a level will load and you'll get single digit FPS. Sometimes you don't.
This isn't the engine's fault, the game developer is likely doing something wrong on top of it and tanking performance.
So not only did he not write the engine, nor optimize it, he managed to take an existing engine and have bad performance arbitrarily too. So what difference did it make?
This happens in AAA studios all the same.
>Bro, I replied to you like several times
So? Your replies were close minded and fallicious. I try to point this out to you and you're like "nah bro not engaging anymore, this is over". How willfully ignorant of you. I wasn't even rude about it
>You're clowning if you think all AAA games are releasing in some optimized state.
Substantiate this
>refusing to engage with any facts
>>Bro, I replied to you like several times
>So?
Are you actually moronic?
You replied to reiterate the fallicious things you said, while ignoring what I said because I was correcting you. You don't want to see the other side of the argument
I can't tell if you're joking or not. The irony is too thick.
Regardless, if you're going to be this persistent let's get to the bottom of this.
You should either
1) remain confident in your own perspective and walk away knowing you're right
2) look into an alternative on your own instead of asking me specifically to change your mind when that hasn't worked so far
You're clearly not understanding what is being said, you also don't seem to want to change your mind, I've made it clear you're a pain to talk with, and you're still pestering me to talk with you.
Sorry if I hurt your feelings or whatever, I'm just being honest with you. If you're seriously interested in the topic, look into it on your own time or ask someone else. There appears to be at least 3 other people replying to you and they didn't make any progress either, maybe someone else will continue the chain.
You're reducing things too hastily and then generalizing too. Shaders are not the only thing that could cause performance issues and not all studios are going to produce optimal works. I can't believe I have to write something that obvious.
And again none of this has to do with the original point that the difference in language isn't going to be the significant factor in your game's performance. The point made was that even AAA games written in C++ can have bad performance. Are you really trying to argue that can't be true? I'm not convinced.
>2) look into an alternative on your own instead of asking me specifically to change your mind when that hasn't worked so far
Just listen to what I am saying you stubborn idiot
Let me give you a recap:
I claim you can't do <Byte,Int>[] efficently in a language with no generics
You say, yes you can, just do <Byte[],Int[]>
These are not equivalent. Do you understand this?
> I'm just being honest with you
Nothing about what you're saying is honest. You are incredibly pompous and downright unwilling to engage with anyone that says anything that contridicts what you believe.
>difference in language isn't going to be the significant factor in your game's performance
you need a language that gives you low-level control over memory and has no gc. just because some games have manged to scrape by without this, like minecraft (still experiencing perf issues to this day despite their voxels being insanely low-res) doesn't mean that it is not true in general. in general, you would prefer a high performance real-time language.
of course, you can write slow c++ if you're bad at programming or just don't care, but the perf ceiling is way-way-way higher than in any managed language.
You're not wrong.
I'm just saying game developers don't require such a language and that using such a language isn't a guarantee that they'll have a fast game either.
The other Anon is acting as if a few bytes or ns difference is going to be the biggest perf concern in their game when it's extremely unlikely.
As an aside, I don't like the dogma being pushed since it can stifle game development, especially for amateurs. They get told they have to use XYZ when ultimately it wouldn't practically matter for their game and audience. And even the AAA studios aren't immune to perf problems when using things like Unreal and C++. It's important to mention these things sometimes.
You've said this already, and just like before with multiple things your recollection is inaccurate.
Your recap is a misconstruction based on your misinterpretation.
It doesn't matter how many times you repeat it, and clearly my clarifications don't matter either since you're still misunderstanding.
You have an idea in your head of what was said and how things work, but they're not what was said nor how they work. But you're acting as if that's the case. Do you see why that kind of discussion leads in circles and goes nowhere?
You're also claiming I'm not willing to engage for reasons you've made up, and doing so after I engaged with you for several posts.
Writing your speculation, stating that I'm not being honest with you, might convince yourself, but that's all it will do. It doesn't make something a fact.
In any case, the answer is "no". You're going to have to do your own research on your own time or ask someone else.
All you're going to get from me is meta commentary, which appears to be frustrating you, so it's not wise to engage with me either.
yes, you can make a game without a systems programming language, but it will be a lot slower than what is possible.
if you make a game with a systems programming language, it is highly likely it will be less slow unless you're very bad at programming.
all non-trivial games, no matter the language they're made in, will have to be optimized to fit in frame budget. whether it is by cutting features (minecraft runs on a 20Hz tick and has 1 meter voxels) or by writing optimized code (see https://www.youtube.com/watch?v=6BIfqfC1i7U)
in the end it boils down to this boring set of statements.
>Paragraphs and paragraphs to say absolutely nothing
Here is your example
https://go.dev/play/p/DJfxBLy0MfH
Your example isn't equivalent to the problem I presented. In the problem I presented, without generic data types, you need an interface structure which contains a tag and either a union or the pointer to the data somewhere. The first option being inefficent, the second option being extremely inefficent. There is no way around this. This is why generic data types are a useful feature for a language to have
Honest people talk to each other like human beings. You are talking to me like a pompous narcissist so convinced he is right that he doesn't even need to bother listening to anyone who disagrees. Your position on game development is even more ridiculous - you have absolutely no idea how games are developed, yet you confidently claim they're badly programmed because you saw a bug
I'm not reading that. I don't know why you think I'm going to engage with the technical discussion after stating several times I won't, including the post you replied to.
We didn't even get started on a "technical discussion", you literally dipped the moment the first disagreement arose
Is this how you talk to everyone? Can't imagine what it would be like working with you at a job, do you just pretend you're better than everyone and know everything?
I appreciate that you write out the projections, it makes it very transparent and provides useful insight. I'm not kidding. The psychology aspect of this place makes reading rants worth it. Like a kind of exercise.
I'm not the guy clamming up and saying "I refuse to engage" over one of the most minor disagreements ever
It's not like you even said anything particularly foolish, generic interfaces are suitable for most situations after all, but when you need the performance you need real generic data structures
The claim was this
which you argued against here
but now you seem to agree with me.
You're changing the narrative by saying your claim was
>I claim you can't do <Byte,Int>[] efficently in a language with no generics
when efficiency was not part of the original claim, and was something I pointed out earlier.
>Regardless, you're still driving off topic. First you said it wasn't possible, now you're just saying you're not satisfied with it.
Not to mention the disagreement you're hung up about, seems to stem from a reply you made to another Anon, but you're asserting it was me and getting mad at me for it.
>but when you need the performance you need real generic data structures
You don't "need" them to have performant programs. This is yet another vague statement about nothing. No context, no metrics, nothing.
I'm not even sure what you're frustrated about. I have doubts it actually relates to our discussion.
If you want to talk about it, I'd rather read that.
The original claim was I need static generic data structures
Because in the real world, in the programs I write, I can't have an array of bytes where every byte is wrapped in a virtual interface, it's way too inefficient on space and performance
And your claim was incorrect. You don't "need" them. You seem to think you do, and that's where we disagree. You also seem to think there's only one way to implement such semantics which isn't the case.
How do you know what I need or not? Can you read my mind?
There is one practical way to implement it for a primitive type, a tagged union. Implementing it as a tagged pointer to a specifically allocated block of memory just to contain one primitive is technically another way to do it yes, it's just so impractical it's not even worth entertaining the thought. And by "primitive" I mean basic data types like byte, int, float, etc. It's fine if it's an actual object being pointed to
>How do you know what I need or not?
The better question is, without measuring it, how do you know? You're claiming it's not performant enough but present no metrics and no implementation to compare. It's a baseless claim along with requirements that are not presented.
>There is one practical way to implement it
You learned about one implementation in this very thread, today, and now you're claiming there's one way to do it. You're ignoring compile time elision as well.
Your entitled to your opinion, but at the end of the day you did not convince me that generic types are a requirement for game development. Without any data to back you up, you're just saying you need them because of some imaginary benchmark you've made up in your mind. "that's just how computers work", that's not how engineering works. Either you have the proof that it can't render frames fast enough for your target, or you don't.
>You learned about one implementation in this very thread, today
I didn't learn about it today, it's obvious, it's just like I said, not practical enough to consider
Compile time elision is very limited in what it can do, it's not a real solution
>without measuring it, how do you know?
I have a data structure for a game used for AI that is full of small packed arrays, vector, hash tables, skip lists, etc. that uses bytes and shorts and ints wherever possible to save space because it's about 100mb. If I didn't use generic data structures it'd be over 1GB. Is that good enough for you?
Until you have real numbers from a real instance, it is what it is, pulling numbers out of your ass. It's baseless, made up numbers in a made up language that you don't have a working implementation in. Anything else is just self-convincing.
It doesn't even address the fact your requirements aren't stated. Even if we assume it's less optimal, the question is if it's within the window of acceptance. Can you make a game in the language and can the game run on the specs you intend. Most likely.
The reason you're saying it won't boil down to "trust me dude", and "I can't think of any other way to implement this so I just assume it won't work". As well as a potential unrealistic standard like trying to get the thing to run on ancient hardware or something esoteric like that. Which at least would be somewhat valid.
>Until you have real numbers from a real instance
That is literally a real number, I didn't pull it out of my ass, that's how much memory it takes right now, not speculative
>your requirements aren't stated
I consider using 1gb of memory on the user's PC instead of 100mb unacceptable
Obviously I meant the 1GB figure, not the 100. Unless you're saying you have 2 implementations and did compare them.
If that's the case, you should post the latter because I'm willing to bet you're doing something horrendously wrong to get such a delta. Especially if we're talking about Go which DOES have generic types that you can use if somehow that proved to reduce the memory significantly.
>Obviously I meant the 1GB figure, not the 100
It's being able to do simple multiplication, I have a bunch of data that's stored in 1 or 2 bytes, if they were expanded out to more than 16 bytes as a generic interface would need to be then it's going to be at least 10 times bigger
I'm not using or crticizing Go, I'm just saying you need generic data structures for things like this lest you either rewrite things over and over again for different data types of you take an efficiency hit
So the numbers aren't real...and doesn't even have anything to do with the language we're talking about.
Didn't implement anything, didn't test anything, didn't measure anything. Just came up with some scenario and asserted it to be generally true.
The only reason I was asking was because I thought you had a real problem you didn't understand and could use real help with it. But you're just making shit up to argue about for no actual reason. That's wild.
>So the numbers aren't real
If you have an array of bytes (1 byte)
And you need to change it into an array of generic interfaces (between 8 - 16 bytes on a 64 bit system)
You can do some simple math and see that you've increased the size of your array 8-16 times
These are facts, there's no speculation
>I thought you had a real problem you didn't understand
Please be honest instead of patronizing, I understand literally everything about this problem, you just want to defend your opinion that interfaces are good enough for any problem
They're good enough for most problems but not all of them
The math being correct has no bearing if we don't even know what the implementation is being written in, let alone how it was compiled. This is the entire point of why you measure things. What you're doing is the equivalent of reading a C++ function and trying to tell me what instructions it will compile to and how much time those things use on a specific CPU. The issue here is that without actually running it through the compiler, you're speculating. You don't even know which compiler is being used, which optimizations are being performed, etc. This is why it's important to have REAL numbers, not made up statistics. What you're doing is, yes, actually, speculation. How you're still arguing that is baffling.
>Please be honest instead of patronizing
You're the one being dishonest. You ask and ask for me to engage with the problem when it turns out there was no actual problem. You just made it up. And asked me to engage not because you needed any kind of help, then for what reason? You finally get what you've been asking for and then get mad about it and call it patronizing.
>if we don't even know what the implementation is being written in
It doesn't matter because that's literally the only way to represent it on a computer
The only way it gets smaller is if you don't use your generic data structure to contain types larger than a specific size, but give we're talking about something as ubiquitous as an array that's not that case
You're acting like this is black box magic, it's not
>You ask and ask for me to engage with the problem
I never said there was a problem, I'm just trying to tell you there is indeed a use for generci data structures
It 100% matters. Without knowing how the program is even going to execute we don't know shit about it. The numbers you're inserting are literally made up. You have no idea how much memory it's going to use at runtime because you never executed it. You're just assuming some worst case scenario because it's what you assume to be the case, in some hypothetical language. That's nonsense.
>I never said there was a problem, I'm just trying to tell you there is indeed a use for generci data structures
I never said there was no use for generic data structures. I said that Go did not need them for over a decade and now that it has them hardly anyone uses them despite the disproportionate bemoaning.
If there was no real problem to solve and you didn't care to learn about the language, I don't know why you were so incessant on asking for answers to things you have no experience nor problem with. I assume it was just to pass the time?
>Without knowing how the program is even going to execute we don't know shit about it.
You do
There are logical constraints the language must obey
If you're using your generic array to store 16 byte numbers, each element must be 16 bytes, even when that generic array is just storing 1 byte numbers. There is no way around this
>I never said there was no use for generic data structures. I said that Go did not need them
Fair enough then
>I don't know why you were so incessant on asking for answers
Never asked for answers, I was saying that generic data structures are useful
>There are logical constraints the language must obey
>If you're using your generic array to store 16 byte numbers
This is a constraint you are imposing. You made this number up. I don't know why I have to point this out since the source is you.
You have considered 1 approach to solve the problem and you have decided it is a generic one, and that the only possible way to solve it otherwise would be with a tagged union. Not even humoring the idea of any other possibility nor even giving anyone else the possibility to implement an alternative approach themselves, because there actually is no implementation in the first place. It's an incredibly unfair and baseless argument.
There is no code to review and apparently we haven't even settled on a language, so what rules it must "obey" are written in the nonexistent spec. But you've somehow nailed down the specific implementation details in your mind. You're making up these constraints and not even considering there could be an alternate approach that doesn't utilize either method for such a task. While also making assumptions about the width of the data type in hypothetical-lang.
>Never asked for answers
How about you start being honest. Remember when you kept complaining about not being engaged with? If you want to be pedantic, go for it. But you know, and I know.
>This is a constraint you are imposing
It's a constraint imposed by the way interfaces work
I should have said 8 bytes though
>ou have considered 1 approach to solve the problem and you have decided it is a generic one, and that the only possible way to solve it otherwise would be with a tagged union
I'm not talking about just a tagged union, I'm talking about any approach
>Remember when you kept complaining about not being engaged with?
That's not because I wanted a question answered
Originally you asked how to implement something without using generics. Performance was not mentioned yet. An interface solution was presented and explained. As well as how it could be adapted to follow up questions.
You mentioned that performance is required for game development to which I roughly said "so what" because the difference in performance is likely negligible. You have conflated the 2 concepts and still have not separated them despite the fact you and I both mentioned them several times now.
You don't need generics to solve the problem you presented.
Go has generic support so if you want to solve it that way you can.
In either case, it's unlikely that either solution would be unsuitable for use in a game, there is no implementation or evidence suggesting otherwise.
You proceeded to assert that there's only 1 way to solve this and that it would be unsuitable because of numbers you made up for your own arbitrary requirements which aren't even directly relevant. (We should be caring about render time, not memory usage, and the memory usage figure is made up anyway.)
As I said before if you use the generic approach in Go the same as you are in your existing language, the difference in performance will be negligible. And even if you use the interface approach it is likely still going to render at an acceptable framerate, it's not unsuitable for games in either case, and you're not even humoring a potential third case where the code is written in an entirely different way than the original implementation's design (which was never presented nor was an alternative).
>That's not because I wanted a question answered
Sure bud. You just ask questions rhetorically. Totally not seeking attention after projecting "narcissist".
>he difference in performance is likely negligible
The difference in perfomance between just a number and a virtual interface to a number is huge, that'd definitely be unsuitable for a game
Virutal interfaces are ok for objects, for numbers definitely not
I haven't used Go but if it has inbult array types I'm pretty sure they contain the actual number and not an interface to it
>you're not even humoring a potential third case where the code is written in an entirely different way
This is kind of like the "do it the Rust way" fallacy
Sometimes there's only way to do something well, like an array. There aren't multiple ways to implement an array, an array is an array
>You just ask questions rhetorically
Yes, I'm trying to convince you that generic data structures are useful
>The difference in perfomance between just a number and a virtual interface to a number is huge,
That's it. You won. I quit.
You're still refusing to acknowledge there's more ways to solve the problem than just one. Despite presenting one yourself.
I concede.
>You're still refusing to acknowledge there's more ways to solve the problem than just one.
The interface problem?
Who cares. Just use C++. It's faster.
Your fundamental problem here is you're arguing from a position of ignorance, yet you think you know more than anyone else about the topic. It was the same when you were talking about games. You don't know how games are made, but you KNOW they're badly programmed, and nobody can possibly know more than you about this topic.
You do not know how interfaces are implemented by compilers. You're assuming I also don't, so I can't make any claims about this because it's speculative. I know how compilers implement interfaces, I know the constraints they must obey. It would take a lot of words to explain it completely, especially to someone who doesn't want to hear the answer, but the short of it is what I have said: If a generic array must contain elements as large as the word type, its elements cannot be smaller than the word type. It is not possible.
What part of "I concede" don't you understand.
You've convinced me that in engineering there's only 1 way to solve a problem and I won't consider any other possibilities. It worked for me once in one language so it's probably the only way to implement it correctly or performantly in every language. There's no need to actually test theories when you can just trust your gut and stick with designs you know will work.
Not even reading what you wrote for the same reason, I just have an intuition I'm right and don't have to back it up in any way. That's what I've learned.
No, there's many ways to implement it, there's only a few that are actually good, and they all must obey the constraint I just laid out for you
This isn't my gut feeling, this is cold hard logic
Have you made a compiler that implements interfaces? Have you attempted to optimize them?
Go has had generic support for multiple years now so there's no reason you have to use interfaces in your structure, but you keep saying "no dude trust me there's no other way to implement it". It's a constraint you made up and it's still the only strawman you want to argue against despite knowing up front that Go supports doing it the exact same way you're already doing it, which is good enough in that case but somehow not performant enough in the other case.
What do you even want me to say at this point? How do I take the L?
Go probably has native arrays that contain the actual value, not an interface. Pretty much all languages do this. I was just talking about some theoretical generic array you would make with interfaces
>I was just talking about some theoretical generic array you would make with interfaces
Which is exactly my point, it's a theoretical made up problem and you're choosing 1 specific solution as if there's not other ways to solve it. If you don't want to pay the overhead price of interfaces then simply don't use them. Again there's 3 possibilities here but you only ever harped on 1. And constantly deflected to other topics entirely like how every AAA game is guaranteed to be pristine. There's not even a chance even 1 of them could have faults. Not a single one.
I choose the simplest example to avoid misunderstanding, given how many misunderstandings there are already
say you make a struct that contains generic member + one other member
and you make an array of that struct
suddenly you have the same problem even if it's a "native" array, the generic member of the elements has the be the size of the biggest possible member
Have I run into this before in real life? Yes
The issue you're still not seeing is that you're not even considering other approaches. You posit that it must be either an array of tagged unions of {type;value}, or an array of C style unions. And this is all predicated on your design's implementation details for your game objects in your engine which nobody know anything about. Realistically we don't know if these objects even need to be paired in this way, you're just asserting it as such and with no code examples and no clear requirements or goals, how is anybody supposed to present a counter case.
You keep saying the only way to solve this in a language like Go is to have a slice of interfaces which is just one possibility. The other is to utilize generics the same way you're doing in your existing project. Yet another is to just design the program in a different way if possible that obviates this theoretical constraint you've imposed.
This detail has almost nothing to even do with the overarching topics, which were that Go got by without generics for a decade, and even without them you could make a playable game with it. The fact that you disagree with that premise doesn't preclude the scenario where you make a game in Go with generics or even some other approach that is equally as performant given with respect to differences between the language's compiler/runtime/spec.
I really have no idea what you're arguing that is real and not abstract concepts you've inserted into the argument. There's nothing tangible at all.
I'm arguing for the utility of generic data structures, I don't give a shit about Go, according to you it even has generic data structures so what's the issue there?
Do I need to literally explain everything down to the most minute detail or you'll disagree with me? Do I need to spend a page explaining exactly why interfaces must be over a certain sizes regardless of their implementation, and then spend another page explaining why they're the best solution for my problem?
>I don't give a shit about Go, according to you it even has generic data structures so what's the issue there?
That has been both my point and question to you for nearly the entirety of our discussion. You keep pretending like the interface solution is the only solution and then go on about how they're not sufficient for you specifically in your specific project with your specific design, to which the question arises why are the other solutions not viable, one of which includes using generics. Every time I tell you "that's not the only way to solve the problem" you just go "trust me dude, it really is". So it's even worse when you present them as a solution after refusing to acknowledge them otherwise.
Since we're on page 9 and the thread is concluding. I'll admit my perspective. I suspect you're either trolling, or you're yet another blub programmer who only has 1 worldview.
In either case, I got severely owned by feeding into it.
Go has generic data structures, so clearly there's no problem with Go
If you're writing code where space or performance is important, runtime generics might not be enough, we've been over why. In these cases "use a different approach" is literally copy and pasting code to change the data type, which gets pretty tedious
I think the simplest example is math functions, like do you want to copy and paste math functions 10 times for each number type? It's a pain in the ass
This is why I mentioned seeing the output of the compiler.
A generic math function is probably going to generate a finite set of fixed functions in cases where the calls are few and inferrable at compile time, and if you find that to not be the case, code generation in Go is particularly easy using the standard library and the standard tool `go generate`.
The latter of which might be considered a pain in the ass if you have to write the template yourself (it's no different than any other metaprogram), but lots of generators for Go already exist.
For something like math the standard library likely has you covered anyway.
And I mentioned before that it may be such you can better abstract things to not even require so many type dependent code paths. Without seeing real code nobody can say for certain. As-is, I have no idea what you're using your ints and bytes for, let alone their code paths.
It's just a typedef block. It's equivalent to this
type ints []int
type bytes []byte
type common interface {
count() int
}
)
Go allows this for I think everything except functions. E.g.
var x int
var y int
var (
x int
y int
)
Same for `const`, etc.
>A generic math function is probably going to generate a finite set of fixed functions
If your compiler is generating multiple copies of a data type or a function, guess what, that's not runtime genericsm, that's compile time genericism
And using code generators is cope, that's shit the language is supposed to do for you, but you don't need to defend Go I already told you I'm not saying it's bad
>it may be such you can better abstract things to not even require so many type dependent code paths
This is baby advice
Sometimes the problem just boils down to "I need to do the same function or have the same data structure except using a different type" and that's as simple as it gets
You copy and paste the code, you cope by finding an inferior solution or you use generics
I used languages without generics for a very long time, I konw all about the coping you do to avoid them
>If your compiler is generating multiple copies of a data type or a function, guess what, that's not runtime genericsm, that's compile time genericism
Stating the obvious for some reason. Are you implying it's somehow not sufficient?
>And using code generators is cope
Maybe in languages with bad tooling and syntax.
>This is baby advice
It's good for you. Arrogance is a sign of stagnation in programmers. Thinking you know a solution precludes you from even thinking about alternatives and you've certainly demonstrated that stubbornly today. Be careful with that if you care to.
>Are you implying it's somehow not sufficient?
I've been saying compile time genericism is useful, that's my whole point
But it's an inferior solution, because usually the compiler can't know what can be made static or not, unless the language has some special compliation model where everything is compiled at once
>Arrogance is a sign of stagnation
You're being arrogant telling me I just haven't thought about the problem hard enough
Like if I disagree with you, clearly I must be less experienced. I've been working around not having generics for like 15 years
>Maybe in languages with bad tooling and syntax.
I should clarify that Lispers probably have opinions on this topic too.
I didn't say you were less experienced and even implied the opposite by saying stagnation. Of course you are one minded, stubborn and take offense to it...
You're saying I'm arrogant and stagnant
I'm not, I just know this problem inside and out
I know the workarounds. The fact that workarounds exist doesn't change the fact that it's just fricking better to have generic code sometimes. Sounds like you'd do anything rather than admit that
Poetically ironic as usual. It was at least half nice talking to you. Goodbye.
Bro you've been talking to me this entire thread about things you don't understand and I do while acting like you know better
lol
You don't know how generics are implemented and you don't know what they could possibly be used for
Yet you think you can lecture me on them
Bro you've been talking to me this entire thread about things you don't understand and I do while acting like you know better
Most of the time you were confused by my brief explainations because you don't understand the topic very well
You never considered your world view might be wrong, and there might be a use for this programming feature, all you tried to do was convince me I was wrong, like a religious zealot
You've misinterpreted and misconstrued everything I said. And are continuing to do so.
Whether it was intentional or not, I'm not sure. But I think not considering what you wrote.
>But I think not
I have a confession to make
Oh, so you do think generics are useful? Then what the frick were you arguing about?
I never said they weren't. I said Go didn't need them for over a decade and hardly anyone uses them.
You're the one putting words in my mouth the entire way. You were the one making things up and arguing about it, half of my posts are pointing that out while you just get more frustrated at your own strawman.
Not like this bros.
>I never said they weren't
Then what the frick are you arguing about? I said there was nothing wrong with Go like 50 posts ago. Are you having trouble reading?
I wasn't arguing, you were the one asking me to engage with your posts while I kept saying you're not making sense and going in circles over multiple things you made up. I pointed this out constantly which is why I thought you were trolling.
>you were the one asking me to engage with your posts
Yeah I said that like 100 posts because you turned into a pompous moron as soon as I pointed out you were wrong
Then you tried to convince me I don't need generics for no apparently reason
You pointed out I was "wrong" on an argument you made up.
I wasn't trying to convince you that you don't need generics, you specifically asked how to do something without using generics and I wrote you an example to show you how. Then you said something like "I wasn't expecting my questions to get answered lol".
I pointed out that your example wasn't equivalent and it didn't answer the question
You spent all this time arguing with me about the utility of generics but turns out you don't even disagree
What's the point
The behavior is equivalent, the performance may not be depending on the language. You're argument was that this preclude any other solution somehow which was not my argument in the slightest.
>What's the point
There was no point, you made up an argument and I asked you the same thing because you were simultaneously proposing a solution to the problem while saying one doesn't exist.
>The behavior is equivalent,
its not
What difference does it make if you have the option for either. We're back to square one.
I already answered it ages ago
That's the problem, you don't get what I'm saying
I mean I could be clearer but I'd have to write pages and pages, I'm sick of typing already
The bottom line is this. You can use generics to solve this problem, and you seem to want to, and you can. So you should. Why you refuse to acknowledge this possibility, I don't know.
> I said Go didn't need them for over a decade and hardly anyone uses them.
uses them in Go even now that it has them*
To clarify this is also why I kept saying you're misunderstanding and misconstruing thing. And as usual being ironic. Talking about reading problems now, very funny.
yes, i agree indie games are sometimes badly optimized, this is pretty obvious given that they are often made by people who aren't even programmers.
>This happens in AAA studios all the same.
this part makes absolutely no sense. the only performance-related thing you can criticize AAA games for is the shader compile stutter. and even then, to be fair, this is a mix of modern graphics API being truly braindead and developers not wanting to use ubershaders because they sometimes just can't effort the perf or flexibility loss.
there is very little other software that comes even remotely close to AAA games in terms of how well it is optimized.
classic rust mentality. "you're not supposed to want that"
>effort the
afford the
>programmed well or optimized. Neither of them.
you don't know how a video game works. lmao.
if you did, you would know that people go to insane lengths optimizing the majn rendering/physics/skinning subsystems to make sure all their processing fits in 1/60 of a second (some esports game targetting 140Hz+ these days).
>some people do this therefore everyone does this
No.
Every AAA game does it just to get their games to run
literally every game using unity is a direct benefactor of this fact. the engine is very optimized so that people can do scripting on top of it.
likewise for unreal.
and of course every single custom engine.
go watch a siggraph or gdc talk bro.
>evidence suggest that lots of AAA games don't even function properly, let alone are they programmed well or in some optimized way.
Having bugs is a completely different ballpark to not running well, every program has bugs
>https://go.dev/play/p/DJfxBLy0MfH
>
type (
ints []int
bytes []byte
common interface {
count() int
}
)
what is this construct called? what does it do? I can see it's a sort of list of type definitions and the types in it can be used independently, i don't understand why it's all within one "type" thing
>You failed to make a case for their inclusion in Go
The only advantage they have over interfaces is slightly better performance. That's mostly it, but Go was not exactly meant for extremely high performance so a lot of people simply don't care about generics, including Go's designers it seems.
protip: everytime someone says they need rapid prototyping and iteration they just suck at their job
word, same thing every time someone blabs on and on about needing a repl. they can't think 2 seconds ahead of what they're trying to do so anything that doesn't let them "iterate quickly" (completely subjective) is a failure
you haven't made games so you don't know what you're talking about
i have and i do
Then you'd know about the need to quickly iterate on gameplay to find the fun
whoa dude it's almost like i can tweak things in game as i'm playing with dev tools? crazyyyyyyy
No I mean writing code to create or change gameplay systems
your brain is the bottleneck
Jai release date when?
>Rust flaws thread derailed into a Go interfaces vs generics thread
How the frick did this happen?
I saw someone on page 0 saying something silly and replied without caring about the OP.
anyone with a brain could have told you rust doesn’t work for games. c++ is the way.
also don’t listen to Blow. he has only written 2 games and they are not exactly hard games technically. his language is a vanity project, nothing more
>c++ is the way.
only because there was nothing else 30 years ago. let's see 20 years from now what things are like
IT'S OVER
C & C++ CHADS WON
WANNA DO PURE SYSTEMS SHIT? YOU VILL USE C
WANNA PROGRAM SOME GAMES AND SHIT? YOU VILL USE MODERN C++
YOU NEED SCRIPTING FOR NEWBS? YOU VILL EMBED LUA
YOU DO NOT NEED MORE THAN THAT
VI VON
ITT: Rust trannies on suicide watch
cute and cool trannies program in c/c++
insane trannies program in rust
case closed!
Honestly i thought this thread was about the game rust not the game engine. Was not gonna watch an hour long presentation on either subject.
non-coder here, why not just have an option on rust to disable said borrowchecker?
The guy is a brainlet. The option is to just copy/clone the data
really fun fact: you can't just put your code in unsafe and write things like in C++ in rust.
aliasing is UB in rust whether you're in an unsafe block or not. it has a fundamentally different programming model.
you cannot "plan systems out in advance" when doing gamedev. unless you're like, making a clone or something... you should know this given your experience with unity and unreal.
frame locking is the most robust way to step simulation logic in a game. im not saying it should be used, but it is actually the most robust way.
cloning is not cheap if you're making a video game.
>cloning is not cheap if you're making a video game.
Proof? People write dogshit code that copies tons of data all the time. Games have been written in slow languages, garbage collected languages which do even worse things with memory.
i didn't say it's not feasible, i said it's not cheap. isn't rust supposed to be a fast language? how can you accept it being slower than _equivalent_ C++ code in some cases? sad.
There are cases where equivalent C++ code is slower. Both languages are roughly same speed in practice.
not due to fundamental language limitations.
Yes, exactly due to that.
C++ moves are not destructive, unlike in Rust. That means that shared pointers are always going to have an overhead, while in Rust it is truly zero cost. See the "There is no zero-cost abstractions" talk.
how can you watch that talk and still call rust shared pointers "truly zero cost"?
this is more of a standard library issue anyway. by fundamental language limitation i mean that you just MUST clone the thing to reference the same value from multiple places. c++ has no such limitation, you can do that just fine, it's just memory.
>how can you watch that talk and still call rust shared pointers "truly zero cost"?
Because the cost comes from C++ moves not being destructive. This is not the case in Rust.
>this is more of a standard library issue anyway.
Moves being destructive or not is a language feature, not standard library feature.
>by fundamental language limitation i mean that you just MUST clone the thing to reference the same value from multiple places.
This is not the case in either language.
i dont think shared pointers were even mentioned in the talk, are you talking about unique_ptr?
and yeah, turns out it's a standard library issue as i said!
[[trivial_abi]] is what you use to fix it, but it's an abi break so std implementors dont fix it.
>This is not the case in either language.
it is in rust, you can't alias a thing like that.
i think this is a stupid argument anyway because RAII is misguided.
>i dont think shared pointers were even mentioned in the talk, are you talking about unique_ptr?
You are right. It does apply to both. I just assumed it can't be that bad to also affect unique_ptr but it does make sense.
>and yeah, turns out it's a standard library issue as i said!
Standard library is not the one dictating the kind of moves allowed by the language.
>[[trivial_abi]]
This is not standard, it's from a non standard extension from a certain compiler implementation. It also imposes extra restrictions on how you can use the pointer, which again are not present in Rust.
to repeat, I think RAII is misguided. but anyway,
>Standard library is not the one dictating the kind of moves allowed by the language.
the thesis C++ RAII advocates have is that an optimizing compiler can deal with the moves and have them be as efficient as if they were destructive in perf sensitive code (ideally when the compiler has visibility into all the function implementations and can inline and DCE as it wishes).
>This is not standard
you're right. it isn't, so the language doesn't offer a 100% fool-proof solution for it.
in any case, since it's all just memory and C++ has no concept of "unsafe", you can always get the optimal behavior (but not the optimal code in some cases for compiler backend reasons) without having to use some different "unsafe" dialect of the language like in rust.
>the thesis C++ RAII advocates have is that an optimizing compiler can deal with the moves and have them be as efficient as if they were destructive in perf sensitive code
It doesn't always work as illustrated in the talk.
>you can always get the optimal behavior (but not the optimal code
You can't actually, because destructive moves are simply not possible. It doesn't matter if you can inline asm or whatever to avoid the costs, the problem is that this is a fundamental language limitation that introduces costs that are not needed. C++ can't have efficient RAII. If you want your code using RAII to be zero cost you need to get rig of RAII altogether. This is a language limitation.
>It doesn't always work as illustrated in the talk.
yes, that's why i included the remark that the compiler has to be able to see the function implementation. in some way you can consider that a library issue in the sense that you have separate translation units in the first place. either way, i would argue, i would agree it's much less cut and dry compared to how you just can't alias a thing in rust and have to clone it.
>C++ can't have efficient RAII
assuming there is such a thing as "efficient RAII", C++ does have it in the case where stuff is visible in the same translation unit and maybe with LTO.
imo RAII is never zero cost in any practical terms. having resources owners scattered around in memory is just not a good idea. c++ here shines in that you're not forced to use it unlike in rust where the whole ownership system is centered around it.
>assuming there is such a thing as "efficient RAII",
There is in Rust.
>imo RAII is never zero cost in any practical terms.
unique_ptr should not have any overhead over just using a raw pointer.
you are missing the forest from the trees. we're arguing about how zero-overhead it should be to malloc and free small objects but the reality is that mallocing and freeing small objects is slow no matter how you put it and you should not be doing it in perf sensitive code anyway.
>the reality is that mallocing and freeing small objects is slow no matter how you put it and you should not be doing it in perf sensitive code anyway.
That doesn't justify the extra costs that C++ adds on top.
correct, it doesn't. but you can drop down into a lower-level and manipulate things to get what you want. in rust, mutable aliasing is UB and always will be no matter what you do, code in an unsafe block is expected to respect this.
>in rust, mutable aliasing is UB and always will be no matter what you do
If you use raw pointers it's no longer UB. It's only UB when using references.
i dont think it's feasible to make all of your functions take and operate on pointers in rust... it has this viral property, like const, except much more severe
And it's not feasible to switch to raw pointers every time you want to move a RAII pointer to different scope in C++.
Fortunately if your program is well designed, you won't need aliasing mutable references in Rust. This also enables extra optimizations that are not available in C++, unless you mark them as noalias which no one does since it's like a walking on a minefield.
However, moving smart pointers around is very basic operation that happens all the time.
>you cannot "plan systems out in advance" when doing gamedev
moron alert
nodev alert. you can shill rust here all you want, the reality is that you won't make anything of significance with that attitude.
>frame locking is the most robust way to step simulation logic in a game.
Blighttown ...
In 3D games you can't predict the worst case FPS, not even on consoles, it's no longer 2D sprites.
well yeah, provided that you still have hardcore programmers who believe games should be realtime (idtech!) and who can get you to 30/60/144/... fps locked on min spec
or that, either way it's dumb.
>well yeah, provided that you still have hardcore programmers who believe games should be realtime (idtech!) and who can get you to 30/60/144/... fps locked on min spec
Blighttown suzuki ... Blighttown.
Iterate? On a AAA title? Try to get it right early on, fail, suffer for years with the technical debt ... that's your only option.
works on my dark souls engine
>t. mitsubishi miyazaki
Nice frame locked bullshit you got there suzuki.
Everyone knows that Rust is not good for making games. If you want to make a game, just pick a premade engine.
Rust is a fine choice for game engines though.
If this were true Bevy would already be usable and we would have games coming out using it that look like Unreal/Unity games
Bevy is a young hobbyist, FOSS engine. Unreal and Unity are commercial engines made by large corporations. Comparing them doesn't really tell you anything about the differences between Rust and the languages they were written in (C++/C#)
Now kiss goodbye you two. The universe demands this thread ends.
How about we kiss you instead.