add brief intro document
This commit is contained in:
1 parent
889487107e
commit
7f38b80fa8
2 files changed
+393
No files matched your search
@@ -0,0 +1,393 @@
|
||||
#LyX 1.5.0beta1 created this file. For more info see http://www.lyx.org/
|
||||
\lyxformat 262
|
||||
\begin_document
|
||||
\begin_header
|
||||
\textclass scrartcl
|
||||
\begin_preamble
|
||||
\usepackage{listings}
|
||||
\end_preamble
|
||||
\language english
|
||||
\inputencoding auto
|
||||
\font_roman times
|
||||
\font_sans helvet
|
||||
\font_typewriter courier
|
||||
\font_default_family default
|
||||
\font_sc false
|
||||
\font_osf false
|
||||
\font_sf_scale 100
|
||||
\font_tt_scale 100
|
||||
\graphics default
|
||||
\paperfontsize default
|
||||
\spacing single
|
||||
\papersize default
|
||||
\use_geometry false
|
||||
\use_amsmath 1
|
||||
\use_esint 1
|
||||
\cite_engine basic
|
||||
\use_bibtopic false
|
||||
\paperorientation portrait
|
||||
\secnumdepth 3
|
||||
\tocdepth 3
|
||||
\paragraph_separation indent
|
||||
\defskip medskip
|
||||
\quotes_language english
|
||||
\papercolumns 1
|
||||
\papersides 1
|
||||
\paperpagestyle default
|
||||
\tracking_changes false
|
||||
\output_changes false
|
||||
\author "swaits"
|
||||
\end_header
|
||||
|
||||
\begin_body
|
||||
|
||||
\begin_layout Title
|
||||
Signals and Slots
|
||||
\end_layout
|
||||
|
||||
\begin_layout Author
|
||||
Stephen Waits
|
||||
\end_layout
|
||||
|
||||
\begin_layout Date
|
||||
November 10, 2006
|
||||
\end_layout
|
||||
|
||||
\begin_layout Abstract
|
||||
This brief document provides an overview of the event and message handling
|
||||
system written for and used in the SCEA NBA PSP projects.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Section
|
||||
Goals
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Basic synchronous messaging
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Decouple game modules
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Appropriate parameter handling (i.e.
|
||||
no blind parms, casting parms, etc.)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Ease of use
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Lightweight
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Strive for elegant, clean, readable, and maintainable code
|
||||
\end_layout
|
||||
|
||||
\begin_layout Section
|
||||
History
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
When I started researching event messaging systems and libraries in early
|
||||
2004, I initially looked at what Qt and other similar libraries used.
|
||||
I ended up discovering libsigc++, which was my introduction to the signal/slot
|
||||
concept.
|
||||
Unfortunately, libsigc++, while fascinating, was much too big for my needs,
|
||||
so, I set out to write my own, simpler, lighter library.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Once I got the library predominately functional, we integrated it into our
|
||||
codebase.
|
||||
I found that it took very little explanation to bring other programmers
|
||||
up to speed on the concepts and practical use of signals and slots.
|
||||
After using them for a bit, everyone on the team agreed that we had benefited
|
||||
greatly from adopting this simple concept throughout our code.
|
||||
The signals rocked for us.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Today, I can confidently say that this single library alone bears great
|
||||
responsibility in the overall cleanliness and readability of our codebase.
|
||||
Without it, we'd have a giant pile of spaghetti by now.
|
||||
Instead, we have clear, simple, decoupled systems which all communicate
|
||||
via a common interface.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Section
|
||||
Usage
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Signals are effectively emitters.
|
||||
Slots are effectively callback functions, methods, or functors.
|
||||
\end_layout
|
||||
|
||||
\begin_layout LyX-Code
|
||||
\begin_inset ERT
|
||||
status open
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
|
||||
\backslash
|
||||
lstset{language=C++}
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
|
||||
\backslash
|
||||
begin{lstlisting}
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// create a signal
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
Signal< void, int /* x */, int /* y */ > OnClick;
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// A function matching the signal's type
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// (returns void, accepts 2 ints)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
void beep(int x, int y) { ...
|
||||
}
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// A class method matching the signal's type
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// (returns void, accepts 2 ints)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
struct Bark { void woof(int x, int y); }
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
Bark barker;
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// connect a regular function
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
OnClick.Connect( beep ); // beep becomes a Slot<void,int,int>
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// connect a member of a specific object
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
OnClick.Connect( &barker, &Bark::woof ); // woof is a Slot
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// emit
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
OnClick(10,20); // calls beep(10,20) and barker.woof(10,20)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// disconnect
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
OnClick.Disconnect( beep );
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
OnClick.Disconnect( &barker, &Bark::woof );
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
// note that this won't compile (type safety)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
void badbeep(int x, float y); // parameter mismatch
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
OnClick.Connect( badbeep ); // compile-time error!
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
|
||||
\backslash
|
||||
end{lstlisting}
|
||||
\end_layout
|
||||
|
||||
\end_inset
|
||||
|
||||
|
||||
\end_layout
|
||||
|
||||
\begin_layout Section
|
||||
In Practice
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
In our projects, we primarily use signals in two ways.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
First, we maintain a master list of global signals.
|
||||
These handle things such as a player stepping out of bounds, the ball hitting
|
||||
the backboard, a team calling timeout, and, basically everything that happens
|
||||
in basketball.
|
||||
This list of signals has grown quite large, but remains organized.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Standard
|
||||
Second, some classes include public signals.
|
||||
For example, class Clock might have a public signal named "Changed" which
|
||||
gets emitted any time its internal time is updated.
|
||||
The Clock object doesn't have to care if anyone connects - its responsibility
|
||||
ends at emission.
|
||||
Our UI system also makes heavy use of signals.
|
||||
\end_layout
|
||||
|
||||
\begin_layout Section
|
||||
Summary
|
||||
\end_layout
|
||||
|
||||
\begin_layout Subsection
|
||||
Positives
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Simple code is easy to use
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Emitter/Subscriber model is rather nice to use and allows for massive decoupling
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Synchronous emission
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Static type safety (this is a huge plus!!!)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Very easy to add to your project (it's almost entirely a template library)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Subsection
|
||||
Negatives
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Current implementation does use some dynamic memory
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Requires RTTI
|
||||
\begin_inset Foot
|
||||
status open
|
||||
|
||||
\begin_layout Standard
|
||||
RTTI is commonly thought to be the devil amongst uninformed game programmers;
|
||||
however, the only expense is one of a very slight size increase.
|
||||
Performance, possible slight caching consequences aside, generally remains
|
||||
the same.
|
||||
The convenience, in my opinion, vastly outweighs the cost.
|
||||
\end_layout
|
||||
|
||||
\end_inset
|
||||
|
||||
; though only on Connect/Disconnect/IsConnected calls (normally infrequent)
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Not a negative to most, but does use some template-fu to keep things easy
|
||||
on the outside
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Related to the template-fu, they can bloat; however, we've done our best
|
||||
to minimize this
|
||||
\end_layout
|
||||
|
||||
\begin_layout Itemize
|
||||
Return value heuristic never reached (i.e.
|
||||
what does the emitter return when calling multiple slots?)
|
||||
\end_layout
|
||||
|
||||
\end_body
|
||||
\end_document
|
||||
Binary file not shown.
Reference in new issue
Block a user