Jump to content
  • Advertisement

frob

Moderator
  • Content count

    11232
  • Joined

  • Last visited

  • Days Won

    4

Everything posted by frob

  1. frob

    What does MMORPG require?

    That extra M requires quite a lot. Not just for infrastructure to be "massive", but also M for Marketing.
  2. frob

    I have recompiled everything!

    Rounding out the other two comments of using newer tools and using diagnostic output... Dependency checking is based on date. Each file has a dependency. Executables depend on the libraries and object files. Object files depend on the .cpp files. The .cpp files depend on the .h files they include, etc. If the file is missing then it is built. If a dependency is newer than what exists then the items is rebuilt. So working through that, the reasons it is probably rebuilding are: * You've changed a dependency so the files really do need to be rebuilt. * You've changed the timestamps so the dependencies are newer than their target, so the compiler assumes the compiled file is out of date. * You've got custom steps or tools so the compiler doesn't know the dependency tree so it always assumes the file is out of date. Detecting those changes requires significant work and either a partial compilation or saved information about the dependency tree. If the dependency tree has been saved then every file's timestamp needs to be read and processed. If the dependency tree has not been saved the compiler will still need to do a partial compile to ensure all the headers and dependencies have dates that are older than the output files.
  3. frob

    Relocating to start my career

    Few game companies will pay to relocate someone who has no industry experience. Look for places with many companies, then start applying.
  4. frob

    Unity coding error

    The homework rule is along the lines of "we won't do your homework", asking about specific issues in code is generally fine. (It gets hard to tell when the homework issue is also the code issue, but that's rarely the case.) As Nypyren pointed out, you've got a typo. Those words are not the same, but you probably intended them to be. I'm not sure what you are trying to do there. Rigidbody is a component class rather than an object, it doesn't have that as a property. Here are the docs. What did you hope to accomplish with that line?
  5. frob

    Game Designer Resume Critique

    Congratulations, and good luck on the job search.
  6. Sorry, didn't notice the date, only the other recent reply. Since you had the interview already, how would you answer your own question? What was the second interview like?
  7. That's an unfortunate thing. While it is convenient for them since it gives some code you've written, they're telling to to make an enormous investment as part of the interview. Unless I'm rather desperate for the job, I'll give a company 1-2 hours before the interview, and specifically call out companies for asking for more time. This is extra-important if I'm still employed, I don't have time for that kind of time on the hopes that they might consider me for the role. I always wonder how many great candidates were rejected because they weren't willing to give what amounts to hundreds of dollars worth of time to the interview process. Depending on your situation you may want to point that out. If you get the job, you definitely want to call their extended project out as a problem. It may be accidental, but time consuming projects for an interview is an enormously disrespectful practice. I'd also consider it a warning sign about the company: if they don't respect your time now while you're a candidate, how will they respect your time once you're working there? Be extra mindful of signs of a bad work-life balance. Probably more of the same. Expect to be interviewed by multiple people who will ask a wide range of questions. There are the general first impressions. While it includes clothing, I've had a few interviews where overpowering body odor was a strong deciding factor. Everyone interviews differently. Some people will look for holes in your general knowledge, or look for specific skills they are interested in. Many will be looking for how deeply you've dug into various systems to help them better understand your skills. Some people will look for social patterns and attitude. They may be looking for certain attitudes (quiet, reserved, active, energetic, etc.) and you have no way of predicting what those are, they may be looking for more of what a team currently has, or may be looking for something different from what a team currently has, or they may just be considering how someone fits with the others in the group. They'll probably ask you for some white-board code writing. There may be questions related to how you think, like "How would you estimate how many piano tuners think are in San Francisco?". Or perhaps more algorithmic thought processes like "you're trying to figure out how many stories up you can drop a thing without it breaking, you're allowed to break two of them, what is the minimum number of drops to find the answer?" Or perhaps questions around a topic, like asking someone applying for a testing role how many ways they can think of to test a Coke can. No matter what they ask you should keep your mouth running most of the time explaining why you are doing what you are thinking. Interviews are not just for the company to ask you questions. You will also be given the opportunity to ask them questions. Use it, and ask questions of everyone who interviews you. Use more than the words in your own interview of the company. You should look for signs that you can do the job, or that you cannot do the job. You should look for signs that you will hopefully thrive at the company. Look for signs of their work/life balance, such as a very young workforce (older people rarely tolerate abuse and nonsense) or signs that the company is financially solid or having financial issues. Growing companies hire people, but a struggling company tends to hire many people right before they collapse in a desperate bid to stay afloat. Watch for signs that they have been neglecting long-term maintenance. Look for people you might already know, friends from school, friends from past jobs. Look for signs that the company is succeeding and growing, is thriving and healthy, or that it is not.
  8. Can you? Sure. Just beware that you don't compete in a vacuum. You are competing against all the other applicants. You've got a rather limited pool of jobs, and are part of a large group of people who want to work in games. When a game studio has a pile of applications to review they sort them by their own priority. First to be interviewed are those who are known. Then are the people who have industry experience, sorted by experience. Then those who don't have industry experience but have strong credentials for the job, usually including both a degree and a portfolio or a specific technology the company needs. After that, people who have weaker credentials, which seems to be the bucket you are in. There are situations where they skip farther down in the list, particularly when the job cannot pay well so the company is looking for a less experienced or less educated worker. It is usually not as pleasant for the job, but it is a way in to the industry so you can start gaining industry experience and industry contacts. Because you don't have the background you probably won't be the first person called in for an interview, or the second. Your application will likely be sorted quite far down the list, and probably ignored for most of the best positions because they have so many applicants with stronger backgrounds on paper. Your best bet is to have friends and acquaintances who can get you past the barriers and get you the interview. Either way, once you're in the interview you're being compared with others who are also being interviewed. You will have a more difficult time than many other applicants, and you probably will be passed over for most jobs, but jobs still exist and people in your situation are hired. I'd be sure to apply to lots of other jobs, too.
  9. Yes, it crashes. It'd consider a 100% crash situation with no workaround (apart from running on a different computer) disastrous. And all of them should work fine if you wrote all the code correctly, and if the compiler handled everything around it correctly. Just be aware of that for broad release. The original AVX has been around for a decade and still isn't supported by about one in five game machines. AVX2 is probably closer to 50% adoption rate, although they don't have the number specifically on the Steam survey.
  10. Both Unity and Unreal give the user-edited code the appearance of being single-threaded. All the stuff the user writes operates on a single thread by default. A few small pieces are exposed in the form of asynchronous functions offering callbacks, fire-and-forget commands, or other calls you can make which return immediately and eventually result in state or data changes. They provide access to the libraries you can use if you want to enter the realm of multithreading, with all the performance possibilities, race conditions, locking concerns, and bugs that come with it.
  11. frob

    C with SDL - Limit the frame rate

    When you eventually add your SDL_RenderPresent() call, that should throttle your speed. You have the flag SDL_RENDERER_PRESENTVSYNC in your renderer, which means that whenever you switch rendering buffers with present, the function will block execution until the vsync has finished. This will naturally limit your framerate to whatever the video card has, and it is the typical way to slow things down so your code is already on the right course. Thus if the user has a graphics card set at 60 Hz it will cap updates at 60 times per second, if they've got a 75 or 120 Hz monitor it can cap at 75 or 120 times per second.
  12. frob

    Best Choice for HTML5 Games?

    Those examples are all programmer-centric. If you have access to it, you might be able to use Adobe Animate (formerly called Flash) to put your animations together easily. Making movies with minimal interaction is very easy and requires no code.
  13. Phones tend to be more casual and play sessions tend to be shorter and more easily interrupted, which makes FPS a less common fit. There are some FPS games and some games where longer gameplay is possible, but they're less common. As you mention, control is more difficult. While it is more RPG than FPS, there have been many games with an overhead camera that have proven extremely popular on the platform. Infinity blade was incredibly popular, and these days Fortnite (and to a lesser extent, PUBG) tops of the charts. Lots of combat that plays well on the devices. Historically the best mobile games are easily approachable and easily interrupted. The ever-popular Angry Birds is a great example, a single action takes about 5 seconds. Many card games, puzzle games, and trivia games follow the same pattern of being easily interruptible from moment to moment. If you browse through the top ten games at any time over the last decade, nearly all of them have followed the same pattern; they're games you can pick up and set down at a moment's notice. FPS games occasionally make that list, but they're relatively uncommon as they require significant time and attention from the player, in addition to concerns over battery life and device temperature.
  14. Unity has been in constant development since it was first launched over a decade ago. It has a team of over 1500 people working full time to make it better, faster, stronger, and more capable. Don't worry about trying to remake exactly the same game. You can't, and even if you think you wanted to remake that game, you'll discover that you really don't. There are many amazing games that started as "spiritual successors". Those are games where the person was inspired by a great game, the person tried to re-create the elements that were the core fun, and added their own creative twist to make something new and incredible on its own.
  15. frob

    about unblocked games

    The tool to make Flash games was a tool called Adobe Flash. Flash has been unpopular on the web for several years and is not generally used for new work. The tool has changed over the years and is now called Adobe Animate. It can make games targeting HTML5 canvases in addition to the older Flash-based games. There is no good way to describe difficulty for using the tool. Difficulty is relative. If you have experience with tools that manipulate timelines and animation clips, if you have experience with graphics tools, it is not particularly difficult to use. If you have never seen the tools before it may take some effort to learn how they work. Millions of people have learned how to use it, and if you get stuck there are many online resources to help you.
  16. frob

    Make a worm move ?

    There are many different ways to do it. Efficiency in a worms game might be important on a computer where speed is measured in Hertz, but yours is measured in gigahertz, so even a badly performing routine will be fast. Consider that if you have 2 GHz to run, that's 2 billion cycles, or far more than 33 million cycles per frame. Modern CPUs can process several instructions every cycle. You would have to be extremely inefficient to require thirty million cycles to move a five segment worm. Do the spheres stay put, or do they move? One way of handling the pieces in a game where the items don't move is to have a circular buffer. That is, if your worms are always 5 squares long, instead of moving where each item is at only modify where the head is. When the head is 0, the body pieces are 1, 2, 3, and the tail is 4. When the head is 1, the body pieces are 2, 3, 4, and the tail is 0. When the head is 2, the body pieces are 3, 4, 0, and the tail is 1. That way you can be lazy and only update a single value that tells you where the head is. You'll compensate by needing to track how far down the array each position is for the body and tail. If you are growing and not always the same length, then you can copy each position one element down the row. You'll probably want to start from the tail, make the tail's position the same as the one before it, then move up the chain. If all the pieces need to move, you'll need to figure out how they move in your game. Are they always moving toward the piece in front of them? What distance do they move? Often that is called a "delta", which is an old math term commonly used to indicate a distance changed. You can compute your snake's delta, or compute what direction the head needs to move, and then using whatever rules make sense for how you choose to implement your game, advance each piece down the line.
  17. Games on Steam are pirated constantly. I've watched products I've worked on that are on pirate downloads within minutes of release on Steam. There are automated tools that strip out Steams protections. If a game is relying on Steam's services for social features and other non-critical aspects, those can be removed automatically without any obvious harm. Just as above, the only way the games have a hope at copy protection is if they have server-side components required to play the game. Even if the game client is stolen they require a valid account in order to play the game, and the valid account means one where the developer has been paid. Choosing any particular language does not make a difference. C++ code is compiled in ways that are difficult to recover the source, but it can still be easily hacked. C++ compilation is more crushing than many other compilation models, it is more like making hamburger and it is difficult to recover a cow. However, the attacker does not need to reconstruct the cow, the hacker only needs to identify a few specific pieces inside the compiled code and make changes to them. They are easily identified with the correct tools.
  18. The specific case of drawing is a bad example because it follows a highly inefficient data path. Drawing is best done in large batches with a small number of calls because each call has an overhead. Calling each object results in tiny batches of size 1 and an enormous number of draw calls, which is the worst case for drawing hardware. There are generally two patterns used. In one situation you would use a shared interface and process them as a group. Instead of making Shape have Draw, you might have an interface called "Drawable" For a C++ loop, you might have something like this: ... for( size_t i = 0; i < SceneList.Size(); i++ ) // I'd prefer a newer ranged for loop, but whatever works. { if( Drawable* drawable = dynamic_cast<Drawable*>SceneList.GetItem[i] ) { drawable->Draw(); } } There is a small cost to be paid for the dynamic cast, but since it will return a null pointer if the cast fails and it gracefully handles a bunch of data hierarchy problems, the cost is generally something you would pay anyway if you're detecting that an operation is supported. Alternatively, if you don't want to pay for a conversion or a type test you can provide a function that is called for every object rather than just the specific interface functions, and implement the function differently based on the derived type of object: For that style of system: //Do this: for( size_t actorIdx = 0; actorIdx < actors.count; ++actorIdx ) { actors[actorIdx]->DoPrimaryAction(); } //Not this: for( size_t actorIdx = 0; actorIdx < actors.count; ++actorIdx ) { if(actors[actorIdx]->type == ActorType.Wizard) actors[actorIdx]->DoFireball(); else if(actors[actorIdx]->type == ActorType.Warrior) actors[actorIdx]->DoSwordSwing(); else if(actors[actorIdx]->type == ActorType.Rogue) actors[actorIdx]->DoKnifeStab(); else if(actors[actorIdx]->type == ActorType.Archer) actors[actorIdx]->DoFireBow(); ... } In both cases your code would not know or care about the concrete class it has. There are a collection of things that all implement the same interface. You have a factor method somewhere that created the things for you. The things might be triangles or squares or circles, but you don't care because you only care about shapes. Or the things might be wizards and warriors and rogues, but you don't care because you only care about actor objects. When you follow SOLID principles, you should generally be focused on abstractions, not the actual objects.
  19. frob

    Rewriting Older Games

    While it can be fun to split hairs, there are many different sections of IP law that are all interrelated. That's partly why they're generally bundled under the term of IP law. It isn't just the big three of copyright, trademark, and patent. There are laws about trade dress, trade secrets, author's rights, and "moral rights" and "related rights" and "database rights". There are laws about dilution (directly, or by blurring, or by tarnishment) that often come in to play. When those are challenged for infringement, there are often laws about unfair competition and deceptive trade practices and economic injury that get invoked. The occasional lawsuit regarding them typically covers many different factors of IP law and business law. I don't think I've ever read about an actual case that was exclusively regarding copyright, or exclusively regarding trademark.
  20. Do you have this defined? #if defined(_MSC_VER) && _MSC_VER >= 1700 //Visual Studio 2013 #define AVX2_ENABLE #endif Also, you should know the compiler doesn't support every CPU instruction through intrinsics. You should check the list before doing this type of thing. https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2013/hh977023(v=vs.120) While it can be fun to experiment and learn about those tools and CPU-specific operations, be wary about using them for commercial projects. They are disastrous to get wrong and they have many subtle issues you might not know about. It is easy to write code that happens to work for your own computer but is buggy for the general case across all different CPUs.
  21. For the example, all games that have an online processing components have this. In a web game like Slither or Generals the client receives data from the server and displays it, and the client accepts data from the player and transmits it. In Slither the game clients aren't coordinating all the motion and collision. In Generals the game clients aren't increasing the numbers or maintaining who owns whatever squares. The game servers only transmit the things the player can sees. Instead of the client getting all information and only selectively displaying what the player should see, the player only has the data they can see and has no other extra data. The game client does not know what every square is doing, or what ever player is doing, or what moves are queued, or what else is going on within the game. In Slither that means the client doesn't have data for snakes that are distant. In Generals that means the client doesn't have data for distant tiles or data for queued moves except the ones made by the local player. The server knows all the information, but the game clients are never presented it with it. For the protections you're talking about, if the game is entirely transferred to the client it cannot be protected. If a player downloads all the pieces to play, then an attacker can also download all the pieces to play. They can save those files and serve them from their own web sites. This has been done by many unscrupulous people. Many Flash games, Java applets, and other web-based programs have been copied from one site to another site because it was all present. Some require changing a few assets to point to different web sites, but that is easily modified. Java doesn't help. If you create a Java applet the files can be downloaded by a legitimate user, saved to disk, then used by an unscrupulous actor. Compiled Java can be opened by anyone with the right tools. Languages that support Reflection mean that compilation includes all the original names. If you're using a language that supports reflection features, like Java, C#, compiled JavaScript, and more, an obfuscator can help rename everything so it isn't immediately visible through reflection; instead of seeing that something is called GameObject they see it is called TQxV or some other random-generated names. That doesn't help very much, but can slow people down slightly. Heavily-compiled languages like C++ perform even stronger operations to remove names, and they are also easily reverse engineered by people with the right tools. The only viable solution to keeping the game from being taken is to never give them access in the first place. That generally means the client is a viewer for data, and the server is a producer of the data. The player can have all the access to they client they want. An attacker can make a fake client that responds exactly the same way as the legitimate client, they can have full knowledge of the communications protocols, of what is being sent across the wire and why, but even with full knowledge of how the client works they still couldn't do the server processing. That's the only known way to have those protections.
  22. frob

    Rewriting Older Games

    Most are so inconsequential, so small, or such failures that the companies that can claim rights never even know about them. Many developers will quietly watch the projects once they know about them. There will be no notice, no comments, no feedback good or bad. Among those being quietly watched, sometimes the developers will quietly watch and support. As an industry we generally want to encourage fans to to spread the word and enjoy in the product, but on the flip side, we don't want anybody to interfere with our own products. The typical reaction (but not universal) is for game companies to ignore fan projects as long as they stay as fan projects. If they start to grow into a commercial product of their own they'll get legal demands. If they are a fan project that is large enough to compete with official sources, they'll get legal demands. If a fan project is starting to direct the main product line in a direction they don't want, they'll get legal demands. Some companies are more protective than others. Nintendo in particular is highly protective; fan projects routinely get legal demands the very first time they post something publicly that reveals how they clone some aspect of Pokemon. The most lax are the products that have effectively died, the company entered bankruptcy, and the assets sold; somebody still owns the rights but they are unlikely to ever enforce them. Exactly what can be copied is a complex issue, and it requires legal study to know the full boundaries. Any distinctive element is protected. Naming a planet Coruscant or Tatooine, naming a fuzzy species a Wookie or Ewok, those are enough to classify something as a derivative work of the Star Wars universe. Making a planet that is completely populated, or a desert planet, or making ape-like creatures, those are not particularly distinctive enough. Lightsabers and their distinctive sounds are owned; laser swords that make a different sound are generic. Referencing 'transporters' and 'phasers' and 'sheilds' by themselves aren't a problem, but add too many elements and you can be a derivative of Star Trek or whatever other property you are copying. And parody isn't what most people think it is. If you're including a bit of something because you think it is parody, don't do that and take it out. Transformative parody is quite difficult to do in games. An example might be using SMB characters in a game where the entire purpose is to point out major flaws in the SMB universe, perhaps how Mario is not a hero but is actually a terrorist. Before claiming something is a parody, know that it almost certainly is not legally protected, and talk to some competent lawyers so they can also tell you it is probably infringement on copyright, trademark, trade dress, and assorted other IP laws. If something is new enough to exist in computer form that means it is new enough to have IP protections. It isn't in public domain. Even when they product owner tells the world it is public domain, there are lawyers who argue some rights cannot be legally surrendered so it isn't fully available to the public. Unless they have written permission from the rights-owner their use is infringing even if the person would never enforce those rights. Simply: Don't copy other people's stuff. Be creative and make your own stuff. If you decide to copy other people's stuff, don't be successful.
  23. frob

    Advanced AI in Games?

    There are places where they are used, and have been used for years. Systems involving feature recognition, such as handwriting recognition, speech or command recognition, or gesture recognition, many games do this with machine learning. They are also being used in games where people DON'T want to see them. Games like Slither.io or Generals have much simpler decision surfaces and have had some amazing machine learning done against them, in part because it is so easy to train them up. On the flip side, nobody likes playing against bots in those games. Really the key is their strengths. Machine learning systems like ANNs and genetic algorithms are amazing at recognizing complex decision surfaces. If you've got a bunch of training data and you've got time to train it, it can be amazing. As far as games being used to discover those decision surfaces, they can be a great fit. But few games are doing that kind of work, and the games that are complex enough where players want smart AIs are also the game where players complain about cheaters using exactly those things the discussion is claiming people want. The curse of dimensionality kicks in for larger games as well. Games like Slither and Generals have relatively few options at any step, and relatively few inputs available. Games like Fortnite with a large playing area, a large variety of offensive options and defensive options and resource collection options and exploration options options, and with an enormous number of variables that change through the course of the game... well, that decision surface is far more complex and difficult to learn. On top of that, balancing that "fun factor" is incredibly difficult. Even having an AI that wins a certain percentage of the time won't work, because people want to see other behavior that mirrors what they would do. Bots on Slither.io that still lose after a statistically appropriate time are generally easily detected as bots. Trying to make them appear to behave consistent with humans is probably too much to ask for any unsupervised learning system.
  24. Partly, but that's not the big cost I was referring to. The overhead of calling a virtual function is minimal on a modern machine. The virtual function indirection itself rarely requires a cache miss thanks to branch prediction and branch target buffers, and thanks to large instruction caches. The problem with the virtual aspect is that they cannot be inlined or elided. They must always be called. It takes time for every function call (virtual or not) to save the registers and restore them when done, to put appropriate markers on the stack for exceptions and stack unwinding, costs for function prologs and epilogs, plus the occasional instruction cache misses. Virtual functions add around 7 ns, but outside of tight loops that overhead is rarely an issue. The problem is the calls themselves. The naive type of virtual override functions is often completely unnecessary. Many times the functions will have no content; there is all the cost of a function call only to discover the function does absolutely nothing. For the button example, will have many functions like OnMouseEnter(), OnMouseLeave(), OnMouseMove(), OnMouseDown(), OnClick(), OnDoubleClick(), OnMouseWheel(), OnCreate(), OnDestroy(), OnDragEnter(), OnDragExit(), OnDragDrop(), OnFocus(), OnKeyDown(), OnKeyUp(), OnSelect(), OnDeselect(). Those are in addition to the GUI functions like OnPaint(), OnPrePaint(), OnPostPaint(), and simulation functions like OnUpdate(), OnPreUpdate(), OnPostUpdate(), OnPhysics(), OnPrePhysics(), OnPostPhysics(), and on and on and on. When the calls can be optimized and inlined the empty functions vanish in a puff of logic. But in languages with dynamic dispatch or virtual functions, they cannot be removed. Even if you're using a language that uses different names for the pattern, like Python or JavaScript or Go or Rust or Python, there is a cost for these functions since the overhead cannot easily be removed. The way programmers usually use them all the calls must be made even if they don't implement the functionality. I've seen badly written code libraries where the enormous number of empty function calls consumed milliseconds per frame in function call overhead. ECS can be implemented well, with very high performance and minimal unnecessary work. ECS can be implemented terribly, with enormous wasted effort, terrible performance, and wasteful systems that don't respect the realities of data in the real world (hence the plea for more DOD or consideration of how data actually flows), nor of code execution in the real world (hence the comments about abusing functions). Building an ECS system is fairly easy. Building them well is a difficult task.
  25. You don't say what the project is, but completely remaking a game is a large undertaking. Remakes of games even when you've got all the source code and assets is generally a multimillion dollar project in the professional world. Don't expect a perfect remake of the game. Many people create "spiritual successors", games that are small but have similar mechanics and effects and otherwise feel like the older game. I'd consider that your long term goal. For short term goals, you've got to develop all the skills to get from where you are today, up through the skills needed to develop that final project. Since you mention working in Unity, that's a fine starting point. Begin by working through some Unity tutorials and building simple levels. As you learn how to build levels, how to build components, how to put components together into functionality, your skills will increase. Eventually you'll reach the point where you can start to build the same thing as the game you remember so fondly. But you've got to learn to crawl before you can walk, and learn to walk before you can run. Start with the Unity tutorials and make basic levels and beginner games.
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!