Expressive Output Window - Phased Rollout

Hi developers,

We have completed all of the work required for a production release of the Expressive Output Window. The new output window looks significantly different than when it was released into Beta and has some new behavior so we’re recapping features with the new design below.

If you are already familiar with the new functionality, feel free to skip ahead to details at the bottom on the new safe rollout process!

Features

Customize Your View

The output window allows full customization of the information presented with each message. Timestamp, message source and context, and table memory address can all be toggled on or off. There is also an option to print all tables expanded by default. Configure it for whatever you want to see!



Print(Tables)

Lua/Luau is all about tables - they’re everywhere! And now you can easily inspect them. With this release, using the print function on a table will print the full table contents with an expandable, explorable interface. By default, tables print collapsed with their memory addresses hidden. You can change this to print fully expanded tables and/or table memory addresses if you’d like.

No more being forced to write custom table unrolling functions - it just works!


Filter

Messages written to the Output Window are classified by their type and source. Using the filter dropdowns in the top left, you can restrict the output view to only show the desired messages. Filter options include the following:

  • Message Context (where the message originated from - Studio/Client/Server)
  • Message Type:
    • Output - default message type
    • Information - developer-facing Studio output
    • System - saved place, auto-saved place, etc.
    • Warning - you shouldn’t keep doing what you did
    • Error - something has gone horribly wrong

There is also a custom filter in the top right. Using this will filter all messages by whatever term is entered.

Search

The Output Window can contain a lot of messages. To help find exactly the one you want, we’ve added our good friend Search!

The Search bar can be invoked inside the Output Window by pressing Cmd+F (or Ctrl+F). Search scans all messages and respects any applied filters. It will expand any tables that contain a search match. Common features such as matching case, enforcing whole word match and regex (for the ambitious!) are also included.


Superfast Jellyprint - Print at the Speed of Render!

One of the important use cases we explored during the beta process was printing on every render frame. The Output Window seamlessly supports this use case, for you and your virtual band. In fact, in all cases the Expressive Output should perform better or at par with the legacy output window.

Phased Rollout Process

The output window is a core part of Studio functionality - it is a commonly used tool and we want to ensure that introducing new functionality does not break any existing workflows. In an effort to provide more transparency into the rollout process, we are introducing a new staged rollout, hereafter called “Phased Rollout”.

Here’s how it will work:

  • Today 11/30, we are launching the Expressive Output Window as a default-on Beta for a small but meaningful percentage of the Studio user base. This means some users will get the Expressive Output Window as their default experience. The new output can still be toggled on or off from the Beta Features menu.
  • Over the next week or so, we will progressively increase the rollout percentage to 100%.
  • If we uncover any breaking issues, we will roll the feature back to opt-in Beta.

Hopefully, this process can provide greater transparency on when you can expect to see changes in Studio. Many thanks to @IcyTides, @altisaltaccount, @Regal_Corgi, @iriszh, @sunny0724, and @darkmodeonn for getting us here!

162 Likes

This topic was automatically opened after 15 minutes.

There still seems to be some flaws with the output.

Printed Instances either return their memory address or their name, seems inconsistent.


Also found similar topics:

Will these be addressed? It will make using the expressive output even better. But thank you for these first improvements!

12 Likes

This isn’t a breaking bug, but one thing I notice lately is that some of the text cuts off:

Cut out text:

Adjusted to show all of it:

image

Near the blue dot, you can see ‘veryLongTerm’, which before it cut out to only show ‘eryLongTerm’ (image above this one). This can be problematic as it can hinder understanding of the error causing major delays later on. It seems like it’s a text is going off bounds when resizing the window.

I don’t know if this is only with errors, but I am willing to research a bit if I get DMed.

Also, for context, I feel like it would be quite useful to add a plugin context so that any output belonging to plugin-related scripts don’t distract developers from unnecessarily digging into it when their game is completely fine.

4 Likes

Amazing update. I’ve been using this as a beta feature for the last month.

The only issue I have is with multiline prints. The first line has a timestamp behind it, but the next lines have no indents, making them hard to discern from other prints.

