Achievement | Engine/Game | Why it's bad |
---|---|---|
storing world space positions in gbuffer | STALKER, F.E.A.R. | Depth buffer can be used to derive position saving a lot of memory bandwidth |
uploaded texture upside down | Various engines, mostly Quake derived. | Difficult to debug with tools like apitrace, nsight, pix, renderdoc, etc |
fixed function pipeline on top of a single vertex buffer | Tesseract, GoG porting layer | Inefficent use of modern rendering since you need to stream data every frame |
made your own texture compression format that works with the driver's decoder somehow | Darkplaces (S2TC) | To avoid S3TC patents which are now expired |
cleared color, depth and stencil buffers individually | idTech4, Unity | Clearing them individually is slow path in driver, all at once is optimal |
line rendering with quads | Various | Less efficent and don't get hardware assisted AA like line rendering gets |
per-vertex lighting | Cube, Minecraft, Gears of War, Skyrim | Looks very bad compared to lightmaps and or realtime lighting |
used facet normals | Goldsrc, UE2, UE3 | Looks very bad compared to smooth normals, lighting will be incorrect |
manual gamma correction on sRGB textures | Various | Incorrect and defeats the purpose of sRGB assist |
used degenerate vertices to build triangle strip | UE1, Goldsrc, Source, Witness (lightmap mesh parameterization) | Degenerate vertices can lead to rendering artifacts depending on hardware |
used separate vertex buffers for vertex attributes | Frostbite, idTech3, idTech4, UE3, UE4 | Interleaved data is more efficent |
blamed it on the driver | Every engine | Wastes time |
"fixed" shadow acne with subnormal bias | Irrlicht, Godot, Serious Sam | Floating point precision can lead to rendering artifacts |
surface area heuristic uses hyperbolic functions | Irrlicht, Frostbite | Geometry is Euclidean not hyperbolic, this is just completely wrong |
scene graph is a linked list | GL Quake, Serious Sam | Not very cache efficent |
mixing audio in render loop | Win Quake, GL Quake, qfusion (Warsow) | Ties audio mixing to framerate and hitches in rendering can cause audio aliasing |
blocking on hardware occlusion queries | Various | Defeats the purpose of culling (to speed things up; blocking is the opposite) |
skeletal animation done in scripting language | Total Annihilation, Natrual Selection 2, Unity | Skeletal animation is expensive, why would you do it in non-native code? |
wrote a geometry shader | Various "AAA" engines | Often slower than just feeding data from CPU due to how HW implements them |
environment mapping using different sky texture | Various | Reflections are incorrect |
block-compresssed tangent space normal maps | Various | Normal maps break when block-compressed |
font rendering with texture per-glyph | libass, Gutair Hero III | That's a lot of textures and texture binds |
wrote SIMD for unaligned data | idTech3, idTech4, Darkplaces, others | Processing unaligned data is slower than aligned and often slower than scalar |
integrated Scaleform | Wayforward, CryEngine, XCOM2, Several others. | Scaleform is huge and crashes linkers, it's also full of bugs, don't use it |
shipped a debug build | Skyrim | Debug builds run slower and often contain source code |
shipped with debugger because it didn't crash in debugger | Wing Commander (sort of) | No time to fix a bug |
modified debugger exception to hide a crash | Wing Commander | But time to hide it |
compiled with -ffast-math and physics became more interesting | Anything which uses Bullet. | Bullet depends on subnormals and other strange float quirkyness to work |
issued hardware occlusion queries for the HUD | Stardock (Galactic Civilizations) | The HUD is always visible why issue queries for it? |
render functions are virtual | UE3, UE4, CryEngine | Virtual dispatch on different renderables is not cache friendly |
glReadPixels without a PBO | Various | Blocks the render thread and forces a syncronization, i.e causes a hitch |
destroyed render resources after deleting graphics context | Various | Undefined behavior |
wrote software rasterizer because driver kept crashing | Epic (UT99) (Pixomatic) | Impressive but also a huge waste of time and technical debt |
level stored in XML | Various tile/side-scroller games | XML is the worst serialization format for levels |
shipped dedicated server bins for s390x only | Battlefield 1942 (x86 came later) | No one has s390x hardware |
game scripting language requires a SAT solver | Mono scripting (C# requires SAT) | SAT solving is expensive and confusing |
engine depends on Qt | Wayforward, Doomsday | Qt is a massive runtime dependency |
hybrid shader language built ontop of macros targeting GLSL and HLSL | Source 2 (togl), Doom 3 BFG, RAGE | The readability of Perl |
debug build is slower than running release build in valgrind | Neothyne | Valgrind emulates x86, imagine debug native slower than release interpreted |
incremental GC is called when player takes damage | Several shipped RenPy and Love2D games. | Need to hide the GC pauses somewhere |
in game updater uses bittorrent | WoW, Halo3 for PC. | Too cheap to host distribution so saturate everyone's internet instead |
in-house developed SWF renderer | Doom 3 BFG, RAGE | SWF has embedded Actionscript |
added whitespace because asset hashed to the same hash as another asset | Spyro: Enter the Dragon | Not enough time to replace the hash function |
engine (or engine components) are shared libraries | Source 2, Godot, Irrlicht | Waste of development time to maintain builds and offers no real benefit |
actually did something about "half pixel offset" in D3D that made things worse | Unity | Waste of development time to fix something that only made things worse |
used both OpenGL and D3D at the same time | CryEngine (Compute was GL) | Impressive but also requires extensions to share resources between contexts |
Ported to OSx and Linux by writing a D3D to OpenGL "porting layer" | CryEngine, Source | The time to develop that surely must've been more than just writing a GL backend |
Physics simulation fixes T-junctions in meshes each physics step | CryEngine | It's possible to simulate without making T-junctions to begin with |
Syncronization primitives implemented with shared memory and files (File system sync) | CryEngine | Using file IO to syncronize code |
User interface is a webbrower | Tabletop Simulator, Overgrowth, GTA V, Several others. | Massive dependency full of security holes |
Allocates all of system memory | Various | Waste of virtual address space makes context switching overhead more expensive |
Input event processing on audio thread | Bioshock Infinite | Audio heavy scenes drop input events randomly |
IPC using flat files on disk | XCOM | File explosion |
Oblique frustum is actually a cylinder | Starsiege: Tribes | Doesn't work and causes culling issues |
SIMD math code using virtual functions | No Man's Sky, Doom 3 BFG | Virtual dispatch breaks pipelining of SIMD on some older microarchitectures |
Serialized entity state as separate files (with more open FDs than a default install supports) | ARK: Survival Evolved | File explosion and requires ulimit adjustments to work on Linux due to FD limit |
native Linux/MacOS OpenGL port runs slower than Windows version in Wine | Source, Source2, Minetest | Bad port |
shipped with assertions enabled | Shovel Knight | Makes things slower and can cause confusion for users if one triggers |
bootstraps itself just so it can render its own icon set | Houdini | Excessive masturbation |
creates temporary files to format strings, which is then used as keys to reference objects | CryEngine | File io to format strings and also lookup hashtable values by key |
reference counted pointers for simple value types like vectors and events | Godot | Unnecessary |
everything inherits from a base object type | Godot, UE, UE2, UE3, UE4, CryEngine | OOP spelt backwards is POO |
decided to use a lesser supported graphics API than the one they wanted to use | Godot | Tons of extension wrangling that is buggy and requires driver workarounds |
Last active
October 7, 2024 07:07
-
-
Save graphitemaster/f8e6666c48fbedf6e554 to your computer and use it in GitHub Desktop.
Engine achievements
I mean opposed to an atlas of glyphs in one texture - here I mean each character / glyph is it's own texture.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Bitmap font you mean? BG2:EE does that as well. The "enhanced edition" of Infinity Engine.