Jump to content
  • Advertisement
The search index is currently processing. Activity stream results may not be complete.

All Activity

This stream auto-updates     

  1. Past hour
  2. The main problem with NoSQL overall, is that it requires you to know all your access patterns ahead of time. And because secondary indices are usually cumbersome or expensive, if you have more than the plain "given a key, find me a bag of data" then NoSQL starts showing its weakness. Another thing that NoSQL got first, but SQL is now getting too, is in-RAM databases. Depending on performance needs and cost / operations specifics, you may want to look at databases specific for RAM. On the other hand, if you have data with a "long tail" (old data that's seldom accessed,) then all-RAM is almost certainly the wrong choice. Also: Putting more RAM into a SQL database host, to make it cache better, often reduces the cost difference between in-RAM and on-disk. If you're familiar with MySQL, there's nothing wrong in just using that. It works great, and can scale far. If you need specific features of Redis (atomic push/pop, sets, pub/sub) then you might want to include that, too, with the caveat that you have to put a time-to-live on all data, because when Redis runs out of RAM, that's it -- no more data! Another interesting option is FoundationDB, which recently went open source when the company was bought by Apple. It's a key/value store that supports federation/distribution -- you can add nodes to get more capacity, without changing the semantics of the database. Redis, and most other NoSQL databases, by contrast, don't allow transactional work across multiple hosts.
  3. Automated builds are a pretty important tool in a game developer's toolbox. If you're only testing your Unreal-based game in the editor (even in standalone mode), you're in for a rude awakening when new bugs pop up in a shipping build that you've never encountered before. You also don't want to manually package your game from the editor every time you want to test said shipping build, or to distribute it to your testers (or Steam for that matter). Unreal already provides a pretty robust build system, and it's very easy to use it in combination with build automation tools. My build system of choice is Gradle , since I use it pretty extensively in my backend Java and Scala work. It's pretty easy to learn, runs everywhere, and gives you a lot of powerful functionality right out of the gate. This won't be a Gradle tutorial necessarily, so you can familiarize yourself with how Gradle works via the documentation on their site. Primarily, I use Gradle to manage a version file in my game's Git repository, which is compiled into the game so that I have version information in Blueprint and C++ logic. I use that version to prevent out-of-date clients from connecting to newer servers, and having the version compiled in makes it a little more difficult for malicious clients to spoof that build number, as opposed to having it stored in one of the INI files. I also use Gradle to automate uploading my client build to Steam via the use of steamcmd. Unreal's command line build tool is known as the Unreal Automation Tool. Any time you package from the editor, or use the Unreal Frontend Tool, you're using UAT on the back end. Epic provides handy scripts in the Engine/Build/BatchFiles directory to make use of UAT from the command line, namely RunUAT.bat. Since it's just a batch file, I can call it from a Gradle build script very easily. Here's the Gradle task snippet I use to package and archive my client: task packageClientUAT(type: Exec) { workingDir = "[UnrealEngineDir]\\Engine\\Build\\BatchFiles" def projectDirSafe = project.projectDir.toString().replaceAll(/[\\]/) { m -> "\\\\" } def archiveDir = projectDirSafe + "\\\\Archive\\\\Client" def archiveDirFile = new File(archiveDir) if(!archiveDirFile.exists() && !archiveDirFile.mkdirs()) { throw new Exception("Could not create client archive directory.") } if(!new File(archiveDir + "\\\\WindowsClient").deleteDir()) { throw new Exception("Could not delete final client directory.") } commandLine "cmd", "/c", "RunUAT", "BuildCookRun", "-project=\"" + projectDirSafe + "\\\\[ProjectName].uproject\"", "-noP4", "-platform=Win64", "-clientconfig=Development", "-serverconfig=Development", "-cook", "-allmaps", "-build", "-stage", "-pak", "-archive", "-noeditor", "-archivedirectory=\"" + archiveDir + "\"" } My build.gradle file is in my project's directory, alongside the uproject file. This snippet will spit the packaged client out into [ProjectDir]\Archive\Client. For the versioning, I have two files that Gradle directly modifies. The first, a simple text file, just has a number in it. In my [ProjectName]\Source\[ProjectName] folder, I have a [ProjectName]Build.txt file with the current build number in it. Additionally, in that same folder, I have a C++ header file with the following in it: #pragma once #define [PROJECT]_MAJOR_VERSION 0 #define [PROJECT]_MINOR_VERSION 1 #define [PROJECT]_BUILD_NUMBER ### #define [PROJECT]_BUILD_STAGE "Pre-Alpha" Here's my Gradle task that increments the build number in that text file, and then replaces the value in the header file: task incrementVersion { doLast { def version = 0 def ProjectName = "[ProjectName]" def vfile = new File("Source\\" + ProjectName + "\\" + ProjectName + "Build.txt") if(vfile.exists()) { String versionContents = vfile.text version = Integer.parseInt(versionContents) } version += 1 vfile.text = version vfile = new File("Source\\" + ProjectName + "\\" + ProjectName + "Version.h") if(vfile.exists()) { String pname = ProjectName.toUpperCase() String versionContents = vfile.text versionContents = versionContents.replaceAll(/_BUILD_NUMBER ([0-9]+)/) { m -> "_BUILD_NUMBER " + version } vfile.text = versionContents } } } I manually edit the major and minor versions and the build stage as needed, since they don't need to update with every build. You can include that header into any C++ file that needs to know the build number, and I also have a few static methods in my game's Blueprint static library that wrap them so I can get the version numbers in Blueprint. I also have some tasks for automatically checking those files into the Git repository and committing them: task prepareVersion(type: Exec) { workingDir = project.projectDir.toString() commandLine "cmd", "/c", "git", "reset" } task stageVersion(type: Exec, dependsOn: prepareVersion) { workingDir = project.projectDir.toString() commandLine "cmd", "/c", "git", "add", project.projectDir.toString() + "\\Source\\[ProjectName]\\[ProjectName]Build.txt", project.projectDir.toString() + "\\Source\\[ProjectName]\\[ProjectName]Version.h" } task commitVersion(type: Exec, dependsOn: stageVersion) { workingDir = project.projectDir.toString() commandLine "cmd", "/c", "git", "commit", "-m", "\"Incrementing [ProjectName] version\"" } And here's the task I use to actually push it to Steam: task pushBuildSteam(type: Exec) { doFirst { println "Pushing build to Steam..." } workingDir = "[SteamworksDir]\\sdk\\tools\\ContentBuilder" commandLine "cmd", "/c", "builder\\steamcmd.exe", "+set_steam_guard_code", "[steam_guard_code]", "+login", "\"[username]\"", "\"[password]\"", "+run_app_build", "..\\scripts\\[CorrectVDFFile].vdf", "+quit" } You can also spit out a generated VDF file with the build number in the build's description so that it'll show up in SteamPipe. I have a single Gradle task I run that increments the build number, checks in those version files, packages both the client and server, and then uploads the packaged client to Steam. Another great thing about Gradle is that Jenkins has a solid plugin for it, so you can use Jenkins to set up a nice continuous integration pipeline for your game to push builds out regularly, which you absolutely should do if you're working with a team.
  4. So you have a lot of questions, which is understandable because this is all fairly complex and confusing. I think the first thing you should probably know is that DirectX shader programs generally only work in terms of 32-bit datatypes. So when you write HLSL code to add two values or transform a vector by matrix, the actual ALU operations are mostly going to be working with 32-bit floating point values or 32-bit integers. These are the only data formats that are guaranteed to be supported by the hardware in your shader programs, and most games/programs out there work exclusively with 32-bit operations. There are ways to work with operations that run at lower-than-32-bit precision, as well as the "double" type that can be used to access double-precision operations. However both of these are optional, and are only supported by certain GPU's. For most of the DX10 and DX11 era desktop GPU's only supported 32-bit operations, but recent AMD and Nvidia GPU's have started adding support for fp16 operations. Support for double-precision can be rather patchy, since it's generally only intended for high-end compute usage rather than 3D graphics. So with that said, the other important thing you should know is that there's a difference between how your data is stored in buffers or textures, vs. how it's operated on in your shader programs. Your shaders have the ability to read or write data through various paths depending on the type of shader, and those paths can possibly support automatic conversion from its format in memory to the format that the shader program can consume it in. The classic case is textures: textures are almost never stored as a set of full 32-bit floats, and are instead typically stored as a fixed-point format like R8G8B8A8_UNORM. In order for a shader to sample a program, the texture has to specify that its data is laid out according to one of the supported DXGI format types from the DXGI_FORMAT enum. This is key, because these formats specify not just how the data is stored in memory, but also how the data is interpreted by a shader program. If you go to the docs for DXGI_FORMAT and scroll down to the section entitled "Format Modifiers", you'll see what I'm talking about. If we go to the commonly-used UNORM format modifer, you'll see this: Unsigned normalized integer; which is interpreted in a resource as an unsigned integer, and is interpreted in a shader as an unsigned normalized floating-point value in the range [0, 1]. All 0's maps to 0.0f, and all 1's maps to 1.0f. A sequence of evenly spaced floating-point values from 0.0f to 1.0f are represented. For instance, a 2-bit UNORM represents 0.0f, 1/3, 2/3, and 1.0f. The part that I bolded for emphasis is the important part: it's basically saying that the shader will see a floating point value in the range [0, 1], not an integer value. This lets you write shader code like this: Texture2D<float4> ColorTexture; SamplerState ColorSampler; cbuffer Constants { float3 LightDir; float3 LightColor; } float4 PSMain(in float3 uv : UV, in float3 normal : NORMAL) : SV_Target0 { float3 surfaceColor = ColorTexture.Sample(ColorSampler, uv).xyz; float3 lighting = surfaceColor * saturate(dot(normal, LightDir)) * LightColor; return float4(lighting, 1.0f); } So the shader is just working entirely in float's, and doesn't care about the data format of the texture. The texture might be R8G8B8A8_UNORM, it might by R16G16B16A16_FLOAT, or it might be BC1_UNORM. It doesn't really matter to the shader, as long as the format is ultimately interpreted as a float. Hence you don't see any unpacking or conversion code here, we just go right to multiplying the texture sample with the lighting. Generally the only time you do care is if you use a UINT or SINT format, since those require decorating the texture with <uint> or <int>. In those cases the integer values will be case to a 32-bit int type on read, which lets the shader work with them using 32-bit operations. On a similar note, we can have data conversion happening when the pixel shader's output value gets written to a render target texture. The pixel shader outputs a float4, but the render target might be using R16G16B16A16_FLOAT, which is a common format for HDR rendering. If that's the case, the pixel shader output value will automatically get converted to that format on write, again without the shader really knowing or caring. The same concepts extend to a few other places in the pipeline. Shaders can read from the "Buffer<>" type in HLSL, which maps to a shader resource view with D3D11_SRV_DIMENSION_BUFFER. This kind of buffer also uses a DXGI_FORMAT, and supports automatic conversion from the packed format to 32-bit values. RWTexture and RWBuffer UAV's can also perform format conversion on write, and possibly also on load depending on the GPU and OS that you're using. The other place where format conversion is commonly uses is the input assembler (IA), which is responsible for reading from your vertex and index buffer and passing the vertex data to your vertex shader. For the formats that the IA supports, conversion works the same way it does for textures: transparently. Your HLSL code just needs to declare the input variable according to the way that the format is interpreted as specified in the docs, which means float for FLOAT/UNORM/SNORM, int for SINT, and uint for UINT formats. So if you have this as your VS input struct: struct VertexInput { float3 pos; float2 tex; float3 normal; }; Those 3 attributes could be using any of the FLOAT, UNORM, or SNORM formats in the vertex stream. You don't need to change your shader declaration if you change the vertex packing, as long as you're continuing to use formats with one of those 3 modifiers. This means that you can totally use lower-than-32-bit packing for your vertex attributes if you want to save on memory and bandwidth, and you absolutely should do this! You just have to make sure that the precision is adequate for your use cases. As for how the conversion happens, it's really up to the hardware. Texture format conversion is generally handled by dedicated hardware in the texture units, which is necessary because unpacking (and possibly decompression from a BC format) needs to happen before filtering can occur. on the flip side, some hardware (particularly mobile hardware) will patch code into the pixel shader to handle conversion from 32-bit floats to the render target format. For the IA, it depends. Some GPU's still have dedicated hardware and caches for fetching from vertex buffers. Some don't have any hardware for this, and instead will patch in a pre-amble to your vertex shader that reads and unpacks the vertex data. But even in those cases the decode cost tends to be pretty small compared to the cost of additional memory access, so tightly-packed data is most likely still going to be a win.
  5. Today
  6. Hi, I am fresh to database design, recently trying building my mobile multiplayer game, it will be something like pokemonGo. I have experience on MySQL, and I know some NoSQL engines like redis. I saw some existing game projects which store their data on both SQL database and noSQL database. Could anyone give some advice that what kind of data should store in SQL and what kind of data is better to be in noSQL. It would be nice if giving some real scenario examples. My understanding is data like user profile, purchase transactions should be in SQL. Field map information, enemy status can be NoSQL.
  7. Yesterday
  8. I've been working on my own Metroidvania via GameMaker Studio for the past few years. You play as a bat named Ralph as he goes on an adventure to obtain 7 Crystal Medallions hidden in dungeons with the help of a cult known as the Crimson Fog. Along the way, there will be quests unlocked in Cedrus Village as you progress through the game. I've managed to complete a demo of the game up to the first dungeon and boss fight. I have only a PC build available, and the only gamepads I managed to install were Logitech Precision and Xbox PC gamepads. I had some trouble on gamepad detection though, so they may have connection issues. The desktop controls are similar to Terarria's control scheme if it's too much trouble. I don't have any music at this point, I'll need to get someone else to compose it later on. The music I make isn't bad, but it doesn't fit the aesthetic that well. I'm really hoping I can get feedback regarding the general content. Crimson Fog.0.2.zip
  9. Hodgman

    alternative to NVidia FX Composer?

    Honestly I would recommend Unity. It's obviously a sledgehammer where a smaller too is required... But pretty much contains the feature set of something like FX Composer within its editor. They have their own wacky shader format, but it's based on Cg/HLSL originally so will be similar.
  10. You can try the Unity LateUpdate here. You could also use OnCollisionStay2D instead of OnCollisionEnter2D.
  11. Hodgman

    Why are member variables called out?

    No, that just assigns the arguments to themselves. The only place this works is in constructor initializer lists: struct foo { int x, y; foo(int x, int y) : x(x), y(y) {} }; //copies the arguments to the members
  12. Been playing games since I was a kid, mostly PC strategy game. That was back in ~1995-2000. Fast forward to year 2000, when I was in middle school, I thought about how cool it was to make games, and have the character run in any world you create. But unfortunately, I was in Singapore, and it seem like all the game are made in Japan/USA to me, it seems like an impossible dreams. Fast forward to year 2008, I was about to go to college/University, and ta-dah, DigiPen Singapore just opened, and I was the pioneer batch. And I was lucky after graduation to be able to work on games like XCOM 2 and The Evil Within :D. Now I'm out working it out on my own! Here's the game I am working on at my startup. AwayFromGuild.com
  13. ChaosEngine

    Why are member variables called out?

    I'm very skeptical of that. Are you claiming that x and y are both members and parameters? How would the compiler know which x is the parameter and which is the member? Does it assume that lvalues are members? Can you tell me which compiler does that so I can avoid it like the plague? Even on the off chance you could do that, don't. There is nothing good about that code. It's confusing, ambiguous and definitely non-portable.
  14. GRASBOCK WindyOrange

    #1 Grass and Animated Sprites introduced

    I think i understand. This will get fairly difficult.
  15. Zephyr Wong

    Away From Guild

    Game Website - www.awayfromguild.com Twitter - www.twitter.com/lightninggamesg Facebook - www.facebook.com/Away-From-Guild-215904675813418 Away From Guild is a idle mobile game where you are the Guild Master.Create, expand and customize your own guild.Recruit adventurers and send them out on quests.Witness their epic journeys and collect loots.Gain fame and become the best guild in the world!
  16. Hi all, Some of you may already be familiar with Scene Fusion for Unity. Well, we kept getting asked when the Unreal version will be coming. After many months of hard work, we were able to produce our first teaser! We will be going into a closed alpha test in the coming weeks: In the meantime, check it out!
  17. @Scouting Ninja Thank you so much for the feedback, everything has been taken on board and i will do that before posting to my art station page. I will add some wires to this post too. Thanks!
  18. Don't allow the bricks to move down during the time the ball is that close and moving up. ED: Missed the Unity tag.
  19. I've got a bug with my brick breaker style game. The bricks move down one line at a time ever 1.5 seconds. What appears to be happening is occasionally the ball will be just about to hit the brick when the brick moves down a line, and now the ball is behind it. I'm not sure how to fix this. I have two ideas but I'm not sure of implementation. 1 solution would be to check where they were and where they are going to be before rendering the frame. Then if they crossed paths, then register the brick as hit. Solution 2 would be change how the bricks move. I could maybe slide them down line by line, instead of a jump down. I'm not sure of this will fix the issue or not. Any ideas?
  20. Scouting Ninja

    What does MMORPG require?

    A Massive Multiplayer Online Games requires millions of dollars and a huge team. MMORPG games died because there is too many of them. Too much cost and too few players, simple as that. If you just want to make a multiplayer game then you don't need much, just time really. Grab a engine and get started.
  21. mmmax3d

    Add floor in skybox

    THis thread is moved to Graphics:
  22. mmmax3d

    Add floor in skybox

    Ok thanks I moved it to graphics. Hi Thank you very much for your reply. I have moved the post under Graphics. Could you please copy+paste your reply there? Thanks!
  23. Hi everyone, I would need some assistance from anyone who has a similar experience or a nice idea! I have created a skybox (as cube) and now I need to add a floor/ground. The skybox is created from cubemap and initially it was infinite. Now it is finite with a specific size. The floor is a quad in the middle of the skybox, like a horizon. I have two problems: When moving the skybox upwards or downwards, I need to sample from points even above the horizon while sampling from the botton at the same time. I am trying to create a seamless blending of the texture at the points of the horizon, when the quad is connected to the skybox. However, I get skew effects. Does anybody has done sth similar? Is there any good practice? Thanks everyone!
  24. Actually, when you create a canny image out of the original one, the cluster is already grouped into one color, so the mask could be just black and white, in which white is vegetation area and black is not, I think it would work somehow.. thanks Jack
  25. Liudvikas Lazauskas

    What does MMORPG require?

    First of all, MMORPG games have always been an important part of video games for me. Whether it's roleplaying or grinding, I have always enjoyed MMORPGs from the bottom of my heart. Personally, I think that where the current world is rather drawn of away from these games. Battle royale games or FPS shooters are currently taking over the industry. Therefore, current MMORPGS fall behind, even more, when they fail to satisfy the gamer's needs the game usually gets abandoned. On the other hand, I strongly believe, that since our current society is making a rather big breakthrough with all the technological development, VR and AR are not that far from us. As a consequence, I think people will more likely be drawn back to these open world series of games and roleplay to the bottom of their hearts. What I want to ask or just gain criticism of my foolishness is what does MMORPG take? I have some experience in C++ and Python as coding languages, some experience working on application development. I am currently writing a pretty detailed Game Design Document, so I know what I want from the game and what it should do. I know such task is not for a single person to handle, therefore I am just saying I have couple of friends willing to help me along. What languages of coding should I learn, and what aspects should I take to approach MMORPGs. I am currently pretty unsure where to start, and what to prepare. I am fully aware it is not a short term project, but I am ready to improve and adapt for this
  26. Hive Entertainment

    Hive Entertainment Technologies

    The name of the game is Bunny. You play as a female character in a dystopian open world enviroment. The world was devistated when a virus comes around to mutate all living organisims. Upon character creation there are 3 main options for the character class one that uses guns one that uses knives and swords and one that uses bows. The main objective is to find the cause behind the virus. Later in the story Bunny (the character you play as) takes off her gas mask to reveal she is actually a robot with sophisticated A.I. the main objective then diverts to trying to find her Creator who holds a very vital piece of information as to how the virus came to be. There is a simple sketch attached as to what the character will look like. Every time she dies the color of the jacket changes. As I said it is a rough sketch. Also my name is Christopher (I go by Chris). It is a pleasure to meet you all. I also have a few properties waiting to see if I get enough team members behind this project before they will go in. If more info is needed please do not be afraid to ask.
  27. Tom Sloper

    Lore in a game. Why are we fighting?

    Necro. Locking thread. Azlen, if you want to revisit the topic, please start a new thread. This one is more than 2 months old.
  1. Load more activity
  • 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!