How does a game engine work? an overview (2016)
haroldserrano.com
haroldserrano.com
And I'm working on my second: http://ahoy.rupy.se
Right now I'm struggling with the fact that I'm not allowed to redistribute cl.exe compiler (I tried real hard: https://developercommunity.visualstudio.com/t/allow-redistri...) so people have to download the whole VS package and extract the necessary files (takes about 2 hours) to get automatic integrated recompile and hotdeploy in my engine.
So I'm looking at going full tinycc and dropping VS all together on Windows. But then seen how they are deprecating my pretty new and probably good forever Skylake on Windows 11 I'm thinking it's over and I should just switch to Jetson Nano but then I'm owned by Nvidia... (Raspberry 4 driver has HALF_FLOAT issues still and well Broadcom... + CPU/GPU balance is off) so I'm kinda loosing hope for humanity at this point!
Risc-V is not progressing hard and fast enough to make it in time!
Edit: Zig, Go, Rust and WASM are not solutions, they are fragmentations. Only C(+) on client and JavaSE (VM and GC) on server makes sense. (Gotta burn that karma somehow right?)
For instance here is Zig as Python package to provide a simple cross-compilation solution for other Python packages that need to build native DLLs:
I'm glad the author learned some things and enjoyed it. Writing your own game engine is a good exercise and I highly recommend it.
But this feels very much like a breakdown of one specific rudimentary engine disguised as an overview of game engines in general.
The biggest thing that bothered me is that there is a huge portion of the engine missing here. He mentions physics, graphics, math (which I see more as a set of helper libraries, not an engine component), but nothing really about game logic, audio, or input.
Every engine I've worked with (or written) has had a lot of its architecture dedicated to these. He does mention entities but nothing about them. I'm a graphics programmer myself but even so this seems the most central system to me. It drives everything that happens. What do the objects represent, how do they behave, how do they interact beyond bouncing off each other.
Without these systems your game engine is nothing but a silent physics simulation without any player input.
Calling the math library a 'math engine' more than bothered me, it is just plain wrong. It's just a few data type classes/structs and the associated templates and code to manipulate them. For an OpenGL game engine #include "glm.h" is going to do pretty much everything you would want in a battle-tested way.
There is so much in here that is inaccurate, misleading and just plain wrong: "To render a pixel on a screen you need to communicate with the GPU. To do so, you need a medium. This medium is called OpenGL." What about WebGL, Vulkan, DX, Metal? What is a medium?
"Scenegraphs are generic trees and they provide a fast way to traverse game entities. You may want to use C++ vector containers instead. This is all right. The problem is that they are too slow to traverse. Thus, if you can, use scenegraphs instead." How is a vector too slow to traverse? If I want to traverse linearly it is pretty much the fastest container. How is the scenography ordered? Is it ordered by an object/transform hierarchy, is it ordered for rendering speed, is it ordered by locality for culling/streaming, all of these?
Why is he inventing terms like the 'engine loop' where most people use 'game loop'?
And yeah, so many missing systems. Even the description of the physics 'engine' misses collision detection.
So great that the author learnt about game engines, but dangerous for them to then present such an incomplete article with such an air of authority.
As someone who's worked with OpenGL since ~ 20 years (and professionally for the last 12 years) I can ascertain that in fact nobody ever gets OpenGL to work right across different platforms. Everybody just puts in enough workarounds and #ifdefs s.t. it appears that it's "write once, run anywhere", where in reality what you write for one set of hardware will almost certainly fail on another (the definition of "fail" here is pretty broad: crashes, weird slowdowns that don't make any sense, memory leaks in the driver, outright non-compliance with the standard, etc..).
The reason is that most vendor's OpenGL implementations are broken in one way or another, particularly on mobile. Vendors treat their drivers like another box to check s.t. they can claim OpenGL compatibility but in reality it's what makes or brakes real world performance (web browsers, games, 2d graphics, etc..). It's astonishing.
>Math Engine >Rendering Engine >Physics Engine
Why do people keep repeating this? A game engine is a monstrous piece of software from which the renderer or the physics is just a tiny part.
Ogre is not a game engine. Unreal, Unity, CryEngine, Frosbite are game engines.
Even implementing a quality renderer is quite an undertaking. Knowing some OpenGL and some basic math is far from being enough. You have to know the graphic pipeline, the GPUs, the CPUs by heart. And be up to date with new techniques employed in graphics, where new things are being discovered daily. You have to read last papers published by Nvidia, AMD and Intel.
I saw many people dabbling with graphics that "built" game engines, when in reality they implemented some toy renderers.
I would be cautious about someone who hardly knows OpenGL teaching others about game engines.
It is like someone learns a few Javascript keywords and starts teaching others compilers.
Including the editor tools and asset pipeline into the term "game engine" has only really become fashionable after Unity became so incredible popular, from that moment on, Unity and 'game engine' became synomymous and everybody else (including Unreal) copied the Unity workflow model. Most of the team works in the integrated editor tool in Unity most of the time, thus the editor tool has become synonymous with "engine" but it is actually the "factory line". But this integrated game development model isn't the only possible model just because it has become so popular.
It's just as well possible to create a mainly "programmer driven" game engine where tools are only used to provide the asset data, but the actual game is fully built in code (IMHO it would be much less confusing if the term 'engine' would only be used for the runtime parts that actually 'drive' the game).
Simple 2D games don't need all the runtime components that a triple-A game needs, yet a game engine for 2D games is just as much a game engine as an engine used for triple-A games.
This is a good time to point out we're really arguing over the definition of a word here, and can probably agree on a lot of facts and observations, even if we don't agree on what the definition of "game engine" should be.
And on the opposite end, if the Unity editor is considered part of the engine, why not Visual Studio, Photoshop and Maya/3dsMax/Blender too?
In the end, the engine is just that fuzzy layer between the high level gameplay code and the operating system (going with my own preference that "engine" should only be used for the runtime parts).
Yes.
Engines are essentially loops. There are many examples of engines in software and hardware. Processors, virtual machines, emulators: they are execution engines looping over instructions that they decode and execute. Game engines are the same: they loop over user input, logic and audivisual output. Every game will have this loop deep inside, no matter how it was programmed. It is essential to their operation.
Modern game engines are generalizations of that loop. People took the common functionality from successful games and separated it from the game-specific code.
For things like audio and asset loading, you can get really far building on top of a library like SDL2 or GLFW as a cross-platform system interface, and using some single-header libraries for things like loading models or playing audio samples. There are also great physics libraries out there like Chipmunk or Bullet which neatly encapsulate most of the "hard stuff" in building a game engine.
For something like a 2D platformer for example, it's perfectly reasonable and easier than ever for a solo developer to take on building a small custom engine.
Load("Asset.png");
That wasn't so hard
Loosely-coupled composable components may be great for producing software quickly, but the approach is basically antithetical to performance.
For instance have you ever read through the movement code in Unreal? There are a million branching cases for every kind of movement: on particular slopes, swimming, flying etc. If your game doesn't have underwater motion, you're still executing those branches just because other games might need it.
General purpose game engines are by necessity not optimized for performance. They're optimized for being able to support every arbitrary type of game.
In many game dev circles there has also been a strong push towards “Data Oriented Design” where the focus is on manipulating the memory as directly as possible, rather than creating abstractions. See this talk by Mike Acton: https://youtu.be/rX0ItVEVjHc
There's no reason you couldn't leverage a lot of loosely coupled components in a program structure which mostly consists of large flat functions.
With engine-based gamedev, you buy into a monolith and that will dictate basically everything about how the project has to be built.
Web dev is theoretically open but in practice runs on Chrome almost exclusively.
10 years from now, if you have built your site according to WC3 standards, theoretically it should just work on every browser out there.
If Unity goes out of business, and their editor is no longer available, good luck getting your unity project to build in another environment.
Likewise one of the things thats most fiddly and annoying in game engines is dealing with implementation of things like OpenGL that are based on standards but not actually implemented to spec across OSes and hardware.
I agree on the dangers of relying on closed-source, proprietary software but if we wanted to avoid that we could just point to Godot as our monolithic example de jour instead.
Unity is the equivalent of a browser, not an app or even app framework. It just lives in a world where the competitors haven't done the committee thing to ensure interop (and never will).
Web is a standards-based, implementation independent platform. That is completely, categorically different from Unity, which is a proprietary tool for making applications.
Unity isn't the browser, it's web-flow or square-space. Except it doesn't give you artifacts which are interoperable with other tools at the end.
- individual subsystems: aside from things like animation and graphics, many engines use externally developed libraries for sybsystems (e.g. retour for navigation or bullet for physics)
- integration layer: this comes across as a mundane glue layer between game code and the subsystems, but it is much more than that. This layer takes care of a lot of things. For example, it's often responsible that the right resources are loaded at the right time across all subsystems, makes triggers work (physics collision handler to trigger events/changes in other subsystems), makes it possible that animation timelines can act across other subsystems, triggering sounds, starting animations, altering object states, and many more things... This layer is also ultimately responsible for keeping the real time guarantees across all subsystems with all the tweaking that entails.
- game logic using the facilities provided by the integration layer
When you look at the evolution of game engines, the first ones were monoliths that had to do everything themselves because no reusable components existed (e.g. Doom, Quake). A few years later, reusable components started to appear (mostly physics and audio engines IIRC) and for a short time there were a lot of mostly proprietary engines integrating these components. But with games becoming more complex and more demanding, these integration layers also became more and more complex and became a huge investment. That's when the well integrated monoliths won.
In modern engines, the allocation and management of resources is often delegated to an individual subsystem. The fact there are no famous libraries (as famous as Bullet, Retour or BGFX) that do it is no indictment it's not decoupled in practice, it's just not a very sexy area. And even in commercial engines, this subsystem is not as smart (and complex) as one would wish.
The triggering parts you mention are handled by Components, in most popular engines. Even without using ECS or something fancy, Unity-style components are already as decoupled as it gets. Sure one component might need to know about others, but that's the nature of the programming and it's already pretty decoupled.
Even the editors like Unity are as decoupled as it gets, using reflection instead of knowing the internals of the Components in the integration layer.
The fact that most engines only come in big monolithic packages is just a reflection of current development culture, with lack of collaboration between engine writers and lack of standard patterns or formats. Virtually every single standard present in video game engines (models, video, audio, code, serialisation, APIs) come from the outside. It's a young field.
But I could perfectly envision a reality where the popular libraries offer components (or whatever) ready to be included into third-party editors, for example. Imagine VST plugins in a DAW, for example. Maybe even a standard map/level format too.
But this is not where the money is: Unity and Unreal breaking it and creating an open ecosystem of Components would be amazing, but would also open the floodgates for competition. Their "strength" is in being a single package that looks monolithic from the outside. With a plugin-is system one could create a new editor without creating the other parts, or a new renderer without creating an editor. I could see Godot doing it, maybe, but that's probably not a priority.
For instance, renderers (esp. back-ends) and physics engines are already largely subsystems which are fairly separate from the rest of the game logic.
I can imagine a world where you start with a package manager, and maybe you choose one overarching framework/ecosystem which will serve as a middleware for combining nav meshes and animations etc. in the same world space, handling events etc. the same way you might choose a framework for building a web-server from several popular options.
There's no reason you need an extremely heavy-weight closed-source black-box system to serve as the foundational layer.
I also think you're over-estimating how much of a "beast" you need as a minimal structure for building a game around. I have built a lot of hobby games, and if you're not trying to make an AAA game, you can get really far with a simple game loop, and a few single-header libraries for things like audio and asset loading.
That would be one of the advantages of a more modular approach: you could choose a right-size solution rather than working from the assumption that you need this hugely complex monolith to build off of, and potentially not needing a lot of that complexity.
It’s an organization/people problem. Eventually if your tiny hobby game engine gets big enough people start trying to use it to make the equivalent of AAA games. Then either those users (or your investors if you’ve gone that route like Unity did), start pushing you to support those edge cases.
Eventually your elegant modular code is dwarfed by the all the edge case handling that got crammed into the framework—either because it was so performance critical that it had to live there or (the more likely case) because it was much faster to hamjam it in than spend time thinking about how best to architect it.
There’s no reason the vast majority of time that you need to pay the overhead of using network calls to enforce your boundaries. Yet time an again you see companies willing to pay the microservices tax because it’s just so hard organizationally to enforce modular boundaries over time.
Then we have the scalability, then we have composability, then we have different security models, then we have code isolation.
There are many advantages to a microservice model. But that doesn't mean the microservice model is good for a game, unless it is backend code.
Many (most?) software engineers (most?) cringe at the state of the npm ecosystem—even if they hold their nose and participate in it. I definitely wouldn’t consider that an improvement to the state of game dev software engineering practices.
Do you dislike cargo as well or just npm for some reason?
I've worked in languages that had large standard libraries where it was common to only include a few large commercial external dependencies, and I've worked with javascript and ruby on the other end of the spectrum.
I don't think one style has a clear productivity advantage over the other. Other than maybe at the very lowest levels of beginning software engineers (even then I'm unsure because of the decision paralysis common for beginners in these ecosystems).
As to the original point, however, Unity and other engines already have package managers and asset/code stores. What you're essentially asking for is for Unity to remove many of the features they already include and pull them out into packages. Now you're running up against many of the organizational issues I've already talked about. Not saying it's impossible, in my experience it's just not likely to work out long term.
But monolithic game engines won.
I'd argue that's because game development is not a CS discipline. Game tech / engine is, but games need more man-hours in artistic disciplines like modeling, animation, level-design, story-telling etc. than they need for cs.
There is a lot of 'game middleware' out there for the CS part of the equation. Game engines themselves are not monoliths, using 20+ middleware components is common.
The game design part is done using a monolithic interface to the technology (the engine), but that's because that job is not 'programming'.
Care to elaborate on how that's not programming?
There's artists building the game experience and CS people building the game technology.
The latter do use and reuse smaller software components to build the level editors, scripting interfaces, particle physics, path-finding, illumination, etc. The engine. This job is very much like other fields of software development, not actually behind.
The first might write code (e.g. scripting), but they are generally doing so in a restricted 'monolithic' environment provided to make their job easier. They do not have to build the technology, they can just direct it, if that makes sense. Their job isn't typical software development, more content development, thus it seems a bit alien, behind from a software developer's perspective.
Programmers can design a game, and game designers can do some programming, of course. But in modern days, the core way that both professionals interact with engine editors is completely different.
Game Design in general is closer to art or being director than to programming.
It's essentially a game-maker UI tool with some support for scripting/coding. The runtime that's dangling off the end of the asset pipeline and editor is much less important (even if this hurts the pride of hardcore engine coders) ;)
PS: a standalone "bring your own engine" hackable Unity editor would be great, but I guess that doesn't quit fit into Unity's business model
I’ve been thinking about this a lot as I want to write more standalone games with minimalist runtimes but also don’t want to give up the QoL you get with a decent scene editor with runtime inspection and “fiddling”.
One thing that intrigues me is the recent rash of tools made with Godot as it has a pretty good UI system that is used to make their own editor: https://itch.io/c/651672/tools-made-with-godot-engine
I could see a decent open-source game editor made this way as well. But don’t have the energy to actually do it myself.
OOP is not a good fit for performance. I would even argue that OOP is not even good for decreasing complexity and ease of maintenance.
Composability, separation of concerns, flexibility and simplicity were also some of the driving forces behind ECS.
Unity is reworking their systems to use it by calling it "DOTS" (https://unity.com/dots), and this wouldn't be a HN post without mentioning rust so there is also bevy (https://bevyengine.org/) which is great.
Running as a monolith is the most performant way and utilizes hardware to its fullest, which is what you want to do when you run games.
Users don't have farms of Pcs and consoles, they don't need to scale.
And won't general-purpose engines pay a penalty relative to single-purpose engines since they have to optimize for the "average case" game rather than exactly one target?
Theoretically, yes. However so many man hours have been put into optimizing engines like Unreal that in reality the answer is no.
That's one of the reasons looser coupling would be great. I would love to be able to use the UE renderer in the context of a different engine.
What you're talking about is a particular type of game engine: a tool with integrated editor, AAA 3D renderer, and which is general-puropose enough to support many different types of games built on top of it. That's a very very narrow way to define game engines, and imo it creates the wrong impression that games are this infinitely complex medium which it takes hundreds of people to work on at the most basic level.
I think the author's definition is also too narrow, but it's perfectly valid to get into game engine development through small toy engines which are built from the ground up by one person.
Maybe it is also worth noting, that there is a difference between a AAA monstrous game engine - and a simple one for casual browser games and the like?
So there might be even value in an article from a beginner covering only the basics?
(but I do agree, that the teaching was in a style overly confident not warranted)
You do not always need a sophisticated assets loading mechanism nor AI modules. Or you need them in a different way, than what the engine provides (mostly my experience).
My point is, "game engine" is not a static universal concept.
Not every game needs a physic engine, for example, nor even assets(I think there are engines for text only rpgs)
(A point where the article is indeed poor)
The term becomes a bit meaningless then.
Many a better approach would be to ask whether every game needs a game engine?
"Game engine" outside of the context of making a game is just a runtime (and/or environment), and I agree it becomes a bit meaningless (as a prescriptive thing).
It's like saying a CPU needs to have vectorized operations, or even a hardware multiply, to be called a CPU. It's true that in many, if not most, cases those are essential components. However, I find it more useful to define "game engine" as "whatever takes care of the game, physics, and display logic implementation for a particular game".
> Many a better approach would be to ask whether every game needs a game engine? So, by my definition every game _has_ a game engine. I think a more interesting question would be, "when does a game engine need to be considered as its own logical layer or compartment?"
And maybe no, not every game needs its own engine, but after a while you could probably extract a game engine out of every game. Whether thats worth it, usually depends on the success of the game ..
However, I agree with the OP that there are certain low-level components that are common in most games and that you'd therefore expect when choosing an engine. I'd argue that you'll at the very least want to have a game loop (or engine loop), processing of player inputs, a renderer (even if it just renders 2D sprites), and probably audio output. That usually implies you have some sort of assets that have to be managed, even if those are just bitmaps and wav files.
All of this reminds me of the discussions about what makes a game, which are common in academic research about computer games. When one mentions "computer game", I'd argue, most of us immediately have a certain mental image, usually strongly influenced by AAA games. But technically, you could also just hand your player a folder of text files that they have to navigate through in "choose your own adventure" style - and you have a "computer game" without even having a program at all.
Yeah, I agree those are the features I would expect from a common game engine. Maybe with some DB as well.
Otherwise yes, a game engine is just a special framework in my opinion. And you always have to choose the right tool for the job.
"you could also just hand your player a folder of text files that they have to navigate through in "choose your own adventure" style - and you have a "computer game" without even having a program at all. "
And I think someone here recently just published that, as a game to learn bash..
Is Box2D not a "real" physics engine but a toy physics engine because it's not simulating physics in 3 dimensions?
Games are games and there are a multitude of categories and multiple different dimensions how to judge any particular game or its engine. Saying that something is not a real game engine because it doesn't meet some random narrowly defined criteria is pointless.
If an indie author finishes a game on their own steam, without using a popular decades-old engine, I want to hear how they've focused their perspective to make it work.
(this is the engine the author made: https://github.com/untoldengine/UntoldEngine)
For example, you need exactly none of the things you just described you make Flappy Birds.
Hell, insisting that a game engine isn't a "real" engine unless it can render 3D graphics on a GPU ignores such a huge swatch of games it's hard to know where to even start.
Yet there also exists a sea of inexperienced programmers jumping straight into "engine dev". They have none of the critical production experience which drives quality engines. This flood of enthusistic yet unprepared engineers causes a bipartite population. With the majority of public articles or YouTube presentations coming from those least prepared to speak with knowledge.
If you want to become a game engine dev your first step should be joining a studio as a gameplay programmer. No one wants to use an engine written by someone who does not know how to make games.
A metaverse engine server (probably a whole farm of services) is somewhat like a MMO game server, except that it may have to deal with other similar servers. Possibly untrusted servers run by others, if you allow portals or teleporting or adjacent regions run by different grids. Hard problem. Improbable tried to build such a thing, as Spatial OS, but the end result was really expensive to run and all the games that used it went broke.
Both Tim Sweeney and John Carmack see many unsolved problems in this area. If this "metaverse" stuff survives the hype and the scams and turns out to be important, there's plenty of hard work ahead in this area.
Plenty of engine companies and studios will hire juniors and mid-level engineers into engine teams. And it’s been that way for a long time. And whilst the engine will preferably be made whilst developing actual games using it you don’t need everyone on the team to have been a gameplay programmer. There’s almost too much specialisation required these days and a lot of engine engineers aren’t interested in or good enough at game design to do gameplay roles. What it does need is active feedback from game teams building serious projects.
I’d agree though if you want stability and much less chance of crunch pick a company with a stable income. Engine companies are good for this but there are plenty of others.
I agree with your points on a renderer is not an engine, though.
Even playing sounds and music at the right time will likely trip most people up
And the AI(algorithms) is also a considerable part of the engine? Or does each game develops everything related to the AI from scratch?
For a more code centric resource I would say you could check out the YouTube videos by The Cherno (former EA engine dev).
Rudimentary documentation, but the wiki[2] does a good job of breaking down how each component fits in, including MPC/NPC components, Game Screens, Areas, Animations, Texture Atlases, Sound, Collisions, Physics, etc, all of this using Entity-Component, Factory design patterns.
[1]: https://github.com/UQdeco2800/2021-ext-studio-2
[2]: https://github.com/UQdeco2800/2021-ext-studio-2/wiki/Getting...
Compare with a far more detailed Figure 1.15 [0] from “Game Engine Architecture”.
While it's perfectly valid to use one of the big engines, it's fine even for an indie dev to build their own engine on top of frameworks like MonoGame by e.g. implementing a simple ECS or other components they want to use in their dev workflow. Not every game is a AAA game in need of a cutting edge graphics pipeline.
Some of the most accomplished indie developers wrote their own engines from scratch or used low level frameworks to build them.
I am all for writing your own engine as a learning experience. Most programmers I have worked with have done so.
I am all for sharing your learning experiences in a blog post. A lot of really good blogs do this while being really honest with where they struggled and what they learned. See https://jvns.ca/ for a prime example.
My problem with this post is that it's a post by someone very inexperienced presenting a very shallow and narrow view of what a game engine is in a surprisingly authoritative tone.
If the article would have been "I made my first basic game engine, here's how it's structured" I would have felt differently about it. But this is presented as "this is how a game engine works" and it does not present an accurate image of that.
How exactly is he supposed to change his "tone" so you're less insulted by his "authority"? You do realize that English is clearly not his primary language.
I'm beyond vexed by the number of people slamming the author for his ego, while themselves posting ego-laden responses.
My advice would be not to try to make THE game engine. Making a game with its own engine usually works out OK, if team has expertise, of course.
Like Unity or Unreal, don't try to replicate those, creating generic 3D engine for every game. You don't need to. But it is easy to make 2.5D game with its own engine which would absolutely reck "big guys" in performance and simplicity of use.
Often you'll have a scene graph and an ECS. The scenegraph consists of the entities. Otherwise it can get difficult to do a lot of world scale processing like loading in segments etc..
When I worked in AAA we would get periodical reminders not to mute the game when playing. People still did.
I was actually searching for a good open-source audio library to use, and found out that my options aren't that good. SoLoud is a pain in the ass to install and integrate into an existing codebase, and OpenAL doesn't have any good implementations available (either proprietary or LGPL). I'm now just using a simple single-header audio library in cute_headers (https://github.com/RandyGaul/cute_headers/blob/master/cute_s...), but will probably switch to MiniAudio once the high-level API is finished (https://github.com/mackron/miniaudio/issues/196)
Partially I blame the focus that game marketing and game journalism puts on the quality of the game visuals. If your game's PR media package doesn't have good screenshots, you can pack up and go home. Maybe, the reason for that is that historically, games were marketed by getting articles about them placed in game journals and they could only present images. This has carried over to some extent to the web (screenshots are easier to make and easier on the server bandwidth than gameplay videos).
Engine programmers are even more susceptible to this natural bias because there is a vanishingly small part of engine development that needs aural feedback. It always amazes me how many engine projects have fancy renderers but can’t do more than play one shot sound effects.
This audio bias extends into web video as well. The vast majority of videos get played without any audio.
On a side note, I've been going through games I've played that had excellent sound and some of them (e.g. the Half Life series) are among the better games of all times. The one prominent exception in my library would be Elite: Dangerous - it's a decent game overall, but not mind blowing. I believe that good audio is mostly correlated with the developer's attention to the complete experience and not just to a certain wow factor like stunning graphics or a particular gameplay gimmick.
In (most) engines, however, there are more assumptions baked in, and most things can be accomplished by configuration alone. Writing code is mostly an escape hatch or is required just in few places, instead of being the only way of interfacing with the engine. (Of course that doesn't apply for every engine).
I think a good comparison in the web world would be Hasura. It can do similar things that Rails also does (provide APIs), but in a more limited way, and code is not strictly necessary unless you're doing something that's not standard.