- 70
- 393 358
Tienne_k
Canada
เข้าร่วมเมื่อ 26 พ.ค. 2014
I do stuff. Art, programming, music.
Dialogue | Craven devlog
Hey, this is a devlog for my open world game: Craven.
This month, I implemented triggers, dialogue using the plugin Clyde, stepping up stairs, and a component to facilitate keeping track of story progress using Godot's Expression class.
Next devlog will be on worldbuilding and game feel, so stay tuned for that ;)
👉 Check out Clyde Dialogue: github.com/viniciusgerevini/godot-clyde-dialogue
――――――――――――――――
Music (in order) 🎶
🎵 Tama - Morning dew
th-cam.com/video/NS6Y459y40Yh/w-d-xo.htmlttps://ffm.to/tamamorningdew
✅ Follow Tama Music: youtube.tamamusic.com
🎵 Artificial.Music - Nighttime stroll
✅ Follow Artificial.Music: th-cam.com/channels/C49uNuUk7pY77NoVMlNYDA.html
🎵 The Piano Says - Rosalita
✅ Follow The Piano Says: soundcloud.com/thepianosays
#indiegame #indiedev #godot
This month, I implemented triggers, dialogue using the plugin Clyde, stepping up stairs, and a component to facilitate keeping track of story progress using Godot's Expression class.
Next devlog will be on worldbuilding and game feel, so stay tuned for that ;)
👉 Check out Clyde Dialogue: github.com/viniciusgerevini/godot-clyde-dialogue
――――――――――――――――
Music (in order) 🎶
🎵 Tama - Morning dew
th-cam.com/video/NS6Y459y40Yh/w-d-xo.htmlttps://ffm.to/tamamorningdew
✅ Follow Tama Music: youtube.tamamusic.com
🎵 Artificial.Music - Nighttime stroll
✅ Follow Artificial.Music: th-cam.com/channels/C49uNuUk7pY77NoVMlNYDA.html
🎵 The Piano Says - Rosalita
✅ Follow The Piano Says: soundcloud.com/thepianosays
#indiegame #indiedev #godot
มุมมอง: 164
วีดีโอ
Clouds and hands | Craven devlog
มุมมอง 1.5Kหลายเดือนก่อน
This is a quick update video on my open world game Craven to show I'm still alive. This month, I've worked on the lore and design document, which are things I prefer not to spoil for the moment being (and also because I haven't fully fleshed them out yet XP). In this video, I talk about some of the few tangible things I worked on, namely clouds, music, and trying to get object scattering workin...
Craven
มุมมอง 1.1K2 หลายเดือนก่อน
This is a short status update video on my open-world game: Craven. Craven is not new, I've worked on and off on it for the past few years, starting new idea after idea only to scrap them months later. After 3 iterations, and with Tank In Sands released and off my shoulders, I got an urge to work on Craven again, this time with more experience and (hopefully more) wisdom. In this prototype, I wa...
What are StringNames, and are they worth it?
มุมมอง 4K3 หลายเดือนก่อน
What are StringNames in the Godot game engine? What do they do? Should you use them? While it certainly wouldn't hurt to use StringNames *where applicable*, in the end, they don't make as big of a difference as you may think. 📧 If you have any questions, suggestions, don't forget to join our Discord server: discord.gg/VTvG7ZQNdQ ―――――――――――――――― Music 🎶 🎵 Jonny Easton - Purpose "Jonny Easton - ...
I made a file explorer... again...
มุมมอง 34K4 หลายเดือนก่อน
I made a file explorer... again... This time, it's hopefully actually something good that helps people. Unlike my previous version, I decided to go all in on a tagging system instead of a simple file browser like other apps. 💾Get KFiles: misoshiru-studio.itch.io/kfiles Repo: github.com/WhoStoleMyCoffee/kfiles 📧 If you have any questions, suggestions, don't forget to join our Discord server: dis...
Gotta catch up
มุมมอง 3246 หลายเดือนก่อน
Hi A while ago, I decided to learn how to make music on the side. Hope somebody likes it :) You can probably tell I learned you can 'steal' chords from other scales lol For those interested: Key: E major Bpm: 70 License: Just credit me bro 💪 Software: Reaper Art by me #pianomusic
I finished my first game, here's what I learned
มุมมอง 2.9K6 หลายเดือนก่อน
I finished my first game, Tank In Sands, a 2D survival base building game where you command a group of dinosaurs on a deserted planet. Here are the things I've learned in this 2 years development journey. Key takeaways: - Don't take too many breaks. If you do, just be sure not to let yourself forget about your project - Clarify your game's identity via a design document (doesn't have to be elab...
Memories that won't come back
มุมมอง 2147 หลายเดือนก่อน
Made this randomly and wanted to share it. I don't know much music theory, but I feel like I'm finally reaching that point where I can somewhat be satisfied with what I make. Hope somebody likes it :) For those interested: Key: G# major Bpm: 72 Lisence: Just credit me bro 💪 Software: Reaper #pianomusic
"Do I need maths for gamedev?"
มุมมอง 2K7 หลายเดือนก่อน
"You need maths for making games" "But I'm bad at maths, I HATE maths, so I might as well not even try" This is somehting I believed in before I started programming. That math was a prerequisite to programming; that if I wanted to make cool games like the people I saw online, I had to crunch numbers in a textbook; and that there's just no way around that. And you might have a similar belief... ...
How to make your gamedev experience 2x better
มุมมอง 3.6K8 หลายเดือนก่อน
In this video, I talk about creating simple, temporary tools for developing your project, akin to developer consoles. This is something I wish I knew so much when I first started gamedev, so I hope this has helped you. When I got into Godot, I somewhat knew you could make and download plugins, but it didn't quite click that I could make tools *for myself*, *for the specific project I'm working ...
1K milestone. Thank you.
มุมมอง 1188 หลายเดือนก่อน
We hit 1K subs, thank you so much!! I'm sorry if I sound awkward in the video, I wasn't fully awake when I recorded lol. I assure you that I'm freaking out on the inside. ―――――――――――――――― 🎵 Music: Purrple Cat - Stranded 👉 Follow Purple Cat: th-cam.com/users/purrplecatmusic
You're not using Godot to its potential
มุมมอง 105K8 หลายเดือนก่อน
In this video, I talk about making component-like structures in Godot, which I feel is often overlooked. Yes, GDScript is object oriented, but we have such a powerful tool (nodes) at our hands, we might as well use it to its fullest! Using nodes as components is so much more flexible than rigid OOP inheritance trees. Of course, if you over-do it, you'll just be shooting yourself in the foot; id...
Gone with the tides
มุมมอง 4579 หลายเดือนก่อน
LISENCE: Just credit me bro 💪 For those interested: Key: Emaj Bpm: 70 Tienne_k - Semblance of an emotion #chillvibes #calmmusic
Topdown 2D grass in Godot 4 (with YSort)
มุมมอง 4.9K9 หลายเดือนก่อน
In this video, I showcase a top-down 2D grass shader for Godot 4 There are plenty of tutorials on how to make GPU instanced grass in 3D, but not in top-down 2D, let alone with YSort. YSort is necessary because I want objects to be able to be covered by grass, and interact with it just like their 3D counterparts. Some things I have tried: - MultiMeshInstaces - They don't work with YSort - 2D nod...
Norman, Devin, and the road in the middle of nowhere
มุมมอง 1.3K11 หลายเดือนก่อน
Norman, Devin, and the road in the middle of nowhere
'Tutorial hell' and the mindset of learning
มุมมอง 1Kปีที่แล้ว
'Tutorial hell' and the mindset of learning
I didn't like Windows file explorer, so I MADE MY OWN
มุมมอง 538ปีที่แล้ว
I didn't like Windows file explorer, so I MADE MY OWN
Tank In Sands Gameplay Teaser (Indie Game)
มุมมอง 702ปีที่แล้ว
Tank In Sands Gameplay Teaser (Indie Game)
As a programmer of 15 years, the many many people in these comments who are complaining about the creator’s conflation of Inheritance and OOP need to freaking relax. Is this technically incorrect? Sure, okay. Does the average person who hasn’t seen this node composition style of game dev need to know that? Not at all. What’s more, y’all are conflating OOP composition and this node-based approach, which is arguably worse because it muddies the waters. OOP composition via interface extension isn’t going to solve a damn thing here, and would likely make the situation worse (is Java a better language for allowing diamond composition patterns? Maybe in theory, but in practice, no). If this helps people make their game in a more maintainable way, who the hell cares about the terminology?
You should draw a front and back facing sprites for the player character its so weird seeing them move upwards while looking to the right/left
As for music. 2 doesnt sound open just because you say it does. Quite personally 1 has a way better, more natural and lonely sound that the last human should hear. Another commenter also said the same. Dont scrap the second one, but id say the first onr hit the spot perfectly. Looling forward to seeing more. (If u want a guitar hmu)
Awesome video! Your game looks super beautiful. I really like the art style of your game. Also the game idea sounds very fun. The music is spot on and it does give that vast/openess feel to the game. Looking forward to your next devlog. Keep it up! :)
I respect the spitfire labs plugin, that felt feel is really sweet for this style
Nice devlog! The game looks good , nice work! Can't wait for the next devlog already :)) I'm really curious how did you get the pixelated effect in Godot, i've been searching for a while a tutorial but it seems i can't find the right one :D I'll really appreciate it if you could help me out :))
wowowow!
You know I think you're really onto a winner here with the stylised art and the theme of the music. If gives very cosy vibes. I love how simple it is but still so visually appealing. It's all so cohesive. 99% of indie openworld games I write off as a disaster waiting to happen but this one jumps out as having real potential. I hope you prototype out some areas. Would love to see what forests and caves etc would look like in this art style.
Damn I remember this music, caught me off guard.
r.e. the soundtracks, i think i prefer the 1st track with its minimalism for providing that open-ness vibe. For me the variety of sounds is not as important as the tempo of the melody. You also had some white noise under the 1st one giving the impression of wind, so maybe thats what im picking up on. Minimal melody (esp piano) + ambient sound is certainly a good combo for that wide open melacholy feeling. 2. gives me more of a arrival in basecamp vibe, Majula/Firelink shrine style.
Cool I realy like this project
This is composition, not ECS. ECS is a data-oriented paradigm where all components are stored in homogeneous arrays which are processed separately, and the entity is simply an ID that can be used to locate the corresponding components within those arrays. ECS works this way because processing contiguous arrays of homogeneous items avoids CPU cache misses and results in higher performance. Godot does not work this way. It has an object-oriented class hierarchy of polymorphic node types which relies on dynamic dispatch. The trees of nodes are traversed to propagate event notifications which are then subsequently processed in order of traversal. This results in very poor cache coherency because there is never any guarantee that two adjacent events will be affecting nodes that are actually adjacent in memory, not to mention that every virtual function call very likely introduces another cache miss. That being said, composition in Godot is an extremely flexible way to build games and fast enough for the vast majority of projects
I am tired of people blaming OOP for these issues. It's the patterns you use, OOP is just a language paradigm. C is procedural, C++ is Object Oriented, Lisp is Functional. I don't see anyone complaining about "Procedural" being the blame for bad software written
I'm also starting to believe that these videos are a youtube grift, and not actually enlightening. It's just the theme of the year. Next year will be some other repeated concept talked about because it is easy to repeat what someone else said and make a video with your own flavor of examples.
As many others, this video was recommended to me, too. I won't go into the specifics as to why the benchmark is incorrect, but I just wanted to add that building microbenchmarks is deceptively complex especially since you need to have a pretty good understanding of everything that's going on, from how the cache in your CPU works to the features of GDScript. From your pinned comment, I don't think you understand how terribly imprecise your approach to "benchmarks" is. If you really want to reach that "definitive conclusion", just look for another benchmark online or just ask someone with a CS background to help you out. All that being said, you explained it fairly well and the video's presentation is great
If it had potential...
This is probably the best example of OOP vs ECS, amazing video
Rooting for you buddy!!
Nice video! A baba is you type game was a great way to broach the topic. While I love the components over inheritance approach godot promotes, I do sometimes find myself wishing godot had other OOP features like generics and multiple inheritance.
This is why I think in programming in general without double inheritance, when deciding what to inherit or compose you focus on what methods exist in both but differ including initializers but then you run into not all programming languages allowing initilizers to be inherited. Multi inheritance makes inheritance as a concept mutch more powerful.
In your own words, what is fun or compelling about the game?
Good luck man
You got it brother keep goin!
the art looks nice, plz complete the game so we can try it
It’s an Enderman with antlers!
I'm loving the style of this latest iteration, hope you continue down this path!
I think you need a game design document finished before working more on this. The game(s) shown feel more like art demos - where is the gameplay?
Evolve dis
Cool to see all the iterations. And the roomate at the end 😂
One thing I forgot to mention: In this prototype, I was testing out the visual style, figuring out how to get that "3D pixel art" look. In terms of progress towards the game, I'm currently in the worldbuilding phase. From here, I want to keep developing Craven and keep you guys updated with devlogs and insights.
so like... why not just check when the player collides with something and it is in group pushable, push it? is the idea here... to simply add extendability? for example objects can push other ones etc...
good :)
cool, thanks for sharing :)
WARNING For those making a 2.5d game...STAY AWAY FROM GODOT. Alpha sorting STILL hasn't been fixed, if you want to use animated sprites in 3d enjoy MANUALLY (through code) animating frames on a meshinstance3d as that is the only way to get depth sorting to work correctly...this literally turns a 2 minute action into hours of work depending on the amount of sprite animations. I found out half way through development the devs have no plans to address this.
Actually a very good video. It's perfect for my ADHD brain and it show and explains everything in simple words. Nice!
Glad you liked it :) Thanks for watching!
in c# they don't have any functionality make them worthless there
new opportunity thanks for the knowledge
Feels like using enums, except the way enums work feels faster. If you want a constant ID that's fast to compare, enums just pair keys to numbers, giving you the same number-to-number comparison speed you want... Except there's no memory lookup needed, because under the hood, the enum keys already are the numbers. Now I'm wondering if GDscript has enums, because with Python, you need a library and I don't like how messy it gets... Classes tend to do the trick for me though. Thoughts?
gdscript does have enums
@@freenull oh cool, I'll have to look those up sometime :)
Enums are better anyway
I would redo the test with a switch staetment rather then compring a ransom steing to another random string. Because they couls stop on the first letter which would be similar to comparing numbers. If you look at your strings only two start with the same letter so it will be pretty much the same as steing names.
I think your conclusion about string name initialization is wrong as this would have happened at compile time. You should have tested it against an enumeration. As this would be the ideal comparison, as it would provide an extra feature over enums by printing their named values in human readable form.
**CORRECTION** As many of you have pointed out, my benchmarks were flawed. So, I rerun them with the suggested improvements: 1. Iterate over some pre-computed Arrays instead of picking a random element on the fly. This removes the variable of generating random numbers, which likely have been polluting the results. It also enables us to ensure that circumstances are the exact same by using the same arrays for both tests. 2. Don't use the same Strings. Strings in Godot are Reference-counted (which I didn't know, thanks for pointing out! :0). In the new benchmarks, I made sure not to compare the same String references against themselves by doing `string.reverse().reverse()` on them. This creates a copy of the String that's not the same Reference. Any other operation should work fine too, this was just the first one that came to mind. 3. Use strings that are more similar. This one's completely on me. I even talked about how StringNames should be faster for more similar ones in the start. After these changes, the results were: Mostly the same. StringNames were consistently hovering around 1s faster than regular Strings, over
One second is kind of a lot
Godot uses string hashing to speed up operations, including string equality comparisons. That's probably why the difference is so small. I think if the number of strings being compared is much larger, the hashing system won't be as efficient. Another idea is to create new rows before each comparison. In general, somehow overload the hashing system in Godot. Looks like Godot was written by too good programmers, for our primitive tests. 😅
This is an interesting video, and hats off to you for testing your hypothesis! But, if you don't mind some constructive criticism, I think focusing on speed benchmarks to compare Strings and StringNames kind of misses the forest for the trees. The main benefit of StringNames is not performance, it's type safety. StringNames provide a finite amount of values that a property or parameter can be set to. For instance, Input.is_action_just_pressed, will only accept valid arguments like "ui_accept" or custom actions like "jump". It won't accept "ui_accep" or "jum" because those strings do not match any StringName. Any errors like this will be caught at buildtime rather than runtime. If you're using strings, typos can become runtime bugs that will take development cycles to fix. With StringNames, typos will not compile so you will instantly know if you've passed an invalid value. I think you're also right that assigning values to a StringName property many times per second is impacting performance. When benchmarking, it's a good idea to separate code that is part of the "cold path" and "hot path". By their nature, StringNames are not meant to be created at runtime, so it would be much less common to write to a StringName value than read from it. It might be worth testing your hypothesis to see if frequent StringName assignment is what's causing latency. Very interesting video that's spawned a good conversation on an easily overlooked feature of GDScript!
I thought the point of StringNames is to save up on memory consumption when you're declaring the same strings in a loop, for example, or across the whole codebase.
Are there any uses for stringnames that aren't just for performance?
I think they're main use is generally unrelated to performance. They serve a similar purpose to Enums in that they provide a finite set of values that a variable/ function parameter can have. The best example is the Input singleton class. If you're used "Input.is_action_just_pressed", you've used StringNames and you may have caught some of the benefits: you can't accidentally pass an invalid action like "ui_accep" without it being caught at buildtime rather than runtime and you are provided with a drop down of available actions when passing an argument to the function. I think the easiest way to understand the benefits of StringNames is to think of them as type safe strings, a string value that can determine, at buildtime, the difference between "ui_accept" and "ui_accep".
@@VoonNBuddies That's pretty cool, I'll be trying them out in the future.
LISP has a different name for these types of strings: symbols. It also has another type of string called keys. In C++, most string types (There are many, since STL wasn't made when C++ was first released, so many libraries have their own.) have a "small string optimization", which is better than symbols because it can come from something other than the static area, such as user input, and the comparison may even be as fast (SIMD registers on the most modern CPUs are 512 bits wide, so 1 cycle compares can compare 64 bytes at a time, but there is a tag check, mask generation, and an AND mask, which take a few more cycles). GDScript could easily adopt these methods.
Someone should make a video about placeholder instances c:
Your benchmark code might be the cause of the statistically equal results. Pretty sure that picking a random item will always be a lot slower than the string comparison, thus making the time spent on the comparisons a small slice of the pie and why the results are so similar. A better way to check the difference would be to pre compute another array with random items and iterate over it, searching the first array for the items in the second. If you only start measuring the time after both arrays are created, your results should have a more significant difference
I would agree but since both string and string name pick randomly, both tests will have the same overhead. Assuming the type doesn't matter for arrary pick random. Which we can presume as we are handing pointers around at the end of the day.
I saw them before but never used them nor read anything about them in the docs. So basically, they are not worth it.
If you've used the Input class in Godot, you definitely have used StringNames before ;)
@@VoonNBuddies yes, but not as user defined variables
@RebelliousX have you used custom actions? Those are (kinda) user defined variables!
If I remember correctly, Java has something like that. When looking at Strings and try to compare them, they don't actually compare the content, but instead just the address. Something like that.
Yes, it's called "interning". When you call "intern()" on the string. But Java also does interning at appropriate times, so it's quite an advanced use. And most of the time, enums are what you're looking for.
This video was recommended to me and I have no experience with Godot. However, I strongly believe your benchmark is bad in that you're not measuring what you think you're measuring (or anything useful at all). Here are my reasons for believing this: 1. The data you used to benchmark is highly favorable for String. All your strings start with a different character, so by the string comparison algorithm you explained, it is to expected that comparing a single byte is fast. This defeats the point of using StringNames in the first place. 2. Character-by-character string comparison doesn't work like you explained. What you explained is how C-style strings would be compared, but all modern language store the length of the string along-side its raw character data. This is obviously useful for comparison, because strings with different lengths must be unequal. In your dataset, there are only 2 strings with the same length. Given that you pick a single random string to compare against, in most runs of your benchmark, String == String comparisons will be done after simply comparing the lengths. 3. Godot Strings are reference counted (I looked up the docs). Since you're not doing any string manipulation in your benchmark, this means that equal strings will point to the same memory holding the character data. This can be used to fast-path equal strings by simply comparing the memory address of the character data, just like what StringNames are doing. 4. And when we do fall back to actually having to do char-by-char comparisons (condition: equal length and different addresses), then it would be much faster than in your benchmark. 1M iters for standard string comp took 340ms or 340ns/it in your benchmark. 340ns is laughably slow for a single string comparison. Modern string algorithms are highly optimized and utilize methods like SIMD for optimal performance. Given the length of your strings, I would expect string comparisons to be no slower than 10ns given that all your strings are in cache. 5. The same thing goes for StringNames too. If your explanation of StringNames is correct (and it seems to be comparing to Godot docs), then comparing them is literally a single instruction, comparing a single word-sized number. On modern hardware, this should take less than 1ns, because this is the kind of stuff modern hardware is built for. But according to your benchmark, it takes around 350ns. It just doesn't make sense. But I repeat: I have never worked with Godot. I'm simply pointing out the flaws with your benchmark and that the times you measured make no sense for modern algorithms and hardware. My best guess is that you benchmark your code in a sort of debug mode (so without optimizations, which makes any perf comparison meaningless), that you are mostly benchmarking `pick_random` (maybe its RNG is slow? idk), or both. However, I can confidently say that your benchmark is *not* measuring the performance of string comparisons.
Came here to say the same thing. Since you were using strings of different lengths, the time to compare strings would have been nearly identical since it would just need to compare the lengths and find that they were different. This would result in nearly identical times for String and StringName comparisons. A better test would be to test on strings of all the same length. For short strings, the difference is negligible. But for strings that are thousands of characters long, I could see it making a difference. But at that point, what are you doing that you need to compare strings of that length? Ultimately, you're not going to see a noticeable performance difference using Strings vs StringNames. But StringNames should still be preferred over Strings in contexts where comparison is the primary use. Particularly when using them as Keys in a Dictionary! Or anything for identification really. Otherwise, yeah, what he said...