Search Unity

DarkRift - Fast and Flexible Cross Platform Networking

Discussion in 'Assets and Asset Store' started by Jamster, Apr 20, 2015.

  1. Megaphone_

    Megaphone_

    Joined:
    Mar 23, 2016
    Posts:
    41
    The method I have used before that seems to be the easiest to set up is to make a windows batch file (.bat) that spools up X number of instances of the client (very bare bones)
     
  2. Ber92

    Ber92

    Joined:
    Apr 13, 2015
    Posts:
    26
    This plugin work in all platforms? The Client on Android don't connect on the game, why?
     
  3. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    The 65535 limit is related to the ushort ID yes, with the extreme version you can have any number spread across multiple servers though.

    You are going to need a bigger VM than that though ;) The easiest way to test is to write a method that connects and sends 10 lightweight packets of data per second and then start it across a number of threads; I suspect you'll find you can manage a few hundred users per server instance, with multiple instances on your VM.

    You might want to try and reduce the number of messages you send, you'll get better performance with fewer, heavier messages.
     
    Megaphone_ likes this.
  4. Deleted User

    Deleted User

    Guest

    Awesome package - It has allowed me to do some things with my server that other packages (Namely Forge) could not do!
    One issue: My server is embedded in Unity and I'm unable to listen for disconnect events.
    DarkRiftAPI.onPlayerDisconnected is not called (On the server - This is what I would expect)
    ConnectionService.onPlayerDisconnect causes a deadlock on the server.

    Since I was having issues in my larger project, I went to the sample embedded server demo (DarkRift v1.4.2) and listened to the same events - same problem. I do call disconnect from OnApplicationQuit() but it only seems to free up a Network ID.
    The process on the server has long-ish lifetime and I need to be able to clean up properly when clients disconnect. I'm almost inclined to set up my own higher-level keep-alive system if necessary, but I was wondering if you had any advise.
     
  5. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    It's a glitch in DarkRift that I've looked into, basically very poor initial design means there a deadlock I can't get out without rewriting a significant code chunk...

    I'm really trying to just get DarkRift 2 out in beta ASAP because it's much a better use of my time rather than faffing about with soon to be deprecated software!

    Sorry about that!
     
    Megaphone_ likes this.
  6. Megaphone_

    Megaphone_

    Joined:
    Mar 23, 2016
    Posts:
    41
    That's very odd o_O I am also running with an embedded server and have been able to use ConnectionService.onPlayerDisconnect without issue.

    Are you using subset or non subset in your build?
     
  7. coldzik

    coldzik

    Joined:
    Jan 2, 2013
    Posts:
    12
    Can I use DarkRift for creating Master Server (DarkRift + C# code without Unity3d) and Game Servers in Unity which will be connected to Master Server and clients? I didn't see any code and example for plain C# server.
     
  8. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    Need a quick 101: Running 2 instances of DarkRift on the same VM with the first one on the default port 4296 and the second one on 4297. Now, how does this work? Do i connect with a specific port in the address? How can i control which one it connects to?

    EDIT: Just realised when connecting you can pass the port as a second argument. Nvm :D
     
    Last edited: Sep 21, 2016
    Jamster likes this.
  9. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Yep that's perfectly possible! Have a look at things like the HeavySyncDemo and the Plugin Tutorial to see how standalone servers are made!

    Jamie
     
  10. Lisk

    Lisk

    Joined:
    Oct 23, 2013
    Posts:
    99
    On a related note, is it possible to specify which port that DarkRiftServer listens to via the command line?

    I know that you can do it via the config file, but that won't work for my current use case.

    Edit: Additionally, how can I retrieve other command line arguments from within a DarkRift plugin? I'm not referring to the CLI - I'm referring to the arguments that DarkRiftServer.exe is run with.
     
    Last edited: Sep 22, 2016
  11. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    You can't currently set the port via the command line, if you change the config though any current DarkRift instances shouldn't notice. I'll add it to my todos in DarkRift 2 for you :)

    You can get the command line args through Environment.GetCommandLineArgs() :)
     
  12. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    The game i'm working on is a fast paced, 1-on-1 real-time MP game. You only control 1 character and the opponent controls the other. What's the best method to get as smooth a playing experience as possible?

    Do i send position data 10 times a second? Do i send it less frequently and lerp the positions? Do i leave the rigidbody enabled (as opposed to the opponent's character being set to kinematic) and send the velocity as well as the position 10 times a second? Or less often?

    Is there a sweet spot of the frequency of data sent per second? When i send it too often the DarkRift server will crash with an overflow exception, and this is just 2 people on the entire VM, i hope DarkRift will be able to support 100+ people per DarkRift server instance without crashing. I'm going to up my VM specs now, hopefully that's where the bottleneck is occurring and not DR :(

    I need to send 4 floats (vector2 position + vector2 velocity, combine them as a vector4) as OFTEN as possible. What would you recommend?
     
  13. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Can you send details of the overflow exception?

    I would probably recommend sending data when the player moves more than x amount AND lerping, when they're stationary there's no point sending data, I wouldn't send the rigidbody data because I don't think they're not renowned for syncing well like that...

    You could also try sending the raw input data, you would still need some synchronization packets though to ensure accuracy over time.

    That's worrying that DarkRift isn't able to handle that, what are your VM specs at the moment?

    Jamie
     
  14. Lisk

    Lisk

    Joined:
    Oct 23, 2013
    Posts:
    99
    @MOLITHAL

    I found this article helpful when implementing something like what you're describing. (https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking).

    You'll want to
    1) Send only positions that change (like Jamster said)
    2) Limit the amount of positions that are sent per second (20-30x per second).

    In my experience with DarkRift you should definitely be able to handle a lot more than you're currently experiencing.
     
  15. RichardM

    RichardM

    Joined:
    Apr 4, 2013
    Posts:
    50
    I am experiencing an odd issue. User logs in, and gets put in the character selection "scene". Character is selected and the game starts. I have an option to go back to the character selection. If I go back and choose another (or the same one) the first data set is sent again, as is the second. Every time I go back it adds the data set.I am using:
    Code (CSharp):
    1. public void OnDataReceived(ConnectionService con, ref NetworkMessage msg){
    2. ...lots of code building the payload...
    3. con.SendReply(2,8,Payload);

    My question is how do I clear the previous data? I looked and I see that I am receiving (2,8,[payload data]) times the number of character selections on the client so the previous data that was sent is still there.

    Once again I feel that I am missing something simple.

    Richard M.
     
  16. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    You shouldn't need to. I suspect it's an issue with your client code...

    Are you using a DarkRiftWriter? If you're using the same one it wont be cleared, no, so you probably want to create a new one with each packet.

    Jamie
     
  17. RichardM

    RichardM

    Joined:
    Apr 4, 2013
    Posts:
    50
    On the client shouldn't it be a reader? But no I am not using either the reader or writer. I am only using the DarkrRiftAPI. On the client side I am sending the selected character to the server using ...

    Code (CSharp):
    1. DarkRiftAPI.SendMessageToServer (2, 8, CharacterGUID [Selected]);
    The server then creates its reply (listed previously) and sends it to the client. The client then processes the reply using :

    Code (CSharp):
    1. public void OnDataReveived(byte Tag, ushort Subject, object Payload){
    2. if (Tag == 2 && Subject == 8){
    3. ...Process the Payload load the character info then set CharacterDataReceived = true; ...
    4. }
    5.  
    6. if (CharacterDataReceived ==true){
    7.       SceneManager.UnloadScene ("Module 1 Character Select"); //Unload current Scene
    8.       SceneManager.LoadScene ("Module 2 Space Station");//load new scene
    9. }
    I thought that by dumping the scene I was also dumping all the values in the variables...

    My server is the authority for all data. The client basically only has a read only view of the data. The client only sends the users actions to the server and shows the user what is happening on the server. I know this makes for a heavy server but there is less chance of cheating.

    Is there a different/better way to send and receive date to and from the server?

    If you need more info let me know. I can set up a "go to meeting" session if you need to see all the code. There are thousands of lines of code so I don't want to post them here.

    Thanks in advance
    Richard M.
     
  18. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Hmmm, is your server receiving multiple messages or is it receiving 1 message with multiple data (I assumed the later with my previous post but that doesn't look the case).

    Try turning LogData on and see what the server thinks it receives there, there shouldn't be any way for a message to trigger the invocation of OnDataReceived twice so there's something seriously odd if that's happening.

    Jamie
     
  19. RichardM

    RichardM

    Joined:
    Apr 4, 2013
    Posts:
    50
    The client is receiving multiple messages. The server is just getting one. I have full logging on all the time while I am developing.

    The client shows that the message is coming in with the new message appended / added to the previous one. For example if the message sent the first round is (2,8,"This Message") the next time it is (2,8,"This Message")(2,8,"New Message") and if I go back and select another it is (2,8,"This Message")(2,8,"New Message")(2,8,"Newest Message").

    On the server I clear (initialise) all the variables at the start of the function:

    Code (CSharp):
    1.   public void OnDataReceived(ConnectionService con, ref NetworkMessage msg)
    2.      if (msg.tag == 2 && msg.subject == 8) {
    3.          if (ShowData == true) {Interface.Log ("Data received on CharacterSelect (2-8)");}
    4.          msg.DecodeData ();
    5.          string Payload = "";
    6.  
    7. //Lots more code that builds the payload variable from data retrieved from the database
    8.  
    9.          Payload += "EOL,";
    10.          if (ShowData == true) {Interface.Log ("Ship Equiptment Added");}
    11.          ////////////////////////////////////////////////////////////////////////////////
    12.          Payload += "EOF,";
    13.          if (ShowData == true){Interface.Log("Character Data Built.  Sending : " + Payload);
    14.          con.SendReply(2,8,Payload);
    15.  
    16.  
    ShowData is a variable that extends the logging to include queries and payload info. As you can see I clear Payload at the start. I prefer to initialise all my variables at the start of a function just to make sure that they aren't holding old data.

    Thanks in advance
    Richard M.
     
  20. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    I'm still not sure I understand what's happening. Is it that the server receives 1 distinct message but the client receives 3 distinct messages (i.e. the data event on the client is invoked 3 times) or is it that the server receives 1 distinct message and the client receives 1 distinct message but with 3 messages worth of data (i.e. the data event is invoked once)?

    I don't know if you have experience with them but it would be interesting to see what a packet sniffer thinks is being sent.

    DarkRift doesn't store past messages, it could be that the NetworkStream backing it is causing problems but it seems relatively unlikely. This is an interesting issue!

    Jamie
     
  21. RichardM

    RichardM

    Joined:
    Apr 4, 2013
    Posts:
    50
    Assuming that the user selects character 1, then goes back and selects character 2 and finally goes back and selects character 3. The server receives 1 distinct message each time. The client receives 1 distinct message the first time, 2 the second and 3 the third.

    After the 3ed selection onDataReceived is firing 3 times (1 for each of the selections). I can see this because the data is being processed properly. I have list.add statements for various objects. So looking at the player stats (there are 24 of them) the first time there are 24, the second there are 48 and the third there are 72.

    By dumping the payload variable (on the client) to debug I see 1 payload the first time, 2 the second and 3 the third.

    Dumping the payload variable to the console on the server I see 1 each time I send the data to the client.

    Some where the data is being cached. I tried wireshark and cant see the data. I assume because client and server on on the same machine.

    I do have a test server setup that I can move the server to to capture the data but I'm not sure that this will help. Although it might tell me if the server is sending 3 or if the client is caching the first 2.

    Richard M.
     
  22. RichardM

    RichardM

    Joined:
    Apr 4, 2013
    Posts:
    50
    I looked at the data using wireshark from my client to the server and found that the server is only sending 1 data set. So It must be the client that is caching the previous data sets.

    Ok I found my issue ...
    Code (CSharp):
    1. DarkRiftAPI.onData += OnDataReveived;
    How do I clear this?

    Richard M.
     
    Last edited: Sep 27, 2016
  23. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    DarkRiftAPI.onData -= OnDataReveived;

    :)

    That's interesting, every time you call that it will subscribe the method without checking if it already subscribed, hence it would subsequently be called twice, etc. That might be the reason for you extra data?

    If that's not it then it must be to do with the asynchronous receives on the client, why that's an issue in your use case I don't know!

    Thank you for being patient!
     
  24. Caruzo

    Caruzo

    Joined:
    Oct 13, 2014
    Posts:
    5
    Hey, Jamster

    We are currently looking for the most convenient and pain-free networking service to build our project on. I am glad to say I am quite amazed of the 'reviews' sitting all around the Net about the DarkRift and definitely think we will test your software. However, I have multiple questions which will help us decide if this is the right decision for us:

    We are developing a 2v2 multiplayer game where we plan to:
    1) Implement a 'system' where players will be able to host and/or join rooms while setting the min and max rating required to join the room. Is that in the spectrum of possible things in DarkRift?
    2) Is it possible for DarkRift to be implemented into a project if this project has most of the coding already done? (Not only possible but also is it quite easy?)
    3) What cloud server service would you recommend and what plan for up to 1000 concurrent players?
    4) Would it be hard for an intermediate-level C# programmer to set up your software appropriately?

    Thank you for your time and effort!
     
    Last edited: Sep 30, 2016
  25. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Hey Caruzo,

    I'm glad your considering DarkRift!

    1. That should be easily doable in DarkRift but bear in mind that DarkRift is designed for cloud platforms only, so while players could setup their own games (in terms of settings) it would have to be hosted on your servers rather than their computer.
    2. I don't think that would be too hard though it will depend, it's always better to start with multiplayer early on but DarkRift is fairly non-invasive so shouldn't affect you too much client side.
    3. I've personally used Azure's VMs which I was pleasantly surprised with, they also seemed to be quite cheap too, nevertheless most cloud platforms like that should be perfectly suitable.
    4. You'll be fine! The hardest thing to do in DarkRift is to code with multithreading in mind and there's a lot of material on the web to help with that, follow the tutorial to start and you'll be fine!

    Jamie
     
  26. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    Hi, I've written a console app to re-launch DR if it crashes (or launch DR if it's not running), but i can't seem to get it to load correctly.

    I'm getting the ' [Fatal] settings.cnf did not load corectly. could not continue. ' error when trying to launch DarkRift from a console app using a Process object (exampleProcess.Start()). I've tried setting admin privalages on in a manifest (
    <requestedExecutionLevellevel="requireAdministrator" uiAccess="false" />).


    EDIT: Herp derp. Colleague experienced the same issue 4 years ago, solution: I had the full path in the 'process.StartInfo.FileName', when the path should have been in 'process.StartInfo.WorkingDirectory' and just the exe name in the FileName field. Works perfectly now :D
     
    Last edited: Oct 3, 2016
    Jamster likes this.
  27. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    Sorry for double-post but this is something i've experienced on the odd occasion since trying DarkRift; sometimes playing 1v1, all is going well when suddenly 1 user will see the opponent as standing still while the other user sees the opponent perfectly fine.

    It's as if 1 user stops receiving the opponent's data while continuing to send their data and no errors are thrown. Once it 'breaks' like this, the user never receives the opponent's data ever again, even though both are connected and the other user sees the opponent perfectly fine. Any ideas?
     
    Lisk likes this.
  28. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Interesting... Do you know if the data gets to the server?
     
  29. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    Not sure, it seems to happen randomly so it's hard to debug or even know what to look out for. Do you know of something like this happening?
     
  30. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    People have mentioned it but because it happens so randomly and so rarely there's not much I can do!

    Just fining out if it gets to the server would be a big help, it would eliminate half the code at least!
     
  31. Lisk

    Lisk

    Joined:
    Oct 23, 2013
    Posts:
    99
    I've received the same thing, too, on a "random" yet consistent basis. Hopefully it will be fixed in DarkRift 2.

    I think I was able to reproduce it reliably by sending a large chunk of data (>65 kb).
     
  32. Lisk

    Lisk

    Joined:
    Oct 23, 2013
    Posts:
    99
    Another question: Is there any way to rewrite the DarkRift config so that it doesn't use the Lib/Plugins folders, but instead uses explicit DLL references?

    I'm having trouble getting DarkRift to work with PlayFab's remote server, and I suspect it may have to do with the Lib/Plugins 'magic.'
     
  33. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Not in the original DarkRift but you can in DarkRift 2 :)
     
    Lisk likes this.
  34. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    This is very concerning for me as we're full steam ahead to launching a game with quite possibly a large player base. I can't have these random pseudo-drops in connection when the entire game is about 1v1 games. I'll start doing some tests to see if i can get it happening with large sets of data but this is eating away from development time.

    At least if there's a way to detect this 'disconnection' happening i can force a disconnect/reconnect as a worst case scenario, have you managed to find any way to detect when it happens?
     
  35. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    Another Q: In regards to the packets sent, is there an acknowledgement received for which i can access an ID/timestamp or would i need to write that myself and send it back whenever i receive data?
     
  36. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    I've only just noticed that last line there, must have skimmed over it before. That's interesting and seems to be a problem inside DarkRift with messages getting split over multiple IP packets. I'll try and get that fixed tonight.

    Detecting something like this would probably be quite tricky but as I now know the problem I'll get it resolved soonish.

    As DarkRift is using TCP at the moment you can't I'm afraid, there's simply no way to access it.

    Jamie
     
    MOLITHAL likes this.
  37. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    That's awesome to hear! For me there isn't an IMMEDIATE rush to get it patched so i don't mind if it takes you a few days, i'm working on implementing an acknowledgement system atm anyway.
     
    Jamster likes this.
  38. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Well I've patched the issue but now embedded servers seem to be broken! I'm not here over the weekend so the earliest I'll be able to fix it is Monday.

    The fix was essentially just to copy the necessary parts of Hazel into the old DarkRift where it was broken!
     
    Lisk likes this.
  39. Lisk

    Lisk

    Joined:
    Oct 23, 2013
    Posts:
    99
    Great to hear! Was the issue related to having messages split over IP packets?
     
  40. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Yup! For some reason it wasn't handled properly in the original DarkRift :confused:
     
  41. TheArchitect485

    TheArchitect485

    Joined:
    Aug 5, 2015
    Posts:
    7
    Hey - I'm not sure if this question has been asked already, but how do I send custom Objects across the network?
     
  42. Lisk

    Lisk

    Joined:
    Oct 23, 2013
    Posts:
    99
    Depends what type of object... usually you just want to synchronize only the data needed to recreate/replicate the object on all connected clients rather than the entire object itself.
     
    Jamster likes this.
  43. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    Really, really weird bug, just thought i'd let you lot know in case you have this issue:

    Originally i had the following 4 serialising/deserialising, at this point all works fine:

    1) userNetData.darkRiftID=reader.ReadUInt16();
    2) userNetData.isHost=reader.ReadBoolean();
    3) userNetData.dictionaryID=reader.ReadString();
    4) userNetData.userNumber=reader.ReadInt16();

    Then i added 2 new elements:

    1) userNetData.darkRiftID=reader.ReadUInt16();
    2) userNetData.isHost=reader.ReadBoolean();
    3) userNetData.dictionaryID=reader.ReadString();
    4) userNetData.userNumber=reader.ReadInt16();
    5) userNetData.webID=reader.ReadString();
    6) userNetData.enemyWebID=reader.ReadString();

    And all of a sudden the 2 new entries could NOT be deserialised. DarkRift correctly serialised it, i logged it in the console so it definitely worked DR side.

    However, i couldn't deserialise it in Unity. It would do the first 4 fine but the last 2 entries would be blank.

    Solution: I moved the 2 new entries to the top of the serialise/deserialise list and automagically it worked...

    5) userNetData.webID=reader.ReadString();
    6) userNetData.enemyWebID=reader.ReadString();
    1) userNetData.darkRiftID=reader.ReadUInt16();
    2) userNetData.isHost=reader.ReadBoolean();
    3) userNetData.dictionaryID=reader.ReadString();
    4) userNetData.userNumber=reader.ReadInt16();

    Weird. I wonder why this happened?
     
  44. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Going to be honest, don't know...!

    Fixed in DarkRift 2! ;)
     
  45. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    I'm starting to struggle and fight with DR, i've added a few more elements to send and it's giving me weird results. Sometimes a uShort with values of 0 and 1 will read as 256 and 512 in Unity, then i'll re-arrange the order of writing DR-side and something that was previously working will break/show up as empty in Unity.

    I'm constantly re-arranging the order of writing trying to make all 10 elements read correctly, but there's always something wrong. Now that i've re-arranged the order again, the same uShorts are now both displaying as 0 when there should be a 0 and a 1.

    Would you be able to patch this ASAP and also the issue you fixed a few posts ago, can you upload that version here so i can quickly grab it please?
     
  46. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Eeek I completely forgot about that update! Sorry! Sorry! Sorry! :oops:

    That should not be happening, there's a chance that it's due to the packet splitting bug previously fixed but it's unlikely, try the version here and see if it helps. If that makes no difference if you could send me a scene that reproduces it as simply as possible that would be very much appreciated.

    Once again sorry, the embedded server isn't working in this build (hence why it didn't get submitted to the Asset Store) but I'll do my best to fix it tonight!

    Jamie
     
  47. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    Ok cool, i'll test that now. I have my servers running on Azure VMs so luckily the embedded server issue doesn't affect me. Will let you know if it fixed it.
     
    Jamster likes this.
  48. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    Fixed the embedded server, apparently something wasn't up to date and the stopped the server receiving any data...

    I've submitted it to the asset store so any paid customers should get the update in a couple of weeks (if you need it earlier message me).

    The free version is here :)
     
  49. MOLITHAL

    MOLITHAL

    Joined:
    Aug 22, 2016
    Posts:
    26
    Ok i'm having an issue recreating it. I made a fresh solution and it's all very basic, the data gets sent correctly.

    However, in our actual project we store an array of structs into a list, the list is then stored into a dictionary with many instances of those multi-array lists. It's happening when we try to send data from within the struct that's within the list that's within the dictionary.

    Any issues you can think of that could be causing this?

    Pretty much spent the entire day today tearing my hair out over this problem; i'm trying to fetch the correct data before we can continue developing, and we're on a tight schedule so i'm stressing.

    In the mean time i'm going to convert all that data into a string using our good old friend Jason and send that over.
     
    Last edited: Oct 21, 2016
  50. Jamster

    Jamster

    Joined:
    Apr 28, 2012
    Posts:
    1,102
    I can't think how the storage of your structs could be causing the problems, has the newer version helped at all? Are you sending any arrays using the DarkRiftWriter at all if so what types?

    JSON sounds like a good plan, perhaps needless overhead but if that's the best solution, that's the best solution.

    Jamie