Minetest logo

IRC log for #minetest-dev, 2012-08-12

| Channels | #minetest-dev index | Today | | Google Search | Plaintext

All times shown according to UTC.

Time Nick Message
01:15 hmmmm celeron55:  what is 'if(!dst_can_put_count != -1){'  supposed to do in inventorymanager.cpp:376?
04:20 Bad_Command joined #minetest-dev
04:20 Bad_Command joined #minetest-dev
06:26 sfan5_ joined #minetest-dev
06:30 celeron55 hmmmm: ehm... that looks wrong
06:30 hmmmm you have an extra ! in there
06:30 hmmmm and did you really mean for it to be initialized to 0xffff?
06:32 hmmmm wait actually, while you're here, i need to ask you a few style questions:
06:32 hmmmm i've began dividing up the_game() into several, sensibly-sized subroutines but it requires making some of the variables that were local to be global - i noticed you vary quite a bit between prefixing globals with g_ and not
06:33 hmmmm what would you want them to be?
06:33 celeron55 g_; but i don't think i'll accept a version of game.cpp made with globals
06:34 hmmmm it's nonsensical to believe that you'll have multiple instances of a client
06:34 celeron55 also can you point to a global variable that does not have g_?
06:34 celeron55 i don't remember any of such
06:36 celeron55 hmmmm: yes but re-initializing a game is way more robust if the state is stored in a class; now the state is stored in a function, which is handy too
06:36 hmmmm ah found it
06:37 hmmmm main.cpp, main_settings and main_profiler
06:37 hmmmm there might be others, those are just two i've found
06:37 celeron55 they are not exposed anywhere else than the single source file
06:37 celeron55 thus g_ doesn't really matter
06:37 hmmmm so more accurately, g_ is for a global ment to be exposed via a header
06:38 hmmmm well, all globals that are actually global are exposed through a header
06:38 hmmmm so that's a moot point
06:38 hmmmm you switch between if(){ and if()\n{
06:38 celeron55 ehm... well, kind of; if you use that definition, then "local globals" are "static variables"
06:38 hmmmm what's with that?  what should i follow?
06:40 celeron55 i nowadays use if()\n{ when there is much stuff in the block so that \n doesn't cause much overhead in number of lines, or if the condition is so large it makes it much cleaner
06:41 hmmmm there are many cases where if()\n{ } is encasing a single-line body
06:41 hmmmm i find that it bloats the code
06:41 celeron55 where?
06:42 hmmmm lots of stuff in the_game()
06:42 hmmmm if(server != NULL)
06:42 hmmmm {
06:42 hmmmm /commented out code here
06:42 hmmmm sever->step(dtime);
06:42 hmmmm }
06:42 hmmmm another blank line here
06:42 hmmmm another multiline comment here
06:43 hmmmm i really don't mean to be harsh
06:45 celeron55 i don't think especially that part matters at all, as it is one of the things having the fewest lines in there yet it does like most of the stuff; but obviously they are so because there has been other code in there
06:45 hmmmm i don't think there needs to be as many comments around, especially after they've been subdivided into smaller functions - instead of \n/*\n\tProfiler\n*/<code here>   it could be something like profiler = profiler_init(); or something, which will be quite self-documenting
06:45 hmmmm eh, it's more about consistency
06:45 hmmmm if there's a style thing you don't like, you'll just change it to your liking anyway, right?
06:46 celeron55 but yes, nowadays i use more like "/* Profiler */" for topic-like comments and "// rtfm" for some explanations
06:46 hmmmm i want to write code so that you won't have to go through all of it and make a million changes before you merge, but at the same time it's good to not be anal about the style matching perfectly (perhaps) or maybe if the style were easier to immitate if it had more consistency (preferred)
06:46 celeron55 you can get rid of the /*\none-line\n*/ stuff
06:47 celeron55 (using that way)
06:47 hmmmm also when do you decide to make a new code block without a control structure?  those sorts of things feel misleading and add more indentation than is necessary
06:47 hmmmm if this were a C90 source i'd be more understanding, but it's not
06:47 celeron55 i'm just extremely lazy reworking coding style; i don't like commits that don't actually change anything
06:48 hmmmm well
06:48 hmmmm there's a bug in the_game() somewhere that i need to fix, but before i can fix that, it needs to get more managable
06:48 celeron55 i add a code block when i expect to have stuff that i don't want to have a larger scope for
06:51 hmmmm are you aware that your keyboard input handling code can only handle one key per frame?
06:52 celeron55 no
06:52 hmmmm if you removed the 'elses' from those 'else ifs' in that huge chain, it'd fix that
06:52 celeron55 apparently it is so :-D
06:52 celeron55 obviously yes
06:53 hmmmm oh i also wanted to ask you, the first thing that jumped out at me today:  what's the point of the filecache?
06:53 celeron55 what filecache
06:53 hmmmm filecache.cpp
06:54 hmmmm it's a directory with a bunch of files with the SHA1 of their contents, and it's presumably there to speed things up by not having to fetch them the 'hard' way ... ?
06:54 celeron55 it's used in managing the mod-defined media files that the server sends to the client
06:54 hmmmm oh
06:54 hmmmm i thought the client was the one that handled those
06:54 celeron55 which should be kind of guessable
06:54 hmmmm i didn't realize the server sent textures and sounds*
06:55 celeron55 you can play on a server without having any "game" and any mods installed on the client
06:56 hmmmm that's pretty neat..
06:57 celeron55 anyway, you can "fix" the scopes that are not really needed if you want to
06:57 hmmmm what is farmesh?  can the end user use it in any way?
06:57 sfan5 yes
06:57 celeron55 it's an experimental way of drawing a very guessy landscape to very far
06:57 sfan5 enable_farmesh = 1 in the config file
06:58 hmmmm ahhhhh
06:58 hmmmm it's not enabled by default
06:58 celeron55 it does not really work in the general case, and it is horribly unoptimized, and it doesn't even look good... except at night sometimes
06:59 hmmmm oh yeah
07:00 hmmmm i want to have a 'generating map' screen like in Minecraft - totally optional, of course.  a user-specified number of blocks in each direction is pregenerated around player's origin upon making a new map
07:00 hmmmm the problem is that when you get dumped into a new map, then it starts generating the map.  you don't really know where to explore first because nothing exists yet
07:01 hmmmm unless you have a really fast computer and generating terrain is fast
07:02 celeron55 that is quite nontrivial
07:03 celeron55 let's not thing about it now
07:03 celeron55 think*
07:03 hmmmm i know... maybe you can hide the game from drawing and instead have a loading screen while the game is running and not accepting input (but the player sits there just letting terrain generate)
07:04 hmmmm I saw you moved some of the mapgen back into the engine
07:05 celeron55 eh?
07:05 celeron55 i haven't moved any mapgen code from anywhere to anywhere in a LONG time
07:05 hmmmm no?
07:05 hmmmm i could've sworn you had more than just ore and papayrus being spawned in lua
07:05 hmmmm maybe i'm confusing it with something else
07:07 celeron55 anyway - the original problem was splitting game.cpp, and my opinion still is that the game state should be stored in a deletable structure; if not the stack as in a function, then most likely a class because this is C++
07:08 hmmmm no, you made a good point and i agree, what will be globals should probably be instance variables
07:08 celeron55 yes, more specificially an instance of a class 8)
07:09 hmmmm so like, what, class GameState?
07:09 hmmmm GameInstance
07:09 hmmmm TheGame
07:11 celeron55 i guess it can be just Game
07:12 hmmmm ok
07:12 celeron55 that is not used and is not likely to be used for anything else anyway
07:13 hmmmm another reason why the_game ought to go on a diet is because i suspect it seriously trashes the icache
07:14 celeron55 why wouldn't something else doing the same things do that?
07:15 celeron55 isn't there a tool in valgrind for that?
07:15 hmmmm because look at how big it is.. all the actual rendering code is probably very compact since it's SIMDy sort of stuff
07:15 hmmmm i dunno
07:15 celeron55 cachegrind it is called, i see
07:15 hmmmm have you ever done any profiling?
07:16 hmmmm i mean hardcore profiling
07:16 hmmmm slash optimizing
07:16 celeron55 depends on what you call hardcore
07:17 hmmmm like sat down with a piece of code for hours and made it as fast as possible
07:18 hmmmm probably not possible at the level of abstraction you're working with though.. your code probably spends something like 80% of the time pointer-chasing
07:18 celeron55 that doesn't sound too useful to me, but some for some things not a small amount of time has been used for optimization
07:19 celeron55 which does fullfill your definition
07:19 hmmmm i tend to do it when i'm bored
07:19 celeron55 -some
07:20 hmmmm also unrelated, but when you have do { } while(0);  for the purpose of using break;, don't you think that's a sign it's time for a separate function?
07:20 * VanessaE wanders in
07:20 celeron55 if the block of code isn't needed anywhere else, no i don't
07:20 hmmmm =/
07:20 hmmmm that kind of attitude leads to the 2000 LoC monsters
07:23 celeron55 well not exactly
07:23 celeron55 the problem with those things in game.cpp is that other functions can't directly access the local variables of the_game()
07:23 celeron55 if you put those in a class, you'll have easy time putting them in functions
07:24 celeron55 which in some cases just obfuscates code because you don't know what instance variables are used in whatever method call
07:24 celeron55 but anyway
07:25 hmmmm classification is good
07:26 hmmmm if that big bunch of instance variables is subdivided into even smaller subclasses, that'll help performance too
07:27 hmmmm because your actual structure in memory for that class will exist longer in the cache because it's smaller
07:28 celeron55 the only reason that can use cache more efficiently is that if the class mainly uses it's own instance variables, which are at the same place in memory, rather than the_game() using a few of it's huge number of variables from a larger memory footprint
07:30 celeron55 there isn't very much of persistent variables in the_game though, probably like 1kB
07:30 celeron55 like, on the stack
07:30 hmmmm yeah, true.. still kind of big though
07:30 hmmmm scary to say the least
07:30 hmmmm heh, what's up with the for (;;) { if (device->run() == false || kill == true) break; ?
07:31 hmmmm i'll fix that...
07:33 hmmmm / Event manager     EventManager eventmgr;         <---- i know that's definitely an event manager.
07:34 hmmmm haha, i'll shut up about this and just do it
07:34 hmmmm but tomorrow because it's 3:30am
07:34 celeron55 those kinds of comments are like topics
07:34 celeron55 they separate code into meaningful pieces
07:35 hmmmm they were not /**/
07:35 hmmmm they should be though, no?
07:35 celeron55 as you can see, there are many managers in there, each taking VERY different amounts of code to create
07:35 celeron55 well yes, they could
07:48 saschaheylik joined #minetest-dev
07:57 celeron55 hmmmm: oh by the way
07:58 celeron55 hmmmm: if you want to improve performance CPU-wise, there is one part of whole Minetest that is a horrible CPU hog for no good reason
07:58 hmmmm ?
07:58 celeron55 hmmmm: it is the selection of map data to be sent from the server to the clients
07:58 hmmmm i'll take a look
07:59 celeron55 i don't know how horrible it exactly is, but it's... ehm... i don't even want to look at it
08:00 celeron55 here is some related work https://github.com/DavidMikeSimon/minetest/commits/client_requests_blocks
08:00 VanessaE I was about to ask about that.
08:01 celeron55 i don't know how much in a workable state that is; but at least he removed multiple important parts of the code while doing it
08:01 celeron55 (which need to be put back in)
08:03 celeron55 of course moving the selection from the server to the client instead of just fixing the existing way is completely overkill, but it might be better otherwise
08:03 celeron55 not sure
08:32 saschaheylik celeron55: you mean blocks being sent that are actually way too far away to matter?
08:32 celeron55 no
08:32 saschaheylik well they are
08:32 celeron55 depends on your render distance
08:33 saschaheylik there are chunks being loaded first that wont remotely be visible
08:33 celeron55 but the calculation of what to send wastes CPU
08:34 saschaheylik i think it should place highest priority on the chunks immediately next to the player and on those that are visible
08:34 saschaheylik and then continue loading those further away
08:34 celeron55 it does
08:34 saschaheylik when i saw it some of the furthest were being loaded first
08:36 Calinou joined #minetest-dev
08:37 VanessaE I have noticed an oddity in the loading of chunks, but I don't know how to classify it
08:37 celeron55 in some situations that might happen, for example if the map generator has already generated them but hasn't yet generated a closer one, or if you have moved and the system hasn't yet gotten to check what now is closest to you
08:38 celeron55 generating or loading from disk, actually
08:38 VanessaE celeron55: indeed I've seen something like that:  sometimes I can see chunks loaded that depict part of the inside of a distant structure *before* the outside has been loaded.
08:40 celeron55 i don't think it can ever be perfect because it is such a dynamic system, but i guess it could be improved from what it is now
08:41 celeron55 it does work and doesn't crash, which tends to suffice, though
08:42 VanessaE well for example, on redcrab.sueret.net:30401, there is a "lava pyramid".  If the mapgen has to reload the area, sometimes I can see the trees and other objects inside the pyramid before the wall between them and me has been loaded (IOW, more data is being received than I should need at that point)
08:43 celeron55 anyway, it should be rewritten because it is badly designed and then we will have completely different glitches
08:45 celeron55 saschaheylik: as you can see, there is pretty much an infinite number of things to work on even if nothing actually new is made 8)
08:45 celeron55 (which hopefully doesn't surprise you)
09:04 saschaheylik yeah sure
09:05 saschaheylik it would be easier if we had more people
09:06 saschaheylik maybe some "advertising" on game dev boards or whatever couldn't hurt
09:09 celeron55 it will hurt more than help unless there is a clear plan AND and existing framework on which people can code
09:10 saschaheylik right, plan first. what do you mean by framework on which people can code?
09:10 saschaheylik there is code. i can code on code.
09:11 celeron55 it's hard to simultaneously code on the same code unless the code on which you're coding is designed to accomodate that
09:12 celeron55 basically, everybody needs to be working on a different module-kind of a thing
09:13 saschaheylik so how would we go about making it more "contributable" ?
09:13 saschaheylik "making everything a module-kind of thing" is rather vague
09:14 celeron55 it is intended to be vague
09:14 saschaheylik but i can't act on vague
09:15 saschaheylik do you have something like an example of the desired outcome?
09:15 celeron55 the answer completely depends on what you would want the contributors to do
09:15 saschaheylik what is there contributors are not doing
09:16 saschaheylik well we could avoid the problem by being organized about who is working on what and when
09:16 saschaheylik redundancy isnt very useful anyways
09:18 celeron55 alternating the person who actively codes and having others think and plan is sometimes a good way of doing things, but it requires people who already are quite familiar with the codebase
09:18 celeron55 i have liked working with a single other person on minetest like that
09:19 saschaheylik i can imagine.
09:19 saschaheylik we could  surely split the "team" in groups and pairs
09:20 celeron55 but really, adding more people does not mean more progress
09:20 saschaheylik depends on what they are doing
09:20 celeron55 unless they can work 99% independently of each other
09:20 saschaheylik if they try to all work with all others at the same time that wont work
09:20 saschaheylik but if we split them in teams and assign tasks
09:20 celeron55 which we are not going to achieve, EXCEPT in one thing: if they just add content by using the Lua interface
09:21 celeron55 it has been designed exactly for that, people adding stuff independently
09:21 celeron55 and it does work for that
09:21 saschaheylik of course there has to be some planning as to what the particular "tasks" are
09:22 celeron55 for all this, there needs to be a goal, and for making the goal, we need to know beforehand how much resources we are going to have
09:23 celeron55 in addition to actually having a proper idea and stuff
09:23 saschaheylik we can't establish a better organized and scalable way of working with each other without knowing what we are going to work on?
09:23 saschaheylik i disagree
09:24 celeron55 well yes we can, i guess - but it will be kind of only "on paper" until there is a goal
09:24 celeron55 and people aren't likely to come in without a clue of a goal
09:26 celeron55 also, creating a goal with a large random group of people is not a good idea; unless they are extraordinarily creative people, only something very generic will come out of it, because it just averages everybody's opinions
09:26 celeron55 it can be good for utility software, but not for a game
09:27 saschaheylik the group of people is not random
09:27 celeron55 but a large random group of people can work on a pre-set goal
09:27 saschaheylik its the group of people which responded best to whatever "advertisement" we posted
09:27 celeron55 yes, and the advertisement has the, or a part of the, goal
09:27 celeron55 which they start to follow
09:28 celeron55 which makes them not random
09:31 sfan5 joined #minetest-dev
09:31 celeron55 if the goal would be adding buildable entities to minetest, there should already exist a base framework for that made by somebody familiar with much of the existing design - then people can add all kinds of functionality on top of that without interfering with each other, at least ideally
09:32 VanessaE I'm curious about something, since this came up again.
09:33 saschaheylik VanessaE: go on.
09:33 VanessaE a "buildable entity" would be a custom block built by the user that does something unusual?
09:33 celeron55 no.
09:33 saschaheylik mobile reations made from blocks
09:33 saschaheylik *creations
09:34 saschaheylik like a car for example
09:34 VanessaE ok
09:35 VanessaE the reason I asked is, in recent versions of the Animals mod, the author figured out a way to abuse the game's ability to wield an object and then drop it, such that now it bears rudimentary 3d mobs, without any changes to the core game code.
09:35 VanessaE couldn't that same exploit be massaged to do the same for these buildable entities?
09:35 Calinou a real mob system NEEDS core game code modifications, else it will always be inefficient.
09:35 celeron55 at some point we need to move into a mode where people will design the details and code it, and everybody tries to not ask anything from anyone - that is the way you get stuff done
09:35 Calinou you should not use exploits to make efficient mods
09:36 saschaheylik celeron55: that is why we need "working procedures" that keep everyone organized
09:37 saschaheylik lists of steps to follow that end everyone up working friction-less
09:37 saschaheylik something like this should've been done a long time ago
09:38 saschaheylik seeing that this is a problem of all open soruce projects
09:38 celeron55 well, feel free to write a proposal, in here for example: http://minetest.net/wiki/doku.php?id=dev:proposals
09:38 Calinou there's a workflow proposal on the wiki
09:38 celeron55 Calinou: eh
09:38 celeron55 it's mostly completely unrelated and old as hell
09:38 celeron55 Calinou: the way you can help things get organized is stfu or gtfo
09:38 VanessaE I'm just trying to think of ways to reduce the amount of code needed to create that feature "officially" is all.
09:40 celeron55 saschaheylik: this i call the "minetest chaos development scheme" 8)
09:40 celeron55 saschaheylik: and yes, i don't like it
09:40 saschaheylik oh im familiar with that one, having worked as a consultant for a major telecom firm
09:41 saschaheylik it's why i left
09:41 saschaheylik im just wondering why no other open source project started developing a system of development
09:42 celeron55 saschaheylik: i just can't make it into anything else without somebody else who is actually capable of doing engine work; kahrl disappeared after half a year of being awesome - you might be the one another that the project needs; dunno
09:42 celeron55 i'm quite a pessimist 8)
09:43 celeron55 saschaheylik: if you have just one lead developer and everybody else mostly tinker with very small things or content only, you get only ridiculed if you try to set up anything like that
09:43 saschaheylik in the world i am used to, you get ridiculed for anything smart
09:43 celeron55 with kahrl i developed mostly as a pair, independently of the community; it was plenty of development speed for me, and due to that we now have the Lua API
09:45 celeron55 ANYWAY, go ahead and propose something in particular; chances are it'll be useful
09:45 saschaheylik k i will
09:46 celeron55 i won't hesitate to kick you in the ass if it doesn't look like so, though 8)
09:46 VanessaE I can vouch for that!
09:46 saschaheylik i do prefer the existance of constructive criticism
09:47 * VanessaE still bears boot marks from recent ass-kickings ;-)
09:48 VanessaE really though, there is another problem you are both overlooking
09:48 saschaheylik probably not only one
09:49 celeron55 i am overlooking a million problems all the time
09:49 celeron55 i couldn't do anything otherwise
09:49 VanessaE well, one in particular stands out.  c55, I've already brought it up with you before and as I recall you agreed somewhat grudgingly:  code, features, etc. contributed from outside the core team are just as important, if only to those people, as code written by you and others.
09:50 celeron55 ...wut?
09:50 saschaheylik did anyone say differently?
09:50 VanessaE well that didn't come out to clearly.
09:50 VanessaE what I meant is, "useless", "horrible" and similar comments are *not* constructive.
09:51 VanessaE something you consider useless might end up floating to the top of a "most desired features" list one day.
09:52 celeron55 eh
09:53 celeron55 that shall be all i'll reply to that
09:53 saschaheylik i think the idea was to focus on those things that contribute most to the game experience right now
09:53 saschaheylik rather than things that could be considered eastereggs or whatever
09:54 saschaheylik which are a waste of productivity
09:54 VanessaE saschaheylik: of course.  But the problem is, how do you define "contributes to the experience"?
09:54 celeron55 saschaheylik: how is that relevant for now?
09:54 celeron55 VanessaE should stop, she is just clogging up the discussion
09:54 saschaheylik right
09:56 VanessaE celeron55: I rest my case.
10:02 celeron55 the awesomest discussion is no discussion with mutual agreement 8)
10:09 VanessaE says the guy who dons his chanop status after 4 minutes of idle channel...
10:09 VanessaE :)
10:10 celeron55 i like being suspicious
10:10 celeron55 umm... dubious... or whatever
10:11 celeron55 this language has too many words!
10:16 VanessaE To be honest, as if I wasn't anyway, I'm hesitant to say anything anymore.  Besides, there are only 171,000 or so words.  Should be a piece of cake :-)
10:22 celeron55 i considered answering something more particular to that, but wont, because it would only cause more asshurtery; just don't say anything for now
10:22 VanessaE ok.
10:23 celeron55 it is unfortunate, but there is no solution to it; i just am not interested at all of things you tend to have in mind
10:27 VanessaE Which is why I've taken to doing what you asked and just filing github issues as they come up.
11:41 Calinou joined #minetest-dev
11:49 saschaheylik what if the world is a single object which can "split" itself in multiple parts of itself, each of which capable of having a different location associated with it
11:51 saschaheylik i mean if we start splitting cubes into 8 smaller parts of them
11:51 celeron55 not going to work
11:51 saschaheylik we are not far from splitting them diagonally to make cornerpieces
11:51 saschaheylik which is not far from splitting in any direction
11:52 saschaheylik why not?
11:52 celeron55 now you are talking of two separate things, as far as i can tell
11:52 saschaheylik well, visibly they are seperate
11:53 saschaheylik but having the same parent universe-object-node
11:54 saschaheylik actually as far as the game is concerned they could probably be treated as 2 completely different objects
11:55 celeron55 i don't really get what you are trying to achieve
11:55 saschaheylik if we have one cube
11:56 saschaheylik and slice it so we have just as many part-cubes for it to contain the shape of the game world
11:56 saschaheylik (all parts that are air have type:air)
11:56 celeron55 that does not sounds like you had thought about how it would translate to actual code at all
11:56 celeron55 -s
11:57 saschaheylik a cube that can be split and combined
11:57 saschaheylik a quadtree
11:57 saschaheylik uuh
11:57 saschaheylik octree
11:57 celeron55 the reason why you can make a large voxel world like mine* has is only because it is a simple and light-to-handle lienar array
11:57 celeron55 linear*
11:58 saschaheylik but you have to store one voxel object per smallest measure of space possible required
11:58 celeron55 yes i do, and it is fine to me
11:59 celeron55 if you want to do something else, better start an another project; this one isn't going to get changed that way - that is way too fundamental a change
12:00 saschaheylik if it has to be changed at all
12:01 saschaheylik no idea how to explain this
12:01 saschaheylik but its too interesting not to think about
12:03 celeron55 i am quite fed up with all kinds of minecraft-octree sillyness; for example reddit is full of it and nobody actually gets anything done with it because it's just infeasible
13:10 Calinou joined #minetest-dev
13:15 celeron55 oh, this exists https://github.com/matttpt/minetest/commits/commands-to-lua
13:18 celeron55 i guess i'll merge it
13:19 celeron55 altough i should release 0.4.2 as stable before doing that... ehm... well, let's just hope there aren't bugs
13:20 Calinou +1... lua commands are far better for moddability
13:25 celeron55 i like matttpt, he just went and converted all the commands to lua a bit after i explained why i wanted his /mods command in lua, and his code seems of reasonable quality
14:05 BloodyFire celeron55: Is there a current todo list or something I can throw a look on while learning stuff for an exam? :>
14:13 celeron55 holy shit this merging and bugfixing is tiring
14:15 celeron55 BloodyFire: not really, but if you're into bugfixing, fix this https://github.com/celeron55/minetest/issues/187
14:17 celeron55 or well, there is the issue list (https://github.com/celeron55/minetest/issues) and then there is http://minetest.net/wiki/doku.php?id=roadmap:roadmap and http://minetest.net/wiki/doku.php?id=dev:random_things_by_celeron55
14:17 celeron55 but if you want to be useful, try #187
14:51 BloodyFire What's the preferred way of checking for free space? One could write a temporary file or check the free space with something OS specific.
14:52 BloodyFire Like posix_fallocate() on Linux and GetDiskFreeSpaceEx() on Windows.
15:11 celeron55 you just write a temporary file, and if it doesn't file, move it (using filesystem commands, not file writing commands) over the file that actually is the destination
15:11 celeron55 eh
15:11 celeron55 s/doesn't file/doesn't fail/
15:12 celeron55 that is how all proper software do it
15:12 celeron55 a move function needs to be added to filesys.{h,cpp} for that
15:22 BloodyFire Alright, sounds logical.
16:33 hmmmm joined #minetest-dev
16:44 hmmmm I just opened up server.cpp and i see this DSTACK(__FUNCTION_NAME) everywhere
16:45 celeron55 debug.h
16:45 hmmmm i know
16:45 celeron55 it's kind of a legacy thing, it's not really used these days
16:45 hmmmm it's just that every single call, a new classs is being made, a snprintf is being called
16:45 hmmmm which makes another class
16:45 celeron55 it only exists in functions that have large overhead
16:45 hmmmm and all this other stuff
16:45 celeron55 never in small quick ones
16:47 hmmmm alright
16:48 celeron55 the debug stack has proven to be basically completely useless though
16:48 celeron55 maybe i'll remove it some day
16:49 hmmmm but i was just going to mention, if you want a nice backtrace, you have a lot of options such as libbacktrace and nested exception handlers, all of which are very lightweight
16:53 hmmmm i'm kind of concerned with serializeString
16:54 hmmmm we don't know how std::string stores its data - that's implementation dependent.  so if it used wide characters, that would potentially be dangerous by accessing unaligned memory
16:55 hmmmm actually, that's not too likely
16:55 hmmmm unless it uses UTF32 or something
16:55 hmmmm nevermind
16:56 celeron55 for std::string the type of a character is always known
16:56 celeron55 std::wstring can be 16 or 32-bit though... ehm... i think
16:57 hmmmm ah
16:57 hmmmm i figured it was more or less like a black box
16:57 celeron55 which basically sucks and we should get rid of all the std::wstring usages except those that are used for interfacing with irrlicht, which happens to use wide strings
16:57 celeron55 std::string is basically an array of bytes which always places a 0 at the end of the data
16:58 celeron55 it can be used for anything
17:02 hmmmm erm, the server tells the client when to play sounds and stop them!?
17:03 celeron55 mods can play arbitrary sounds at arbitrary positions, and then there are sounds defined by definitions that the client knows when to play
17:03 celeron55 the client can only act based on "static" definitions because it does not run any mod code
17:04 hmmmm why not?
17:04 hmmmm if i were doing this i would probably have the client download the lua scripts
17:04 celeron55 because minetest 0.4 has been designed as such
17:05 celeron55 it is always safe to go on a server and mods have access to everything lua can do
17:05 celeron55 and it has proven to work well
17:06 celeron55 everything, including that, was considered, but this is what i and kahrl ended up doing
17:06 hmmmm ok
17:07 hmmmm what happens if the server throws a ServerError in step()?
17:07 celeron55 dunno
17:07 hmmmm at that point, m_step_dtime is still locked, right?
17:07 hmmmm well nevermind that
17:07 celeron55 lol
17:07 celeron55 no it is not locked
17:07 hmmmm i personally think that at some point, that mutex should be removed and it should be just an atomic operation
17:08 celeron55 aaargh
17:08 celeron55 why?
17:08 celeron55 it's done like once in 50 or 100 milliseconds, a single mutex at that interval gives no overhead
17:08 celeron55 stop stopping into details like that, that is not productive AT ALL
17:09 hmmmm it all adds up
17:09 celeron55 you can't add up something that rare to anything in a program of this size
17:10 celeron55 you're looking into the wrong places
17:10 hmmmm anyway i am
17:10 celeron55 there are performance hogs in the code
17:10 celeron55 you are assuming very wrongly if you think the CPU usage is caused by that small things
17:10 hmmmm i was looking for the part where the server selects the map data
17:10 hmmmm and these sorts of things just pop out at me
17:10 celeron55 seriously
17:11 celeron55 i'll not talk to you anymore if you don't focus on things that matter
17:11 celeron55 i need to choose how to spend my time
17:11 celeron55 and surely you don't have infinite time at your hands either
17:13 hmmmm notice that i said 'at some point' - i hope you don't believe that i thought it was of critical importance
17:13 celeron55 i don't think that one should be cared about _ever_
17:14 hmmmm well
17:14 hmmmm locks every 2 milliseconds sounds bad to me, sort of
17:14 celeron55 it's every 50 or 100 or even 200, depending on server configuration
17:15 hmmmm what is dtime measured in?
17:15 celeron55 there are locks that lock WAY more often than that
17:15 hmmmm not milliseconds?
17:15 celeron55 seconds
17:15 hmmmm oh
17:15 celeron55 time in minetest is always in floating-point seconds
17:15 celeron55 ....except in where it isn't
17:15 celeron55 but anyway
17:15 hmmmm that's probably good to know
17:16 hmmmm when it isn't, it's not a float then?
17:16 celeron55 usually so
17:16 darkrose lol
17:17 hmmmm alright so what am i looking at here
17:17 hmmmm SendBlockNoLock?
17:17 hmmmm er rather, SendBlocks
17:17 celeron55 Server::SendBlocks and RemoteClient::GetNextBlocks
17:18 celeron55 (the former calls the latter)
17:19 hmmmm yeah that's pretty bad
17:19 hmmmm i assume the performance hit is really caused by the two locks in combination with the sort operations and what not
17:19 celeron55 it's the horriblest thing in minetest i know of (depending a few priorization factors, though)
17:21 celeron55 also note where it is called
17:21 celeron55 Server::SendBlocks
17:21 celeron55 and where Server::AsyncRunStep is called
17:22 celeron55 oh dog
17:22 celeron55 i didn't remember it was this bad
17:24 hmmmm this is going to take a while
17:24 hmmmm there's no clear, obvious fix for it
17:25 celeron55 the algorithm for sending blocks needs to be pretty tight
17:26 saschaheylik arguing with non-programmers can be so exhausting
17:26 celeron55 it needs to be able to respond to player movements quite quickly (it is responsible for triggering map generation too) yet it needs to be able to fill the connection with data when there is nothing special happening
17:26 celeron55 the latter with minimal load
17:27 hmmmm don't tell me that this is the code responsible for the map generation stalling
17:27 hmmmm oh man
17:27 celeron55 ehm... no it isn't?
17:27 hmmmm it's not?
17:27 celeron55 or depends
17:27 celeron55 map generation is slow because generating a shitload of voxels meaningfully is slow
17:27 hmmmm well when i would play minetest, i'd go up to the edge of the map, and it'd just sit there
17:27 hmmmm and i'd have to look downward to minimize draw time
17:27 hmmmm and i'd just have it sit there for like a minute or two
17:28 celeron55 sit there never ending or sit there for unnicely long?
17:28 hmmmm and maybe by the time i got back the map would be generated
17:28 hmmmm well you see
17:28 celeron55 okay, then it can be because of that code
17:28 hmmmm most of the time it was just unnicely long
17:28 hmmmm there was a time when it was never ending though
17:28 hmmmm i disabled the mud flow from the map gen and the map gen was super fast
17:28 hmmmm except when i got up to the edge
17:29 celeron55 unnicely long time can be because of map generation being heavy, but a bit more than that (or if you look at the CPU graph, you'll notice easily) can be because of that code
17:29 hmmmm and in this one instance there was no cpu time being taken up
17:29 hmmmm it was just sitting there
17:29 hmmmm that is a more rare case though
17:29 celeron55 i have seen it, but it is quite rare
17:29 hmmmm but completely unacceptable.
17:29 hmmmm if we find it that'll be great
17:29 saschaheylik celeron55: do you know where i can find the part where the tools are being "extruded" from images when you connect to a server?
17:30 celeron55 saschaheylik: the_game() calls something in client which calls something in ItemDefManager
17:30 saschaheylik ok thx
17:31 celeron55 updateTexturesAndMeshes
17:57 saschaheylik does the profiler measure the time it takes to join a server?
17:59 saschaheylik cal
17:59 saschaheylik celeron55:
18:17 saschaheylik guess it doesnt
18:30 saschaheylik_ joined #minetest-dev
18:57 saschaheylik_ VanessaE: are you sure the extrusion process takes that long?
18:58 saschaheylik_ because i dont really notice anything
19:02 saschaheylik_ also im dont think it could much be avoided
19:05 celeron55 you need to use huge textures (512px) on a huge number of items (hundreds) to have problems
19:05 celeron55 the extrusion is very simple and has been designed for the regular 16x16 textures
20:04 sfan5 making minetest compatible with lua 5.2.1 seems to be a lot of work: http://pastie.org/4462278
21:19 BloodyFire Does anyone know how to append a file to another using linux filesystem calls?
21:20 celeron55 ehm... append?
21:27 BloodyFire I try to get one file out of two separate files withoug an additional copy.
21:28 BloodyFire Because if you write a temporary file to check the disk space and then copy it at the end of the original file, you've got two copies of the same file and needs additional disk space.
21:29 BloodyFire So I hoped there is anything that shifts inodes a little bit to do it the effective way. :D
21:29 BloodyFire *need
21:29 celeron55 eh
21:29 celeron55 that is not going to work
21:30 celeron55 the point of writing the complete contents into a file and then moving it over the other is that the other will be deleted and the filename of the deleted one will just be made to link to the newly written data
21:30 celeron55 writing of data elsewhere is not to check if there is space, it is to WRITE THE DATA.
21:34 BloodyFire I'm too tired right now. So, you don't need the old file? You could simply rewrite both, env_meta.txt and ipban.txt?
21:34 BloodyFire *files
21:41 BloodyFire I thought it's all about checking for disk space and if writing fails or not, but if it's only about replacing the old file that way it's really simple. Somehow I've overcomplicated it.
21:42 celeron55 you write first, then delete the old file
21:42 celeron55 if you open the old file for writing, it is first deleted, then you try writing it
21:43 celeron55 -> problem
21:46 BloodyFire Yeah, I've understood. It's all about keep the original file if something fails, right? Haha, and I really looked for a kernel hacking stuff to join two files to a single one. :D
21:46 BloodyFire Alright, I'm definetly too tired.
21:46 BloodyFire s/a//
21:48 BloodyFire s/keep/keeping/
23:55 BloodyFire joined #minetest-dev

| Channels | #minetest-dev index | Today | | Google Search | Plaintext