image

11 Likes

Everything fine until the output tells me I let a problem fester

2 Likes

This is a pretty cool update, and I definitely love the feature to print tables the most. No need to use table.concat() or a for loop for that anymore. :smile:

2 Likes

Showcase looks fire, though I’ll prob wait a few days before I enable this

1 Like

There is a bug where the __tostring metamethod is called twice when used from a print with this new output window.

Reproduction:

print

local Test = {}
Test.__index = Test

function Test.new()
	return setmetatable({}, Test)
end

local times = 0
function Test.__tostring()
	times += 1

	return tostring(times)
end

print(Test.new()) -- 2

tostring

local Test = {}

Test.__index = Test

function Test.new()

return setmetatable({}, Test)

end

local times = 0

function Test.__tostring()

times += 1

return tostring(times)

end

tostring(Test.new())

print(times) -- 1
3 Likes

So, does this mean the ‘laggy’ behavior that was seen during the beta is no longer existent?
If that’s the case, that makes me satisfied. It was the only reason I did not use the beta feature.

10 Likes

My favorite thing in the world. You do not know how much this can help developers when we’re trying to test scripts by printing things only for it to lag a ton.

3 Likes

Nice update, any plans on saving the output context though? It’s annoying having to enable / disable the same contexts everytime I open studio.

3 Likes

Hmm, how about having an option to disable Roblox errors, currently there some kind of StudioGuide error flooding my output(Roblox errors). It get’s pretty annoying.

3 Likes

Are there any plans to integrate parts of the output window into the in-game console? I’m specifically looking at the table unrolling feature and the Search feature, but anything in the works?

6 Likes

That’s good that Roblox Staff has improved the output alot!
Thankss

1 Like

This output has been a LIFE SAVER for me. I have some application centers that use third-party storage options, I also have it make backups in the actual game itself, that way, if the third-party fails, the application can be restored. These backups are saved as a single, very big string. When the character count passes 16K, the Roblox TextBox (which I use in order to fetch a backup) cuts off the text. Same was happening with the old output. With this new output, I can finally see the ENTIRE string without having to separate it into smaller chunks.

Apart from that, the fact that you can print tables is just amazing. No longer do we have to make for loops just to print the contents of tables. The new output has also allowed for a more organized and easier debugging as I can filter out and hide output information and output sources that I do not need, and only keep the ones that are important.

After months of using this new output window, I don’t think I can ever roll back to the old one. This has truly been an amazing addition for the programmer community and I would love to see more stull like this in the future. Outstanding job to the people who worked on this.

3 Likes

I have this problem too.

Unrelated. Just wondering if there’s a list of error messages somewhere because as I grow as a developer, I will come across messages I don’t fully understand. Clicking the message takes me to the line with the error but sometimes that’s not enough. I would like one of the links that points to the error to jump out of studio toward an explanation or example of how to correct the issue. I don’t know if that makes sense but I get stuck and end up trying to rewrite whole scripts to fix problems. Perhaps there’s a better way.

I love being able to read tables in the output!.

Thanks!

4 Likes

The change to how print and warn handle non-primitive types is annoying, please revert it.

What I mean is the change from this:
image

to this:
image

While I understand the intent, it’s just outright less useful and impedes readability at times:

image

vs

image

9 Likes

Can second this, this is really inconsistent behavior, if you print multiple string types it does not use quotes, but as soon as you introduce e.g. an instance, every distinct string argument gets printed with quotes. It’s very awkward and totally changes behavior people have been developing against and expecting for many years.

e.g. print("player", playerVar, "joined") is a rather lazy way to define a log statement, but this style is very likely used in real games, and almost certainly used for quick debugging. Now it prints as "player" PeZsmistic "joined" which is awful to read.

8 Likes

I can second this. I’ve always been the type of person to type print(x, y, z) rather than print(x .. ' ' .. y .. ' ' .. z), since it’s way faster and also easier for my eyes to read. How the new output window handles this is really annoying behavior which you cannot disable.

3 Likes