I know the answer is that it doesn't support this, but here's what I'm
wanting to set up to give a clearer view.
Suppose you have a set of nested messages that represent the application
state of an entire application, in this case a game and its entities and
various other stuff. Here's a trimmed down example.
message Game{
required string name = 1;
// other info
message Entity {
required int32 uid = 1;
// other stuff, position, orientation, etc
}
repeated Entity entities = 2;
}
Basically what I want to do here, to avoid having to write a bunch of
external code to track last transmitted data set, etc, is to have a
persistent instance of this Game message. At first it will be empty, and
during the update each frame, or possible more infrequently, the game will
iterate its own internal lists and compare the newest data that's in the
real game objects with the data cached in these messages. The idea here is
that these messages represent the latest state of the world that has been
sent to the network client. When the real data differs from the cached data
in the message, I update that data and serialize that to a network packet
to send, and I'm left with the last sent network state in the message
hierarchy. If the state is small enough, I may even create an empty Game
message on the stack during this process that represents the network
packet, and as I'm looping through checking dirty data, build an updated
game state message with only the changed data since the last network
transmission.
With all this in mind, there is the issue of frequent iteration of a large
nested message structure, and the cache misses that come with that. Not so
bad on x86 architecture, but pretty bad on current gaming consoles. The
other issue is with frequently hammering the dynamic memory allocation.
This part can be alleviated a lot with how its used, like not creating
temporary messages on the stack to fill in. To avoid this, I can just
update the cached messages in place, and then send those messages
individually, instead of building up a full new Game message that contains
all the diffs of the entire hierarchy. I would kinda prefer to build up the
full snapshots of the changed state, as that would greatly simplify a
number of aspects of the application. I can maintain persistant Game
message allocations simply for building the diff state, but I was hoping
there was an option to utilize the stack more for temporary messages. One
goal for this type of application(a remote debugger), especially on certain
platforms like the consoles, is for a minimal additional performance and
memory footprint, because they are often already running on the upper end
of their capabilities.
For these reasons it would be pretty useful if there was an option for the
compiler to generate statically nested variables, and max length string
buffer according to proto markup. I'll press on and depending on whether or
not it turns out to badly effect performance maybe do some compiler
modifications myself.
Thanks for the help.
On Thursday, July 19, 2012 8:22:29 AM UTC-5, Evan Jones wrote:
>
> On Jul 18, 2012, at 16:14 , Jeremy wrote:
> > I understand, but if one wants to keep a large persistent message
> allocated and walk over it frequently, there is a price to pay on cache
> misses that can be significant.
>
> I guess you are wishing that the memory layout was completely contiguous?
> Eg. if you have three string fields, that their memory would be laid out
> one field after another? Chances are good that with most dynamic memory
> allocators, if you allocate this specific sized message at one time, the
> fields will *likely* be contiguous or close to it, but obviously there are
> no guarantees. I would personally be surprised if these cache misses would
> be an important performance difference, but as normal there is only one way
> to tell: measure it.
>
> If you want something like this in protobuf though, you would need to
> change a *lot* of the internals. This would not be a simple change. I
> suggest trying to re-use a message, and seeing if the performance is
> acceptable or not. If not, you'll need to find some other serialization
> solution. Good luck,
>
> Evan
>
> --
> http://evanjones.ca/
>
>
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/protobuf/-/3FyoW8V5NooJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/protobuf?hl=en.