▶
Logic World Wednesdays: The Optimized Edition
Ive improved the time it takes to load into a saved game by about 50%. [previewyoutube=ki0HPZN5pes;full][/previewyoutube] Theres still more work to be done to improve this further, but Im very happy with the progress so far.
Sockets are a component that lets you plug circuits into other circuits. When a sockets conductive blue part is touching the conductive blue part of another socket, they form a connection, and signals can be transmitted through them. Whenever a socket is placed, moved, or rotated, it needs to check whether its touching any other sockets, to determine if it should form a connection with them. Until this week, this was done by checking against every single socket in the world. This, obviously, is terrible; it means that the complexity of checking for socket connections increases exponentially as more sockets are added to the world. In nerdspeak, the operation was O(n^2). Now, sockets only check against other sockets that are nearby. The world is divided into a 3D grid of cubic cells, and all sockets are indexed by which cell they are in. When checking for connections, a socket checks only against sockets in its own cell and in the 26 surrounding cells that have a point of contact with the base cell. While this system is somewhat slower when youre in a world with just a few sockets, it critically does not get slower as more sockets are added to the world. Theres a hard upper limit to how slow the operation can get; in nerdspeak, the operation is now O(1). When you have a world with several thousand sockets, testing for connections is now massively, massively faster.
Fixing this fixed a lot of the slowdown when loading worlds, as can be seen above.
This week Ive been working on a bunch of minor website improvements:
All objects in Logic World are divided into chunks. A chunk is a single, solid, giant chunk of geometry in the shape of many smaller objects. You stupid, gullible players are tricked into thinking there are thousands of objects in a world, but in reality there are only a few dozen. Chunking is the major reason why were able to have thousands of components and wires in a world without lag; GPUs are much better at rendering a small number of complex objects than a large number of simple objects. Before this week, chunks were assigned along a 2D axis. Picture a checkerboard grid on a plane within the 3D world. Each chunk existed as a column: finite along two axes, but expanding infinitely into space along the Y axis. But this week Ive overhauled the system to work properly in 3D: a 3D system for a 3D world. This is an important step for optimization, and its already sped up performance somewhat by allowing for better frustrum culling in some situations. Its also absolutely necessary to properly support world types that have a non-standard floor shape -- such as a spherical planet, or the inside of a giant cylinder -- which is something I really want to do. Ive also added a debug mode that colors all objects in a chunk with a random color, so you can visualize where the cunk boundaries are. I think it looks quite pretty :)
In the process of adding 3D chunks, I did a particularly satisfying refactor of our WorldRenderer class, which had grown very bloated and nasty in the ~1.5 years since it had been created. WorldRenderer used to be about 600 lines and do several different things; now its been split into four smaller, more focused classes, each 100-200 lines.
This week Ive implemented LZ4 compression on many of the network packets sent between the Logic World server and the client. LZ4 is an extremely efficient compression library: it makes data way smaller in exchange for a very small performance impact. However, the performance impact is not zero: its around 10% slower to serialize or deserialize a packet when using compression. So compression should only be used in the specific situations where the increased serialization time is outweighed by the decreased packet size. I spent about a day trying to build a system that would automatically detect whether compression should be used for every single packet. However, this ended up being insanely convoluted and not worth the effort at all. Instead, were now using a simple system where some packet types are always compressed, and some packet types are never compressed. My original code for this was kinda trash ngl, but as he often does, Felipe swooped in and made my code way cleaner and better organized. In the process, he also allowed mods to specify that their packet types should be sent compressed. Thanks Felipe! Because of packet compression, it is now about 75% faster to download world updates from the server and to upload your world changes to the server.
Ive started adding some customization options for your hotbar! The hotbar is some of the most used and most important user interface in Logic World, and its important that everyone is able to set it up exactly how they want it.
This is all part of my endeavor to refactor the hotbar code. The hotbar code is some of the oldest and worst code in Logic World, written at a time when I knew a lot less about coding and a lot less about coding user interface. It desperately needs to be cleaned up if Im to add features to it.
[ 2020-10-22 04:27:28 CET ] [ Original post ]
Welcome back to Logic World Wednesday! Were hard at work on your game, and this week weve been focused on optimization.
Super Speedy Save Loading - Jimmy
Ive improved the time it takes to load into a saved game by about 50%. [previewyoutube=ki0HPZN5pes;full][/previewyoutube] Theres still more work to be done to improve this further, but Im very happy with the progress so far.
Socket Slowdown Solution - Jimmy
Sockets are a component that lets you plug circuits into other circuits. When a sockets conductive blue part is touching the conductive blue part of another socket, they form a connection, and signals can be transmitted through them. Whenever a socket is placed, moved, or rotated, it needs to check whether its touching any other sockets, to determine if it should form a connection with them. Until this week, this was done by checking against every single socket in the world. This, obviously, is terrible; it means that the complexity of checking for socket connections increases exponentially as more sockets are added to the world. In nerdspeak, the operation was O(n^2). Now, sockets only check against other sockets that are nearby. The world is divided into a 3D grid of cubic cells, and all sockets are indexed by which cell they are in. When checking for connections, a socket checks only against sockets in its own cell and in the 26 surrounding cells that have a point of contact with the base cell. While this system is somewhat slower when youre in a world with just a few sockets, it critically does not get slower as more sockets are added to the world. Theres a hard upper limit to how slow the operation can get; in nerdspeak, the operation is now O(1). When you have a world with several thousand sockets, testing for connections is now massively, massively faster.
Fixing this fixed a lot of the slowdown when loading worlds, as can be seen above.
Even More Web Fun - Felipe
This week Ive been working on a bunch of minor website improvements:
- All timestamps are now updated every 30 seconds to more accurately show the age of recent posts and comments.
- The scroll position will now be properly saved and restored once the page is fully loaded when navigating to and from pages, or reloading.
- Comment permalinks now work properly
- Fixed quote formatting not working
- Fixed comments not being sorted by date.
- You can now edit comments, and the date and time of a comments last edit will now be displayed alongside the original post date.
- Added Related posts column to all posts with a list of the newest posts in the forum that the current post is in.
Cubic Chunks - Jimmy
All objects in Logic World are divided into chunks. A chunk is a single, solid, giant chunk of geometry in the shape of many smaller objects. You stupid, gullible players are tricked into thinking there are thousands of objects in a world, but in reality there are only a few dozen. Chunking is the major reason why were able to have thousands of components and wires in a world without lag; GPUs are much better at rendering a small number of complex objects than a large number of simple objects. Before this week, chunks were assigned along a 2D axis. Picture a checkerboard grid on a plane within the 3D world. Each chunk existed as a column: finite along two axes, but expanding infinitely into space along the Y axis. But this week Ive overhauled the system to work properly in 3D: a 3D system for a 3D world. This is an important step for optimization, and its already sped up performance somewhat by allowing for better frustrum culling in some situations. Its also absolutely necessary to properly support world types that have a non-standard floor shape -- such as a spherical planet, or the inside of a giant cylinder -- which is something I really want to do. Ive also added a debug mode that colors all objects in a chunk with a random color, so you can visualize where the cunk boundaries are. I think it looks quite pretty :)
In the process of adding 3D chunks, I did a particularly satisfying refactor of our WorldRenderer class, which had grown very bloated and nasty in the ~1.5 years since it had been created. WorldRenderer used to be about 600 lines and do several different things; now its been split into four smaller, more focused classes, each 100-200 lines.
Packet Compression - Jimmy
This week Ive implemented LZ4 compression on many of the network packets sent between the Logic World server and the client. LZ4 is an extremely efficient compression library: it makes data way smaller in exchange for a very small performance impact. However, the performance impact is not zero: its around 10% slower to serialize or deserialize a packet when using compression. So compression should only be used in the specific situations where the increased serialization time is outweighed by the decreased packet size. I spent about a day trying to build a system that would automatically detect whether compression should be used for every single packet. However, this ended up being insanely convoluted and not worth the effort at all. Instead, were now using a simple system where some packet types are always compressed, and some packet types are never compressed. My original code for this was kinda trash ngl, but as he often does, Felipe swooped in and made my code way cleaner and better organized. In the process, he also allowed mods to specify that their packet types should be sent compressed. Thanks Felipe! Because of packet compression, it is now about 75% faster to download world updates from the server and to upload your world changes to the server.
Hotbar Customization - Jimmy
Ive started adding some customization options for your hotbar! The hotbar is some of the most used and most important user interface in Logic World, and its important that everyone is able to set it up exactly how they want it.
This is all part of my endeavor to refactor the hotbar code. The hotbar code is some of the oldest and worst code in Logic World, written at a time when I knew a lot less about coding and a lot less about coding user interface. It desperately needs to be cleaned up if Im to add features to it.
Bugs Fixed This Week
- Fixed sometimes not getting your position set by the server properly when you load into a world
- LogicSettings: fixed being unable to save or load settings with a value of null
- The game won't complain anymore if you've added files to the Backups folder that don't conform to its expected folder structure
[ 2020-10-22 04:27:28 CET ] [ Original post ]
Logic World
Mouse Hat Games
Developer
Mouse Hat Games
Publisher
2021-10-22
Release
Game News Posts:
106
🎹🖱️Keyboard + Mouse
Very Positive
(271 reviews)
Public Linux Depots:
- Logic World - Linux [1.75 G]
Build. Program. Simulate. Logic World teaches you how circuits do math.
Key Features
- Digital Logic - Build circuits that work the same way real world computer chips do.
- Challenges - Solve puzzles from simple logic gates to complex machines like calculators and data storage.
- Multiplayer - Logic World is built from the ground up for collaborative multiplayer. Take on Challenges with your friends or build together freely in Sandbox mode.
- Performance - Build massive circuits and simulate them at thousands of updates per second - all without lag.
- Modding - Logic World features powerful modding tools - the same tools the developers are using to make the game.
- Online Hub - Players can upload their builds, mods, and custom challenges and share them with other players.
MINIMAL SETUP
- OS: Ubuntu 14.04
- Processor: 2.4GHz Quad CoreMemory: 8 GB RAM
- Memory: 8 GB RAM
- Graphics: Intel HD Graphics 4000 or AMD Radeon R5 series
- Storage: 2 GB available spaceAdditional Notes: system requirements might be adjusted before release
GAMEBILLET
[ 6138 ]
GAMERSGATE
[ 3395 ]
FANATICAL BUNDLES
HUMBLE BUNDLES
by buying games/dlcs from affiliate links you are supporting tuxDB