ReplicaNet Release notes
The workspace for all example projects are contained in
the 'Examples' directory. The workspace file for Visual Studio
6.0 is 'Examples\Examples.dsw'. The DotNET2008 solution file
is 'Examples\Examples2008.sln'. etc.
Each example has a "readme.txt" file that explains the brief outline
of each example.
Example 4 is a particularly useful example that shows how to
use ReplicaNet inside a typical game situation where the game uses classes for
each object.
The 'Docs' folder contains Doxygen generated documentation and CHM
files for this build of
the libraries
The components to ReplicaNet are in the ReplicaNetPublic
folder. Your include directories need to be set to "ReplicaNetPublic/Includes".
The relevant library for the
type of build you require must be linked from "ReplicaNetPublic/Libs".
The tutorial index can be found in "Tutorials\index.html"
Important!
Due to no demand for VC2003 and VC2005 builds only VC6 and dotNET2008 builds are currently available for download via RNProductUpdate. The dotNET2003 and dotNET2005 builds are currently only available by request to technical support.
Visual Studio 6
The library files for MSVS6.0 can be found in 'ReplicaNetPublic\Libs\LibVC6'.
This SDK has been
tested with service pack 5 and 6. Without one of these
compiler service packs installed it is unlikely that any of
the DirectX examples will compile. The service packs can be downloaded
from:
http://msdn.microsoft.com/en-gb/vstudio/aa718359.aspx
dotNET2008 builds.
The library files for dotNET2008 can be found in the
'ReplicaNetPublic\Libs\LibDotNET2008' directory.
This SDK has been
tested with service pack 1. Without this service pack it is
unlikely that any of the libraries will link with your
application. The service pack is available from Microsoft Update.
The RNReplicaNet library contains all code normally found in the separate libraries for the VC6 build.
CLR Versions of the library are also provided, when using CLR or native code be sure to use the correct CLR or native library otherwise difficult to debug memory problems can happen.
The x64 versions of the libraries are included in the x64 directory.
DLL library builds for this compiler version can be requested from technical support.
Linux
The library files, headers and tools for Linux can be found in the 'ReplicaNetLinux.tar.gz' archive.
The latest version of ReplicaNet has been tested with Suse 10.2 and GCC 4.1.2.
Xbox and Xbox360
The Xbox and Xbox360 versions are only available to registered Microsoft
developers. Please contact your Microsoft account manager who will be able
verify your developer status with us. Playstation2
The Playstation2 version is only available to Sony
registered developers. Please contact your Sony account
manager who will be able verify your developer status with
us.
Common headers
The header files for all builds are in the 'ReplicaNetPublic\Includes' directory.
Examples
The 'Demo1' directory now contains the "Planes and Dolphin" demo with integrated lobby and statistics tracking.
Workspace DSW and solution SLN are available in the 'Examples' directory.
The solution 'Examples_2008.sln' is used by dotNET2008.
Windows build notes
Using the wrong library version for the wrong compiler version will generate very
strange errors at link time.
Be sure to include the correct runtime code generation options in your
project. Recently some very odd crashes and memory corruption bug
reports were submitted that were tracked down to a developer mixing
Multithreaded DLL ReplicaNet libraries with third party single-threaded
libraries.
DotNET2008 may produce "libci.lib" link problems when using
some versions of the DirectX SDK. To resolve this problem add "libci"
to Project Properties->Linker->Input->Ignore Specific Library.
The graphical examples use the Microsoft® DirectX® 9.0 SDK Update (April 2005)
with patches for Visual Studio 6.0 from the Microsoft® DirectX® 9.0 SDK Update (Summer 2003)
and this was used to test the installation. This DirectX
version still maintains compiler support for Visual Studio 6.0
where later DirectX SDK versions remove this compiler
support. The
library and header files for this version of the DirectX SDK
can be downloaded from http://www.replicanet.com/DX90SDK.zip.
Some of the RNLobby examples use the Microsoft® WTL library.
The Visual Studio 6.0 projects have been tested with WTL 7.1
(mirror)
The dotNET2008 projects have been tested with WTL 7.5
(mirror)
After decompressing the relevant archive add the WTL include path to the compiler include directory paths.
The Windows Platform SDK used with Visual
Studio 6.0 is Windows Server 2003 PSDK Full Download with Local Install
and is available from http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
To get technical support on any issues you may have please email
techsupport@replicanet.com
Release V6.2
Additions and changes to the
ReplicaNet API
-
Added DataBlock_Predict_Float::ReplicaContinuityBreak() to allow local replica extrapolation/interpolation to be used until an update arrives from the network.
-
The RNVisualDebugger tool has been updated to allow selection of the
packet graph to highlight and filter packet updates. This allows unusual packet
data to be analysed to find ReplicaObject updates causing bandwidth spikes.
Additions and changes to the
RNLobby API
-
ODBCSQL TransactionBegin(), TransactionRollback
and TransactionCommit() have been added to aid
readability of SQL related transactions. The related SQL
commands will also still work as intended.
-
UserClient ChatRoomAdminMessage(), ChatRoomSay() and ChatRoomWhisper() all now accept user defined flags that can be used by the application.
-
BaseTransportServer::GetNumTotalSessions()
has been added.
-
UserClient::CallbackChatRoomMessage() the flags have changed from
size_t to be unsigned int.
-
UserServer now has the ability to lock user account details such as
email address and password.
-
Added RNSimpleScriptCompiler and RNSimpleScriptDebugger to allow
scripting to be used with the StatServer and StatClient. Example12 and Demo1
examples demonstrate persistent user data.
-
Added RNAdminTool be able to upload files to the StatServer.
Additions and changes to the
RNXPURL API
-
TransportConfig::SetExtraPacketSecurity() allows the packet security
to be enabled or disabled. Versions of RNXPURL prior to 6000 (ReplicaNet 6200,
RNLobby 0700) do not use this extra security. To allow later versions to connect
to earlier versions use SetExtraPacketSecurity(false). All old clients will
still be able to connect to new servers. Security will be disabled for those
connections.
Global changes
Release V6.1
Additions and changes to the
ReplicaNet API
-
The compression algorithm has been changed so it is slightly quicker than before, uses half as much memory and compresses slightly better with test data.
-
Example2 has been updated to show hExample2 has been updated to show how to pass variable length parameters with network function calls.
-
Added a virtual function
ReplicaNet::SetSessionIDCallback() to allow the session IDs to be calculated by the user instead of the code. For example, random session IDs.
Additions and changes to the
XPSession API
Additions and changes to the
RNLobby API
-
UserClient::CallbackUserLoginFailed() changed to add
a "const Reason reason".
-
Added the ability to kick and ban users
from the UserServer and created chat rooms with the
functions UserClient::ChatRoomKickUser(),
UserClient::GlobalKickUser(),
UserClient::CallbackGlobalKicked(), UserClient::CallbackChatRoomKicked().
-
Whispering and friend messages added to
RLHub.
-
Added RLCOMUser which is a helper object that can be used with ASP pages to reset passwords.
-
Added the ability to change password and
email address using the functions
UserClient::ChangePassword(), UserClient::ChangeEmail().
-
Added a user state option function
UserClient::PlayingAGame().
-
Statisics and tracking updates using StatServer and StatClient.
-
GameLobby and Demo1 game demonstration with integrated user and statistics tracking using ASP web hosting. The full source is included as part of the Developer Premier SDK. The page for player ranking information is available at this report page
Release V6.0
Additions and changes to the
ReplicaNet API
-
A new object migration option ReplicaNet::kMigrateObjectsToNewMaster
has been added to SetOnSessionError()
-
DataBlock_Predict_Float has been updated
to include a 16 bit short floating point value or delta.
This can reduce bandwidth for frequently updated
floating point numbers using this DataBlock type. See SetValueShortFloat()
and SetDeltaShortFloat()
-
Added ReplicaNet::CallbackMasterSessionIDChanged()
-
Added GetLatencyToSessionID() for ReplicaNet and XPSession.
-
Added SetBand() to the ReplicaObject and
DataBlock updates. The band parameter allows the
object to send reliable updates and ensure they are in original order grouped by band.
Additions and changes to the
XPSession API
-
Added GetLatencyToSessionID() for ReplicaNet and XPSession.
-
DataSendToSession() and DataSendToSessionReliable()
now have an extra band parameter. This allows the user to send reliable packets and ensure they are in original order grouped by band.
Additions and changes to the
RNLobby API
Bug fixes
-
After session migration sessions would receive the same data packets from the new host twice if the packet was sent with
kXPSessionBroadcastID, data packets are now only sent
once.
-
After session migration the new host would not calculate ping to the remaining peers.
The ping to peers is now calculated by the new host.
Release V5.9
Additions and changes to the
ReplicaNet API
-
Added TransportConfig::SetExternalIP() and TransportConfig::GetExternalIP()
-
Speed optimised pending connections for
TransportUDP.
-
Added DataBlock_Predict_Float::SetSnapToDifference()
allows this replica DataBlock to snap to the extrapolated value if the difference is greater than the configured difference.
-
Added DataBlock_Predict_Float BoundaryEnable(), BoundaryDisable(), BoundaryWrapAround(), BoundaryCapped(), BoundaryLowerUpper(), BoundaryApplyToMaster() to allow values that wrap around or are clamped.
-
The documentation for all components is
now included as one file with all classes
cross-referenced.
Bug fixes
-
Xbox360: When calling PlatformHeap::ForceFree()
the Live registered transport is now de-allocated at the
correct time.
-
Transport::GetPeerURL() now returns
std::string("") when there is no peer.
-
ReplicaNet::GetTime() and GetLocalTime()
are now called during PlaybackAdvanceTo()
-
When using manual ReplicaNet polling and
the poll rate is less than one call per second the DataBlock_Predict_Float
simulation has been improved.
Breaking changes
Release V5.8
Additions and changes to the
ReplicaNet API
-
ReplicaObject::FindDataBlock() now registers all DataBlocks before trying to find attached blocks.
-
Added DataBlock_Predict_Float::SetLagged() which allows this DataBlock to use interpolation and permanently lag the changes made to the variable attached to this DataBlock.
SetLagged() has also been added to the Predict_Float ROL
language file.
-
All library DataBlocks now have protected member variables to allow user extensions to have access.
-
Added a delaySeconds parameter to
ReplicaObject::DelayedDelete() to allow the object to be delay deleted in delaySeconds amount of time.
-
The documentation regarding
ReplicaNet_MemoryTotalsEnable() and REPLICANET_ALWAYSDOMEMORYTRACKING has been updated.
-
To allow ReplicaObjects to
become dormant or active after a specified time period
added ReplicaObject::
UpdateSendDormantDelay()
UpdateSendDormantDelayCancel()
GetUpdateSendDormantDelay()
UpdateSendDormantDelayStateChange()
Release V5.7
Additions and changes to the
ReplicaNet API
-
Added the ROL command "namespace" to allow C++ classes from different namespaces to be defined.
-
Added
PlatformInfo::SetProcessorReplicaNet()/SetProcessorXPSession()/SetProcessorXPURL() to allow the preferred processor for each of the components.
-
Added Thread::SetPreferredProcessor() to allow the preferred processor to be set for the thread.
Calling PlatformHeap::ForceFree() will call XPSock_Quit() if
XPSock_Init() was previously called.
-
Added ReplicaObject::GetProcessingDataBlocksFromSessionID() to return the originator sessionID while processing DataBlock updates.
-
Added ReplicaObject::Unpublish() with the supporting callbacks CallbackObjectUnpublishPre() and
CallbackObjectUnpublishPost()
-
Added delayed deletion of ReplicaObjects
with ReplicaObject::DelayedDelete(), DelayedDeleteCancel()
and GetDelayedDelete().
-
Added ReplicaNet::ObjectListFind() to find a ReplicaObject from its sessionID and
uniqueID.
-
Changed the internals of the MutexClass to use critical sections on Windows and Xbox/Xbox360 builds.
-
Added ReplicaObject::IsPublished().
-
Added ReplicaObject::UpdateSendDormant() and
ReplicaObject::GetUpdateSendDormant() to set a ReplicaObject as dormant and not
send any DataBlock updates. Dormant objects use less
processor time because DataBlocks are not checked.
-
Xbox360: Updated the samples to use VC2005
-
Xbox360: Added the option to use VisualDebugger connections
with Test2, currently enabled in the Debug build.
Additions and changes to the
RNLobby API
-
RNMakePatches: When uploading files using FTP and the patch index has been done then use FtpDeleteFile to delete old patches that are not used in the live index.
-
Removed the RNSQLite database library and
replaced it with an RNODBC interface.
-
RNLobby now uses MySQL via ODBC.
-
The RLSrv services are now dependant on
the database service.
-
AdvertiseClient queries can now use
complex filters based on the rules supplied for each
entry.
-
UserClient::AddUserInfo() allows
UserInfo from a loginID to be requested and watched in a
similar manner to the friends list.
-
Added UserClient::
CreateChatRoom()
LeaveChatRoom()
EnterChatRoom()
GetCurrentRoom()
ChatRoomAdminMessage()
ChatRoomSay()
ChatRoomWhisper()
-
The Backend now does not need to be
allocated before other RNLobby classes. However the
Backend class must still successfully complete before
other RNLobby classes are started or connected to the
servers.
-
RLHub is an example of a win32 MFC
application using the RNLobby API to provide a user,
friend, chat and game listings services.
Bug fixes
-
Fixed the linking problem static MFC
static libraries.
-
Xbox360: Fixed an assert complaining about an invalid handle when calling
ShutdownNetwork(true)
-
Changed the AdvertiseServer rule and user update to be atomic.
-
Fixed an issue when trying to call
networked ReplicaObject functions before the object has
been published.
-
Vastly improved performance with more than 100 connections.
Release V5.6
Additions and changes to the
ReplicaNet API
-
Protocol "NATUDP@" with
RNLobby can be used by XPURL, XPSession and ReplicaNet
to provide NAT/firewall defeating.
-
Example11 has been added to show how to
use RNLobby services with ReplicaNet.
-
Added templated operator<< and operator>> to DynamicMessageHelper
-
Removed compiler warnings for gcc 4.x in -pedantic
mode. Rebuilding RNROLCompiler generated files will also
help.
-
There is now no limit to the number of parameters for ReplicaObject networked function calls using
DataBlock_Function.
-
Example1 has been updated to include a simple DataBlock_Function example.
-
Example10 has been added to show example use of RNReplicaNet::RNLobby::ProductPatcher
-
XPSock_UrgentSetRawMode(),
XPSocketUrgent::SetRawMode() and
XPSockUrgent::ProcessACKS(), XPSockUrgent::SendWithACK(),
XPSock_UrgentListen() have been removed because they are
obsolete.
-
XPSock_GetAddress() will no longer return 0.0.0.0 as the address of a listening TCP or UDP socket. The IP address of the host will be used. This matches the
Transport::GetAddress() behaviour.
-
XPSock_UrgentCreate(), XPSock_Listen(),
XPSocketUrgent::Create() and XPSocket::Listen() have been updated to include an address
to bind to for the socket. This is useful for multihomed machines.
-
Added ReplicaNet::FindSession(const std::string protocols)
-
Using a debug ReplicaNet DLL library and forgetting to call
REPLICANET_DLLPREREGISTER() will trigger an assert.
-
Added -P option to the RNROLCompiler to allow pre-compiled header files to be added to the output cpp file.
-
Added XPAddress:Import() to import a
string in x.x.x.x:x format.
-
MessageHelper::SetGuardSize() can be
used to throw a C++ exception of type
MessageHelper::Exception()
when the data is read from beyond the end of a message.
-
Added: XPSock_ICMPCreate(),
XPSock_ICMPSendPing(), XPSock_ICMPRecvPing(),
XPSock_ICMPWaitForPing()
-
TransportUDP has been optimised for
processor time and memory use.
Additions and changes to the
RNLobby API
-
This version of RNLobby is in the alpha stage of development and as such may be subject to substantial changes until beta.
-
Binary difference patch creation and delivery.
(RNMakePatches tool/Patcher)
-
Backend availability and TitleID verification.
(BackendServer/BackendClient)
-
Internet CD/License key verification. (CodeServer /
CodeClient)
-
NAT Detection. (NATDetectServer /
NATDetectClient)
-
NAT Resolving. (NATResolver) TransportNATUDP for use with XPURL/XPSession/ReplicaNet uses
NATResolver.
-
Advertising and querying of sessions
player list and rule list. (AdvertiseServer /
AdvertiseClient)
-
Added LAN only operation for
AdvertiseClient.
-
User account create/authenticate, friends list, game invites and
persistent data storage. (UserServer / UserClient)
-
All servers now have service modules.
For Win32 these are be configured to start with the
system and restart on error.
-
RLSrvMonitor can be used to produce an
HTML report to a file which is useful for producing web
based reports. ( http://www.rnlobby.com/RLSrvMonitor.html
)
-
RLServerMonitor is a Win32 GUI
application to display the status like RLSrvMonitor.
Bug fixes
-
Calling PlatformHeap::ForceFree() will call
XPSock_Quit() if XPSock_Init() was previously called.
-
Fixed a bug in MutexClass::~MutexClass() where a mutex handle was being closed before it was
released on Win32 platforms.
-
Fixed a deadlock issue with the database
when many threads and processes were accessing it at the
same time.
Proposed deprecation
The next version of ReplicaNet is planned to deprecate
the includes (and classes included in) DatabaseManager.h and
Database.h
Please email techsupport@replicanet.com
if you wish to discuss or find out more about this
particular change.
Release V5.5
Additions and changes to the API
-
A quick view of functions added:
ReplicaNet::CallbackPlaybackAdvanceToFinished()
[ReplicaNet/XPSession]::DataReceivePeek()
-
Packets larger than 512 bytes can now be
sent through XPsession::DataSendToSession[Unreliable/Certain/Reliable]
and ReplicaNet::DataSend().
-
ReplicaObject updates can now be any
size, memory permitting.
-
The version of the ReplicaNet recording files has been increased. Previous versions will not playback with this version of ReplicaNet.
-
ReplicaNet::CallbackPlaybackAdvanceToFinished()
has been added as a callback to signal when the last
requested ReplicaNet::PlaybackAdvanceTo() finishes.
-
A DataBlock reason event called kDataBlockReason_AfterDataBlocksReceived
has been added to provide better flexibility for the
ReplicaObject::PostObjectCreate() event.
-
Processing DataBlock updates has been
optimised.
-
ReplicaObject::DataSend() and
ReplicaObject::CallBackDataReceive()
have been added to allow ReplicaObject derived classes
to send and receive raw data.
-
XPsocket::Send(), XPSocket::Recv(),
XPSock_Send() and XPSock_Recv() now propagate XPSOCK_ECLOSED to the last
xoscket error when a connection failed to connect.
-
RNReplicaNet::StrDup() has been added
to RNPlatform/Inc/StrDup.h to avoid problems with
dotNET2005 warning _strdup has been deprecated.
-
Code changes have been made to remove
warnings when compiling with Linux Suse 9.3
-
TransportConfig::SetPacketMTU() has
been added to allow the the MTU of packets to be set when using packet buffering.
Bug fixes
-
When network packet loss emulation is
enabled some memory was allocated after calling
PlatformHeap::ForceFree().
-
After deleting an XPSession instance
and allocating a new instance to connect to the same
server within thirty seconds some Certain packets were
lost.
-
XPCompression now uses the DLL export
API to avoid having to statically link this library.
-
XPAddress operator == and != tests the
port number with the IP address.
-
ReplicaObject::PostObjectCreate() was not being called when in playback
mode.
-
RNXPURL.DLL DebugMTDLL/ReleaseMTDLL builds were not using the correct code generation options.
Release V5.4
Additions and changes to the API
-
A quick view of functions added:
ReplicaNet::SetPlaybackSpeed()
ReplicaNet::PlaybackAdvanceTo()
ReplicaNet::GetSessionRecord()
XPSock_GetHardwareStatus()
[ReplicaNet/XPSession]::[Set/Get]NodeBuffers()
-
ReplicaNet and XPSession have session
manager and ReplicaObject database optimisations.
-
ReplicaNet and XPSession can utilise
extra memory to offset thread synchronisation costs by
using SetNodeBuffers().
-
Network session recordings can now be
started at any time and are not limited to starting
before a session is created or joined.
-
Playback of a network session recording
can be paused or played at any other speed or advanced
to any future time.
-
When a playback of a recording finishes
ReplicaNet::GetSessionErrorReason() returns ReplicaNet::kReplicaNet_EEND_RECORDING
-
Extra debugging information is shown by
RNVisualDebugger for DataBlocks, including
function parameters and other parameters used to
configure the DataBlock to show if/when those values are
changed by the user.
-
When RNVisualDebugger makes a successful
debug connection to a ReplicaNet session the address of
the node is included in the debug file.
Bug fixes
Release V5.3
Additions and changes to the API
-
A quick view of functions added:
ReplicaNet::BeginSessionRecord()
ReplicaNet::StopSessionRecord()
ReplicaNet::CallbackSessionRecord()
ReplicaNet::BeginSessionPlayback()
ReplicaNet::StopSessionPlayback()
ReplicaNet::CallbackSessionPlayback()
ReplicaNet::GetSessionPlayback()
ReplicaNet::SetPlaybackAllowMasterReplicaObjects()
ReplicaNet::GetPlaybackAllowMasterReplicaObjects()
DebugHandler::CallbackConnectionError()
ReplicaNet::CallBackAllocate()
ReplicaNet::CallBackDelete()
Transport::GetTransportClosed()
XPSession::GetSessionErrorReason()
ReplicaNet::GetSessionErrorReason()
Transport::SetEnableLANDiscovery()
XPSession::SetAllowConnections()
XPSession::GetAllowConnections()
ReplicaNet::SetAllowConnections()
ReplicaNet::GetAllowConnections()
-
Recording and playback of ReplicaNet
sessions is now possible using the SessionRecord/SessionPlayback
functions. The CallbackSessionRecord/CallbackSessionPlayback
functions allow the user to implement their own storage
solution for the data. Example4 has been updated to use
this functionality.
-
Added virtual void
DebugHandler::CallbackConnectionError() to allow visual
debugger connection errors to be detected.
-
ReplicaNet::CallBackAllocate() and
ReplicaNet::CallBackDelete() allow users to override the
ReplicaObject allocation and deletion behaviour from a
callback.
-
Example 2 has been updated to show how to add custom data types to networked function parameters.
-
Transport::GetTransportClosed(),
XPSession::GetSessionErrorReason() and
ReplicaNet::CallbackSessionErrorReason() allows the type of
transport and session errors to be
determined.
-
LAN Discovery of transports can be
enabled or disabled by using
Transport::SetEnableLANDiscovery().
-
A master session can now allow or deny
other session nodes from joining a session by using
SetAllowConnections() when using ReplicaNet or XPSession.
Bug fixes
-
Fixed a bug in the RNROLCompiler when
parsing ">" directives such as "object >
RealInclude..."
-
Fixed sending data packets with ReplicaNet when
SetDataRetention() is not true would result in an assert "Not allowed to leave unknown packets types in the queue".
Other changes
-
The RNVisualDebugger displays packets in the list view sorted by time.
-
The RNVisualDebugger remembers the last settings used for the Connect dialog.
-
The RNVisualDebugger debug output for DataBlocks contains more information about what distance and
tolerance values are used when calculating updates.
Compiler support
Release V5.2
Additions and changes to the API
-
A quick view of functions added:
XPSock_SentHistogram()
XPSock_RecvHistogram()
TransportConfig::PacketBufferBeginCaptureWindow()
TransportConfig::PacketBufferEndCaptureWindow()
TransportConfig::SetPacketBufferEnable()
TransportConfig::GetPacketBufferEnable()
DataBlock::GetForceSendTimeDelay()
DataBlock::GetForceSendMaximumUpdates()
XPSession::GetBandwidthFromSessionID()
ReplicaNet::GetBandwidthFromSessionID()
-
Detailed logs of the packets sent using
the low-level XPSock API can be created by using
XPSock_SentHistogram() and XPSock_RecvHistogram(). For
example the reliable UDP transport uses the cross
platform XPSock layer.
-
The application can now define a
specific window for packet buffering to use.
TransportConfig::PacketBuffer[Begin/End]CaptureWindow().
Packet buffering will now need to be enabled or disabled
by using TransportConfig::SetPacketBufferEnable() in conjunction
with the packet buffer API. If
TransportConfig::SetPacketBufferTime()
was used previously, a new call to SetPacketBufferEnable()
will need to be added.
-
DataBlock::GetForceSendTimeDelay() and
DataBlock::GetForceSendMaximumUpdates() have been added.
-
Configuration options have been
improved for reliable UDP packets that have been
lost or have missing ACKs by increasing the table of
resend times. TransportConfig::SetResendTimes() and
TransportConfig::GetResendTimes() have been updated.
-
The CXPSession interface, to allow the
XPSession class to be used from C, has had the extra
functionality of XPSession added.
-
It is now possible to read the
configured bandwidth of a session by using the
[XPSession/ReplicaNet]::GetBandwidthFromSessionID()
functions.
-
The RNPlatform utility library has been
made available to all builds so that applications
wishing to only use the RNPlatform headers do not need
to include the RNXPURL library.
Bug fixes
-
The changes to the reliable UDP
transport resend times and internal buffering controls
in the event of excessive packet loss have improved the
situation where the Demo1 game session will stay
connected when emulating 1000ms latency, 300ms jitter
and 30% packet loss. The plane pitch and roll values
have also had maximum values added so that latency
artefacts with these rotation values are much less
apparent.
Release V5.1
Additions and changes to the API
-
A quick view of functions added:
ReplicaNet::SetAutomaticPacketCompression()
ReplicaNet::GetAutomaticPacketCompression()
ReplicaNet::GetCompressionStatistics()
ReplicaNet::GetMergedStatistics()
ReplicaNet::SetPollLayerBelowForXPSession()
ReplicaNet::GetPollLayerBelowForXPSession()
ReplicaNet::GetMasterSessionID()
ReplicaNet::GetURLFromSessionID()
XPSession::SetAutomaticPacketCompression()
XPSession::GetAutomaticPacketCompression()
XPSession::GetCompressionStatistics()
XPSession::GetMergedStatistics()
XPSession::GetMasterSessionID()
XPSession::GetURLFromSessionID()
ReplicaNet::SetClientOnly()
ReplicaNet::GetClientOnly()
XPSession::SetClientOnly()
XPSession::GetClientOnly()
-
Automatic packet compression can
be configured by using:
XPSession::SetAutomaticPacketCompression()
XPSession::GetAutomaticPacketCompression()
XPSession::GetCompressionStatistics()
-
Added RNPlatform include files to the documentation.
-
Added documentation for
FreewareSetRegistrationCode().
-
Packet buffering (coalescing/packet
marshalling) has been added to the RNXPURL library with
the TransportConfig::SetPacketBufferTime() and
related functions. Transport::GetPacketsSentMerged() and
Transport::GetPacketsReceivedMerged() have been added to
the Transport class. ReplicaNet::GetMergedStatistics()
and XPSession::GetMergedStatistics() have also been
added to allow packet statistics to be read.
-
Spider nodes or potential master nodes now try to use the
configured game channel for their listen connections first. If the transport isn't listening on the game channel when it becomes a master
node it will try again to allocate listen connections
using the configured game channel.
-
Spelling errors corrected and
documentation made clearer for numerous functions.
-
Client only nodes can now be
configured using XPSession/ReplicaNet SetClientOnly()
and GetClientOnly(). If set then the node will only
receive session joiner and leaver notification for nodes
that are able to become a master node and use spidering.
This helps a MMO type of game enforce a rigid data
propagation policy for client nodes connecting to
peer-to-peer server nodes.
-
The ability to control the use of
threads used for XPSession and XPURL from ReplicaNet has
been added with the SetPollLayerBelowForXPSession()
function.
-
The session ID for the master session
can be read using the [ReplicaNet/XPSession]::GetMasterSessionID()
function.
-
A session ID can be resolved to a URL
using the [ReplicaNet::XPSession]::GetURLFromSessionID()
function.
-
Transport Network bandwidth can
be configured by transport type using
Transport::SetBandwidthLimit()
and Transport::SetMaximum[Output/Input]Bandwidth()
functions.
Bug fixes
-
The reliable UDP disconnect packet was not be being matched
against valid input packet addresses for a socket
created from a connect call. This would cause a premature disconnect if a socket received this packet from any other address that isn't valid.
-
Extraneous reliable UDP disconnect
packets were being sent when a connection was already
broken by one end of the communication channel.
-
Fixed a bug caused by network emulation being enabled with packet latency, which then was not sending disconnect packets when a transport was disconnected or deleted. This was causing the disconnection to take longer than normal when network emulation was enabled.
Release V5.0
Breaking changes
-
Header files are now fully qualified.
For example #include "ReplicaNet.h" has changed to
be #include "RNReplicaNet/Inc/ReplicaNet.h".
Similar changes are required for all of the other
ReplicaNet, XPSession and XPURL header files.
-
Now all ReplicaNet classes are in the
RNReplicaNet namespace, previously used empty forward
declarations of ReplicaNet classes might produce
compiler errors. The fix for this is to make sure your
own empty forward declarations of ReplicaNet classes are
included in the correct namespace.
-
Examples, tutorials and documentation
have been updated to use the new library directories and
the new directories for the RNROLCompiler.
Additions and changes to the API
-
A visual debugger had been added
called RNVisualDebugger and is able to display debug information about a network
session. The preprocessor define REPLICANET_VISUALDEBUGGER
is used to turn on this extra debug information. The standard implementations of
DataBlock_NData, DataBlock_PredictFloat and DataBlock_Function have been updated to use this macro.
The new DebugHandler class ("XPURL/Inc/DebugHandler.h") can be extended and registered with the
XPURL::RegisterDebugHandler() function. Please
see the XPURL and the ReplicaNet documentation for more
information.
-
Added more speed improvements for distance based
propagation.
-
When using DataBlock_PredictFloat delta hints
the resulting extrapolation has been improved to be more
accurate.
-
DataBlock::SetID() changed to be
protected and a friend of ReplicaObject to highlight
that this function method should not normally be called
by the user.
-
Added ReplicaNet::[Set/Get]DataBlockUpdatePolicy() and
ReplicaNet::ProcessDataBlockUpdate() to optionally separate the DataBlock updates from the normal
ReplicaNet::Poll() or threaded periodic updates.
-
The pure virtual ReplicaObject::GetRegistryBlock() has been promoted from private to public to allow the s_RO_RegistryBlock for an unknown ReplicaObject class to be queried by the user.
For example, to get the registered class name of an unknown "ReplicaObject *theObject" pointer:
theObject->GetRegistryBlock()->GetName()
-
XPSession::SetLatencyRecalculationDelay() and therefore
ReplicaNet::SetLatencyRecalculationDelay() have had their algorithm
changed to calculate a more accurate latency to the
master session. The input parameter meaning has changed so existing code should be checked for this change.
-
XPSession/ReplicaNet::GetLatencyToMasterSession() was reporting latency in the event of the master disconnecting and a session becomming master. The latency is now reported to be 0 seconds if the session becomes the new session master.
-
DataBlock update filters have
been extended to use the functions SetUpdateDelayMinimum(),SetForceSendMaximumUpdates()
and
SetForceSendTimeDelay(). Please see the
ReplicaNet documentation for a complete description.
-
XPSock_GetHostAddress() (and Transport::ExportURL()
which uses this function) changed to avoid using DNS queries if at all possible.
-
XPSock_Send() and XPSocket::Send()
changed to return the number of sent bytes.
-
Session spider messages have been made
shorter, this improves network bandwidth from the master
session.
-
XPSession fault recovery and notification of faults improved.
-
Documentation improved relating to
GetTime() and GetLocalTime().
-
Each example ReadMe.txt file states what build configurations are available.
-
Examples 1,4,9 updated to include a section on how to implement a graceful shutdown for ReplicaNet.
-
SysTime.h is now a public include.
ROLCompiler and ROL Language changes
Bug fixes
-
RNROLCompiler object::addinclude()
was changed so that it uses the whole line minus comments for the include file.
-
Removed a strdup and replaced it with
malloc, strcpy. Was causing problems with the memory
hooks.
-
Fixed a few bugs with session propagation filter and thus distance based propagation which uses the session propagation.
-
A session without an observer was
getting a spike of all available objects when using distance based
propagation.
-
Fixed a couple of std::string bugs that cause problems on non-Win32 versions of the
STL.
-
Found a memory leak with TransportUDP that would very rarely leave
memory allocated when the network stack was shutdown.
-
Fixed a bug if multithreading is enabled the session thread could hang if pre-connection is enabled.
-
Fixed a bug where broadcast packets were using too much bandwidth when spidering was enabled.
-
Bug fixed with reflected ReplicaObjects
where some DataBlocks were not getting updated properly.
-
UDPReliableManager now frees all memory allocated in the
databases when shutdown.
Release V4.1
Additions and changes to the API
-
Fixed: ReplicaNet::DataReceive()
was not setting the session ID properly.
-
Observer ReplicaObjects can now
be allocated and used from any session node.
-
Fixed: A rare bug could have happened when deleting
the ReplicaNet class and using XPURL::ShutdownNetwork().
-
The examples have not changed from the
previous release.
Proposed breaking changes
The next version of ReplicaNet is planned to include one
significant breaking change for existing code. This change
will involve adding a RNReplicaNet namespace to the
components XPURL and XPSession. The helper classes attached
to ReplicaNet including, but not limited to, Encryption,
PlatformInfo, SysTime, MutexClass and ThreadClass will also be added to
the same RNReplicaNet namespace. The ReplicaNet component naming
will remain unchanged. The quick fix for existing code could
be to include "using namespace RN ReplicaNet;" at the
top of every CPP file or, less recommended, inside a header
file. The better fix would involve adding the prefix
namespace "RNReplicaNet::" to every referenced class
used in the ReplicaNet library, except the ReplicaNet class. The
second change to reduce header file name collisions will be
to change all of the header files for each component to
include the prefix "ReplicaNet/Inc/". The examples
will be updated to reflect this change. To quickly fix
existing code the header include directory could include
both paths to the ReplicaNet include directory so that both
the long and short versions resolve to the same location.
The better fix could involve adding the necessary prefix to
all header files that include parts of ReplicaNet
components. These changes have been driven by the need for developers
to avoid potential name collisions for classes and header
files. This version will be called V5.0 to
reflect this significant change in version from the previous
releases. Please email version5@replicanet.com
if you wish to discuss or find out more about this
particular change.
Release V4.0
Additions and changes to the API
This is a large update with some very
exciting additions to the API. A special thank you goes to
the developers who helped to beta test the stability of this
release.
-
ReplicaObject Session propagation,
when enabled the ReplicaObject will ignore all joining sessions and the user application is then responsible for supplying the session IDs that this object will propagate to. This mechanism
effectively turns off all ReplicaNet object propagation functions for this object, including the distance based propagation. This mechanism can only be enabled or disabled before the object is published to ReplicaNet.
This gives full user control over how and where
ReplicaObjects are propagated in a session.
-
For XPSession and ReplicaNet the function
Disconnect() can be used to force disconnect any session node ID.
-
Before a session node fully connects, a state can be entered in to that
allows raw data packets to be exchanged between the joining
node and the master session node.
-
The raw packet mechanism has been added
to ReplicaNet allowing user created raw data
packets to be transferred.
-
Added two new examples that show
the new features available in ReplicaNet V4.0
-
Updated Example6 to show how to create a DataBlock derived class that updates an STL
container member variable.
-
For the DataBlock NData and NDataAt a new ROL keyword has been added
DisableEndianTest(). This disables the endian test for the block of memory.
-
Removed a potential for a thread deadlock to happen inside TransportUDP with regards to
THREADSAFELOCKCLASS(gUDPKnownAddresses) and
THREADSAFELOCKCLASS(gUDPKnownTransports) being out of order is some cases.
-
Added build rules for Example2 Linux build. Also added extended build rules for the Linux libraries.
-
Known issues with Linux are with the pthread mutex mechanism where Linux pthreads operate differently to SGI IRIX pthread
mutex. This Linux problem is expected to be resolved soon.
-
Added an extra class called NetworkVector3 to Example6 that shows how to create a networked representation of a 3D vector.
-
Documented the ReplicaObject extensions
AllocateForReplicaNet() and DeleteForReplicaNet().
-
Fixed - Trying to call a network
function on an object before it was published caused a
null pointer exception.
-
It is possible to alter the disconnection and packet retry parameters
using the TransportConfig class.
-
Documentation for load balancing ha been
added.
-
A virtual function when a DataBlock
receives packet data has been added,
ReplicaObject::DataBlockPacketDataReceived()
ROLCompiler and ROL Language changes
-
The win32 pragma to disable a harmless browse database warning has been wrapped in
#ifdef _WIN32/#endif
-
SetOpaqueType() allows "::" to be used so that namespaces can be included as part of the opaque type.
Release V3.9
Additions and changes to the API
-
The function 'realloc' has been added to the memory tracking layer.
-
The documentation for
ReplicaObject::GetUniqueID()
has been updated.
-
ReplicaNet::AllocateReplicaObject() Has been moved to be a private function. This function should not have been
available for public use.
-
Memory tracking now has the option to enable total and peak blocks and sizes,
see ReplicaNet_MemoryTotalsEnable()
-
Added Example7 - Which shows just basic XPSession operation.
-
Beta - ReplicaObject::SetPropagateToSessionDistance()
, ReplicaObject::SetPropagateToSessionDistanceDefault() and
ReplicaObject::GetPropagateToSessionDistance() have been added.
These allow objects to specify a distance and if that object is outside the distance to a session observer then that session does not get object updates.
This is very useful for helping to reduce network bandwidth for MMO games.
-
CurrentThreadSleep_SetHook() has been added in CThreadClass.h to allow a hook to be set for the
CurrentThreadSleep() function.
-
Beta - ReplicaObject::SetMessageReflectionID(const int
sessionID)
This function allows an object to state which sessionID should be used for sending messages to other sessions.
By default the master object is used to send DataBlock and message updates.
Useful for MMO games where the network bandwidth for
object replication can be assigned to other sessions.
-
ReplicaObject::SetClassID() Has been removed because the idea of setting the classID of an allocated replica object is outside the scope of the user.
-
ROLCompiler created ReplicaObject derived classes used the static class member function Allocate() to allocate a
derived class.
This function has been renamed to AllocateForReplicaNet(). This was to tidy up the naming convention for this derived class
Also a static delete function has been added called DeleteForReplicaNet(ReplicaObject *)
Both of these functions can be implemented in a derived class to alter the behaviour of allocate and delete methods for these classes.
-
Callbacks ReplicaNet::JoinerSessionID[Pre/Post]() and
ReplicaNet::LeaverSessionID[Pre/Post]() have been
added to allow a ReplicaNet derived class to be notified
when a sessionID joins or leaves the network session.
Release V3.8
Additions and changes to the API
-
XPURL, XPSession and ReplicaNet
have been changed to use an optional DLL
component.
The libraries that start with "DLL" will force the library DLL to be loaded at run time.
When using the DLL libraries you must define DOREPNETEXPORTAPI in the
preprocessor. This ensures importing of the correct dll functions. It also automatically does #include
"MemoryTracking.h"
The memory tracking header is needed to ensure that the dll calling method accounts for memory properly.
The automatic inclusion of the header during DLL builds can be turned off by defining REPLICANET_NOAUTOMATICINCLUDEMEMORYTRACKING
For non-dll builds the memory tracking header is not included.
Specifically for ReplicaNet and DLL builds,
REPLICANET_DLLPREREGISTER() must used called before the ReplicaNet class is allocated. This ties the object classes to the DLL.
REPLICANET_DLLPREREGISTER() can also be called in a non-DLL build without any adverse side effects.
-
The memory tracking header
("MemoryTracking.h") can be auto included by defining REPLICANET_ALWAYSDOMEMORYTRACKING for
non-dll based builds.
-
Some include headers changed. ReplicaNet.h changed to remove as much private data from the
public class as possible.
ReplicaManager.h removed from the public API.
Added DLLExportAPI.h
-
ROLCompiler: Changed to spot bugs due to braces being
mismatched.
-
ROL Language: Command object::Reliable() was not implemented. Since all objects default to using the reliable method this wasn't a bad bug.
-
ROL Language: Added #include "<file>" and
#includeclass <class> and updated the ROLCompiler docs.
-
ROL Language: Added object::RealInclude(),
see the ROL Compiler documentation for details.
-
ROL Language: Added
object::SetOpaqueType(), see the ROL Compiler
documentation for details.
Release V3.7
Please consult the documentation for complete
information covering the added features.
Additions and changes to the API
-
Automatic load balancing has been added. The default is for load balancing to be switched
off to remain compatible with previous version of
ReplicaNet.
Use these added functions in ReplicaNet:
void SetLoadBalancing(const bool enable = false);
bool GetLoadBalancing(void);
void SetMaximumLoad(float load = 0.0f);
float GetMaximumLoad(int sessionID = kReplicaNetUnknownUniqueID);
float GetTotalLoad(int sessionID = kReplicaNetUnknownUniqueID);
void ObjectListBeginIterate(void);
and in ReplicaObject:
void SetLoadBalancing(const bool enable = false);
bool GetLoadBalancing(void);
void SetLoadScore(const float load = 0.0f);
float GetLoadScore(void);
-
Optimisations to the reliable UDP layer to include a fast matching database have been successful in reducing CPU load for intensive packet transfers.
-
More ROL Compiler documentation
has been added to describe the data blocks.
-
virtual
ReplicaObject::UserRegisterDataBlocks() has been added to allow user extensions of the
data block mechanism. Using this function, or by
extending the ROL language includes, it is possible to
create your own data blocks that could use your own
complex extrapolated motion routines.
-
Object list iteration in
ReplicaNet:
void ObjectListBeginIterate(void);
void ObjectListFinishIterate(void);
ReplicaObject *ObjectListIterate(void);
-
The NData datablock now has
SetDefaultData()
which can set default data for a member variable and
reduce packet size for newly created objects.
-
Bug fixed in ReplicaObject::FindDataBlock() that wasn't finding all
data blocks for all member variables.
-
Object iteration functions with
automatic object list locking.
void ReplicaNet::ObjectListBeginIterate(void);
void ReplicaNet::ObjectListFinishIterate(void);
ReplicaObject *ReplicaNet::ObjectListIterate(void);
-
A thread locking problem that affected some
Windows98 machines when the application shut down has been fixed.
-
ReplicaNet::GetTime() and XPSession::GetTime()
are unchanged, however since these time values can vary due to latency changing
between each machine, another time function has been added. ReplicaNet::GetLocalTime()
and XPSession::GetLocalTime() now report the local time for
the machine. The examples have been changed to reflect this.
-
Memory function hooks have been added to
MemoryTracking.h.
void SetReplicaNetAllocateFunction(tReplicaNet_AllocateFunc *allocateFunction);
void SetReplicaNetClearAndAllocateFunction(tReplicaNet_ClearAndAllocateFunc *allocateFunction);
void SetReplicaNetFreeFunction(tReplicaNet_FreeFunc *allocateFunction);
All memory in the libraries is now allocated through
functions provided by this API. Memory allocated in the
user application is unchanged unless you include "MemoryTracking.h"
Changes that might throw up minor
compatibility problems
Release V3.6
An improved object and session migration API.
A new type of update packet that relieves network congestion.
Two new example applications, including the source code to a multiplayer demo
game.
More optimisations to the network packet layer to reduce CPU and memory use.
Increased stability for networks with packet loss.
Network emulation API to allow your application to be tested using different
types of lag and packet loss.
Microsoft dotNET library builds included.
Release V3.5
Optimisations to ReplicaNet, XPSession and XPURL have significantly
reduced CPU time to around 10% of what was being used before. A breakthrough in
caching has enabled this incredible performance jump.
Significant gains have also been made while improving the accuracy of
interpolated data types and reducing jitter from extrapolated data.
Encryption has been made stronger without compromising speed.
Extra API functions allow fine tuning of the network session to cater for
specific latency calculation intervals.
Initial session discovery and connection has been improved to reduce some of
the initial packet traffic.
|