• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.


  • Content count

  • Joined

  • Last visited

  • Days Won


frob last won the day on July 27

frob had the most liked content!

Community Reputation

44864 Excellent

1 Follower

About frob

  • Rank
    Moderator - Mobile & Console Development

Personal Information

  1. C++

    Since @FordPerfect asked for a review for correctness, and I think we've established many reasons against the philosophy, I'll try that route. Also since there has been a fascination about portability to obscure systems, I'll include my thoughts on those. R(sizeof(L))*8 -- You assume 8 bits. If you're going for portability this is wrong. I've worked with hardware (not game systems) with 9 bits, with 32 bits, and with 36 bits. Use CHAR_BITS. return L(-1) -- You assume the system is using two's complement to store numbers. Several business-class servers from IBM and Unisys, and probably other machines like the soviet toaster mentioned above, do not use two's complement. A one's complement system may return 111...1110 instead. A signed magnitude system will return 1000...0001. An offset binary system will use 1000...000. return L(0) -- Same comments as above. There are many systems where the integer 0 is not the same as the bit pattern 0. Silent failure -- Since the goal here is to detect and correct programmer errors, some form of logging or assertion is necessary. Maybe some asserts through all the alternate paths, and maybe some logging through an appropriate system. std::make_unsigned is C++11. Can we not require C++11? -- It is your code, you can require a minimum version. Many systems require C++11 or C++14 in order to compile. if(value<L(0)) return L(-1); return L(0); does not introduce branch in either GCC or clang. -- Only true on some processors. There are many different processors out there with a wide range of instruction sets. While the most popular desktop processors have a conditional assignment opcode, most chip designs out there do not, including many RISC chipsets. GCC will happily and correctly add branches when targeting those chips. Should functions be marked inline? There seems to be subtle difference between template function and inline template function. -- Template functions are not inline. Templates are basically cookie-cutters or automatic copy/paste tools. If the template is not marked as inline then the generated code will not be marked; if the template says inline then the generated code will be generated with inline. Also, being marked as inline does not mean the code is forced to be replaced inline, compilers may still leave it as a function with internal linkage which is still called as a function with all the associate overhead, and users may use templates with external linkage, again meaning they are full function calls despite being marked as inline and being required to follow the rules like declaring them in every compilation unit. Mark them as inline if you understand that and they truly are inline functions. If they are not actually inline functions, don't mark them as inline.
  2. C++

    When either value is negative the resulting sign is implementation defined. It is the polite way of saying: "The operation does whatever your hardware does on that opcode." Various chipsets handle it differently, and the standards committee tries very hard to prevent systems from being slow in the name of uniformity. Java tried doing that, and it backfired spectacularly. It took until Java 6 for them to work most of them out, but during the early years many operations, especially trickier floating point operations, were incredibly slow as they were processed in software rather than using the slightly different hardware operations. In practicality it is not an issue. In our field you typically have either a single platform, or you have up to four platforms with known specifications, and that's it. You don't need to write code for every conceivable platform, nor have thousands of variations for every compiler and chipset and operating system throughout history.
  3. Sorry for the edit, but these are discussion forums. If someone has answers and knows about other options, please place them in the forums so they can help other people for years to come. If people reply directly through email then future people will search for the same question, find this result that should give answers, but get no answers because they've all been sent to a personal email address instead of attached to the discussion. Posting the answer on the site allows everyone to use the knowledge.
  4. C++

    So you impose a cost to ALL code using bitwise shift because someone once wrote a bug? Most functions have rules about their use, such as not passing null values as parameters, or ensuring elements are within a legal range. This is no different. Shift operations have a mandatory range between zero and the number of bits of the type. Passing a negative shift distance is a bad parameter, exactly the same as if the programmer had passed an invalid object address or dereferenced a null pointer. Don't do that in the first place, then you don't need to write special code to handle the buggy code.
  5. A lawyer is not that expensive for this type of work. They are simple business agreements, mostly boilerplate. Assuming you've done your homework (clearly you have not) a friendly lawyer can hook you up with all the forms you need with a quick meeting and transferring some electronic documents. Depends on your local lawyer costs, around here it is about $150/hr for this type of work. If you haven't done your homework it may be 2-3 hours, so perhaps around $500 for you. If your game isn't worth $500 then it isn't worth the effort your putting in to it. Otherwise you need rights assignments, perhaps in the form of an independent contractor agreement or partnership agreement or collaboration agreement. Exactly what is assigned, who it is assigned to, what happens for succession of rights, payment for rights, and other details are all up to your agreement. What are the exit clauses? What happens if someone becomes bitter and wants to leave? What happens if some of the group want to sell it to another group? What happens if some people want to buy out the others? You will probably need to create a legal entity (a business) to hold those rights since your friends are unlikely to trust it all to you personally. Revenue sharing needs many more details. Who ensures revenue is handled correctly? Who verifies the limits are met? Who can audit the system to ensure they are being paid? How often can they audit? Who handles tax forms? Who handles distribution of money? What happens if someone dies? What happens if someone is no longer in contact? If you don't think it is worth hiring a lawyer than you've already decided it won't reach enough money to justify paying anyone. So either go get a lawyer or recognize you already know deep inside that the project won't make money.
  6. C++

    I'm not sure what you're on about. This seems unnecessary. They're undefined if you have a negative number of bits or if the shift is larger than the number of bits. But you should never be in either situation. That is a bug in the code, a bug in the logic. Writing code that solves a bug by wrapping it inside a function that hides the bug is nonsense. That is a "Don't Do That" bug, the problem is that the programmer did something they shouldn't. It also gets into trouble if you attempt to shift a signed negative value. Since the language does not specify exactly how numbers are encoded it would be nonsensical to enforce what happens on those situations. That's another case of "Don't Do That'. None of those are particularly problematic. Programmers shouldn't be doing that in the first place, and if they do, that's a bug that should be caught through testing. As for your performance concerns, every CPU that matters implements a bit shift opcode. Every compiler I'm aware of either simplifies the expression to something even faster, or it generates the CPU-specific opcode. It is hard to get much faster, especially compared to all your branching code.
  7. Can you? Yes. Should you? It is a STRONGLY discouraged practice. Generally in programming you want to minimize the amount of coupling with other systems. You've got your collision system coupled with a texture system, which doesn't seem to make any sense to me. What does physics collision have to do with object texturing? You're suggesting increasing the coupling even more. Not only is the physics coupled to rendering, but now the object is coupled with the entire Application entity. Far better for systems to work independently, and there are many great patterns that work with this. One is forwarding commands to be handled by the appropriate level. Your collision system might pass an event or call a function on the object when the collision takes place, now the collision system knows nothing about textures; the object itself may not know about the details, but may have a component that is interested in the response so it calls the component's function on collision; the component already knows the texture and it also knows to change in response to a collision.
  8. That is always risky. Many people are deeply attached to their specific settings, and will vocally complain about how a character class has been 'nerfed', how they will refuse to play, how they will flood every online forum telling them about it, and more. In online games, I prefer the policy that they must always have the latest version in order to play online. It simplifies many things, and avoids incompatibility issues. While they should not be problems, sometimes even minor compilation differences can be enough to cause different builds to be subtly incompatible.
  9. For backup, the standard computer system backup rule is 3-2-1. At least three copies, at least two media, at least one off site. In businesses, a system of D2D2T (Disk to Disk to Tape) is common. That's the original copy, a copy made to another disk in the server room, and a tape backup that gets stored somewhere else. As for a drive to put all your stuff on, if all that stuff is software source code (since you're asking in a game developer forum) there are many services that will offer free version control online. Assembla (that used to have a link at the bottom of the page...) offers a free private source code repository up to 500MB and up to 2 users.
  10. Algorithm

    Agreed about the 200 objects being small. If they're cache friendly and arranged linearly you could iterate over them all faster than you could jump around a tree with the corresponding cache misses. For timing approximation, iterating over a cache-friendly array takes around 0.5ns per item since array traversals are prefetched to L1 cache. Jumping through a tree takes about 10ns (or more) per lookup as they're usually in L2 cache (or worse, L3 or main memory). A tree may have five, ten or more of those jumps depending on how it is implemented. My search skills is failing right now so I'm not finding the links, but I believe it was the DICE Battlefield 2/3 team who basically abandoned the traditional spatial trees in favor of cache friendly objects in flat arrays because they were faster for their work.
  11. Just realized I forgot to mention: Instead of distributing a drive with music, give links to your YouTube / SoundCloud / Whatever account that features your music. I don't want to directly plug in anything that you've got, but I trust the major web sites to give me a stream of your recordings. I won't look at them from a spam, but if I'm in the market and looking for you, I'd expect some way to hear some demos of things you've created in the past.
  12. Probably easier to ask what you don't understand about it. Do you understand what the basis vectors are? Do you understand what the cross product operations do? What about the function is confusing to you?
  13. 1) No, but I also have spam filters. I suppose it is possible they could be sending me things I'm blissfully ignoring. 2) Everyone should present themselves professionally. I expect that if I have a need to hire a composer, I would be the one contacting them. I don't expect to have a steady stream of composers marketing themselves through spam or other email in an attempt to get business. 3) I've worked with people we have worked with in the past. It is rare to need someone new. Note that we're talking about composing a small amount of music perhaps only a single time every year. 4) I would almost certainly not listen to it. If I get a business card I might file it. If I get a USB drive I'm probably just going to format it and use it for temporary, throw-away storage. 5) When I am working with them I engage in a steady stream of email and video chat meetings. Depending on where we are on the project that can mean anywhere from daily face-to-face meetings to weekly face-to-face meetings, and email messages as needed but at least weekly in the most extreme case. One key thing to remember is that most games don't have a steady need for original composition. It is a rare event, and when it is needed the job is almost always filled either by people who've been used in the past, or by people who are connected by friends or friends-of-friends. I've never heard of people reaching out to unknown strangers as music composers, that has ALWAYS been through existing connections, or through reaching out to known composers, or with friends-of-friends as the most distant for the hunt.
  14. Item 1 is mostly true, they have done what they can to restrict direct access. Many games have various practices that still expose addresses. Hook up voice chat and you can likely see a direct connection either to the player's IP addrss or to a repeater's IP address. Items 2 and 3 seem a little odd, so perhaps some clarification is needed. Severs have a heartbeat to their controllers, but it seems like you are asking about using the server acting as a star, and each spoke in the star being told the status of other spokes on the star. You might be asking something else. Any game can implement their own heartbeats if they want, and many games do. Track the time since last message from the player, and if exceeds a specific time you can take an appropriate action. If you want to spread that among other users, the star's hub could send that out to every spoke or to every leaf node. Details might get more complicated depending on how your game's logical networking works out. If you have a full star where everyone must connect directly to the star's hub, or if you require a complete mesh where everyone can talk directly to everyone, you can require them to all chat occasionally. But if your game allows for other layouts where individual clients can act as a forwarder or repeater, you may not hear directly from another node even though messages are passing through. If you want to pass any of that information along within the game, it will be your game's code doing that, not the API.
  15. And just for clarification, exactly how old are these old phones you are talking about? The official end of support for Android devices is 3 years after product launch or 18 months after first sale, which ever is longer. After that you're entirely on your own. Apple devices are similar, 3 years of support. The are called "vintage" for a few more years, then they're obsolete. Everyone knows it is short, even us as consumers. However, as customers it is clear the devices are no longer supported, and as developers it is unrealistic to expect years-old devices to conform to this year's needs.