Search Unity

[RELEASED] Smooth Sync - Smoothly network rigidbodies and transforms while reducing bandwidth

Discussion in 'Assets and Asset Store' started by Fuestrine, Aug 4, 2017.

  1. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @mwg3
    Try the default settings and see if that works. I suspect the problem is something else though.

    Maybe you are moving the objects on non-owners? You'll want want to only move owned objects, then the position will be synced to non owned objects.

    If that's not the case, provide me with a screenshot of your object you are trying to sync and all relevant components. Also tell me how you are spawning your object.
     
  2. mwg3

    mwg3

    Joined:
    Apr 8, 2018
    Posts:
    36
    @Fuestrine
    My spawn method looks like this
    public void SpawnEnemy(){
    GameObject obj = (GameObject)Instantiate(gameobj, position, rotation);
    NetworkServer.Spawn(obj);
    }

    And AIMovement.css
    Code (CSharp):
    1. Like
    2. void Update(){
    3. //code
    4. //code
    5. //coode
    6. if (ObjectTarget != null){
    7. PositionTarget = new Vector3(ObjectTarget.transform.position.x, ObjectTarget.transform.position.y, ObjectTarget.transform.position.z);
    8.  
    9. if (DistanceTarget <= DistanceMoveTo)
    10.                 {
    11.                     animator.SetBool("Walking", true);
    12.                     transform.position = Vector3.MoveTowards(transform.position, PositionTarget, enemy.damager.Speed * Time.deltaTime);
    13.                     Quaternion rotation = Quaternion.LookRotation(PositionTarget - transform.position);
    14.                     transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * TimeToRotation);
    15.                 }
    16.                 else
    17.                 {
    18.                     ObjectTarget = null;
    19.                 }
    20. }
     
  3. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @mwg3
    It looks like right now you are setting the position on all instances of the game. If you are setting the position of the object on all instances, Smooth Sync cannot set the position.

    Keep your movement code behind Unet things like

    if (hasAuthority)

    so that only one game instance will be moving the position (the owner). The movement will then be free to be set on non-owners through Smooth Sync.
     
  4. Bryan-Legend

    Bryan-Legend

    Joined:
    Sep 8, 2012
    Posts:
    80
    You were right that networkState.smoothSync is the null reference. Now I'm getting a ton of Unknown Message, WrongConnection, Failed to Send, etc.

    Is there something that needs to happen to the network stream to clean it up? Something like this?

    Code (CSharp):
    1.         static void HandleSyncFromOwnerToServer(NetworkMessage msg)
    2.         {
    3.             NetworkState networkState = msg.ReadMessage<NetworkState>();
    4.  
    5.             if (networkState.smoothSync == null)
    6.             {
    7.                 // TODO: Increment stream buffer
    8.  
    9.                 return;
    10.             }
    11.  
    12.             // Ignore all messages that do not match the server determined authority.
    13.             if (networkState.smoothSync.netID.clientAuthorityOwner != msg.conn) return;
    14.  
    15.             // Always accept the first State so we have something to compare to. (if latestValidatedState == null)
    16.             // Check each other State to make sure it passes the validation method. By default all States are accepted.
    17.             // To tie in your own validation method, see the SmoothSyncExample scene and SmoothSyncExamplePlayerController.cs.
    18.             if (networkState.smoothSync.latestValidatedState == null ||
    19.                 networkState.smoothSync.validateStateMethod(networkState.state, networkState.smoothSync.latestValidatedState))
    20.             {
    21.                 networkState.smoothSync.latestValidatedState = networkState.state;
    22.                 networkState.smoothSync.latestValidatedState.receivedOnServerTimestamp = Time.realtimeSinceStartup;
    23.                 networkState.smoothSync.adjustOwnerTime(networkState.state.ownerTimestamp);
    24.                 networkState.smoothSync.SendStateToNonOwners(networkState);
    25.                 networkState.smoothSync.restartLerping();
    26.                 networkState.smoothSync.addState(networkState.state);
    27.             }
    28.         }
    29.  
     
  5. mwg3

    mwg3

    Joined:
    Apr 8, 2018
    Posts:
    36
    @Fuestrine
    hmm okay. Shoud i give if (hasAuthority) to player too? Maybe that is the problem why he's lagging
     
  6. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @mwg3
    Your movement code should look something like this setup
    Code (CSharp):
    1. if (hasAuthority)
    2. {
    3.       transform.position = transform.position + speed * Time.deltaTime;
    4. }
    Your players will have authority automatically when spawning through the NetworkManager and even through code in most cases so I don't think you'll have to set authority. If you do, you can use AssignClientAuthority() or SpawnWithClientAuthority().

    Let me know if you have any problems.
     
  7. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @Lone-Coder
    If that works, I say go with it. I don't understand how adding that null check makes those new errors appear though.

    If you don't have a solution yet, let me know how to replicate the issue. You are getting this by using an an RPC and then calling Destroy() on all of the game object instances?
     
  8. mwg3

    mwg3

    Joined:
    Apr 8, 2018
    Posts:
    36
    That is really sad message but still your own script doesn't work on my mobs. When i'm using NetworkTransform is all working:/
    Btw. When i add "
    if (hasAuthority)" mobs didn't move
     
  9. mwg3

    mwg3

    Joined:
    Apr 8, 2018
    Posts:
    36
  10. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @mwg3
    I don't think the problem is the lack of a network manager. Is there any way I can get you to send me your project so I can see exactly what is happening?
     
  11. Bryan-Legend

    Bryan-Legend

    Joined:
    Sep 8, 2012
    Posts:
    80
    I don't have a repro for the problem. That would make this so much easier. But I'm pretty sure the NetworkState.Deserialize returning at State.cs line 460 is leaving the network stream at a bad offset. But it's not getting access to the smoothSync so I don't even have a way to get the info to fix the network stream.

    Adding the null check made the new errors appear because the old null ref exception was stopping the rest of the message deserialization right?

    Instead of ignoring the null I think I'll have it throw with at least the object name. Might help me create a repro.

    Bryan
     
  12. cocoTier

    cocoTier

    Joined:
    Oct 1, 2013
    Posts:
    1
  13. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @Lone-Coder
    Ah yes, I do see a potential problem there. I'll see if that's the issue and get back to you. Thanks for letting me know about it.
     
    Last edited: Aug 6, 2018
  14. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @cocoTier
    Are you calling SmoothSync.teleport()? There's a few methods in the README file and full examples of those methods in the SmoothSyncExample scene and SmoothSyncExamplePlayerController.cs.

    Basically, you'll just move your object like normal, and then call SmoothSync.teleport() and it will then teleport on all non owner screens.

    Let me know if you have other questions.
     
  15. Bryan-Legend

    Bryan-Legend

    Joined:
    Sep 8, 2012
    Posts:
    80
    I think I've figured out how to do a repro.

    Create a network object with SmoothSync and use NetworkServer.SpawnWithClientAuthority so that it has non server authority.

    Delete that object on the server in any way (via RPC or NetworkServer.Destroy), while it's moving, with internet lag (so that the client delete happens later and data still gets sent).

    It doesn't repro reliably due to the lag. Maybe try the network simulator thing.

    If we can't find a fix for this, I might be able to change my code to not use ClientAuthority, but it'd be a serious pain for me and there would be a perf cost.

    Thanks again for your help!
     
  16. Whippets

    Whippets

    Joined:
    Feb 28, 2013
    Posts:
    1,775
    Does this product work without the HLAPI, and is it suitable for dedicated servers too?
     
  17. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @Whippets
    No, it uses Unity's high-level networking API.

    Yes it supports dedicated servers.
     
  18. Alkanov

    Alkanov

    Joined:
    May 15, 2017
    Posts:
    54
    Hi, where can I check the changelog ? I am having an issue where my object's z changes to 1 for some reason and I need it to be 0.

    I think I saw you fixed this but, I cannot find on which version you did it (if so).
     
  19. mwg3

    mwg3

    Joined:
    Apr 8, 2018
    Posts:
    36
    @Fuestrine
    Yo brother!
    I fixed my problem but now i have a question.
    Will there be support for animation in the future?
     
  20. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @Lone-Coder
    I'll have to look into it again and see what I can find. Thanks for the reproduction tips.

    @Alkanov
    Sorry. I figured Unity would keep track of the changelog somewhere but they haven't. I'll have to keep one going forward.
    I don't remember any setting Z to 1 fixes but I could have. You are using the latest version?

    @mwg3
    I don't have much experience with the animator but you should be able to put a Smooth Sync on any gameobject you are trying to animate and it should sync the transform across the network. Is this not possible with Unity animation?
     
    Last edited: Aug 13, 2018
  21. Bryan-Legend

    Bryan-Legend

    Joined:
    Sep 8, 2012
    Posts:
    80
    I'm heading out on a road trip, so if I could get an answer by next Monday the 20th on a possible fix or if I will need to stop using ClientAuthority it'd be really great.
     
  22. Doghelmer

    Doghelmer

    Joined:
    Aug 30, 2014
    Posts:
    120
    I'm considering grabbing this asset (already using NAT Traversal), and I was just curious -- how does performance generally compare with the standard NetworkTransform? I have to sync a fairly large number of objects, and I'm finding that NetworkTransform is less than optimal.

    Edit: I got antsy and bought the asset, and right off the bat even without doing proper optimization, it's using a lot fewer CPU resources than NetworkTransform does while attached to a large number of objects. So, nice work!
     
    Last edited: Aug 18, 2018
  23. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @Doghelmer
    Good to hear! I haven't tested performance in awhile in comparison to Network Transform. I've had a decent amount of minor performance updates since then too.

    There's also some variable settings that save on performance if they are set a certain way. Look in the SmoothSync.cs script for a full description. Search for "use one less" to see the variables. I should probably get a list going on the docs main page or something instead for where to look for performance increases.
     
  24. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @Lone-Coder
    Completely my fault. I should have had OR in that code I sent you instead of AND.

    Code (CSharp):
    1. if (networkState.smoothSync == null ||
    2.                 networkState.smoothSync.netID.clientAuthorityOwner != msg.conn) return;
    is what it should actually look like(SmoothSync.cs ~ 1877). I couldn't get the others to be null so I took out those checks from what I sent you earlier.

    You'll still get a Smooth Sync personal warning of "Could not find target", but that is OK and just a natural process of destroying an object. Smooth Sync will automatically be fine if that warning shows. The warning debugs are just there as a guide for when you are developing. Feel free to comment out the Smooth Sync Debug warnings if you don't want to see them anymore.

    Thanks for bringing the issue to my attention. I'll be putting the fix in the next update. Let me know if you have any more issues or questions and sorry again about the issue and my incorrect issue solving.
     
    Last edited: Aug 19, 2018
  25. MustangLM

    MustangLM

    Joined:
    Feb 6, 2015
    Posts:
    35
    Hey @Fuestrine
    Thank you for this really great asset, I am currently facing a bit of problems with it, I have a car game and the vehicles are synced using smoothsync the latest version, the cars start to jitter when reaching normal speeds such as 40-80 km/h and it doesn't get that worst at higher speeds than this(200 - 300) , I tried many different settings on SmoothSync with no such luck, below attached is a video showing the problem with smoothsync setting are default with scale sync to NONE



     
  26. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @MustangLM
    Thanks a bunch for the video and settings, it made it easy to reproduce and take a look at!

    The main problem is probably that you have WhereToUpdateTransform setting the position in Update() but your camera is probably moving in FixedUpdate(). Make them both use the same update method.

    From there, you can lower your TimeCorrectionSpeed until it is about where you want it. Take a look at the code comments for the sacrifices you make when lowering it. Looking back at TimeCorrectionSpeed now, I bet I can make it have less of a sacrifice by allowing higher values and it still being smooth. For now, just lower it until it looks smooth and then you'll be able to raise it after I get a fix out, probably this weekend.

    You might want to try PositionEasingSpeed and RotationEasingSpeed at 1 as well.

    After that you'll probably have some screen shake and blur or whatever at higher speeds that'll hide some super minor issues.

    Let me know if that doesn't work or if you have any other issues. I'll let you know when I put out an update that will allow you to raise your TimeCorrectionSpeed a bit so you'll have less of a sacrifice.
     
  27. MustangLM

    MustangLM

    Joined:
    Feb 6, 2015
    Posts:
    35
    @Fuestrine Thanks a lot for your response, I'll test the tips you gave and update you.
     
  28. MustangLM

    MustangLM

    Joined:
    Feb 6, 2015
    Posts:
    35
    @Fuestrine , I implemented all the notes you gave me, but I can't decide if its better or not, here is a new video with the new settings, and camera updating in Update() (I showed also a view from the server scene to see if the jitter is from the camera if that proves the point correclty - I have 2 clients each with a vehicle and a server), Thanks for your effort :)



     
  29. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @MustangLM
    I think your camera is probably now following in Update() but your car is moving in FixedUpdate()?
    [EDIT]This means that your camera is still updating strangely since it is following an object that moves in FixedUpdate() and the networked other player is moving in Update().[/EDIT]
    It would still be bad under these circumstances. This will happen without Smooth Sync in a non-networked scene too if you move one in Update() and the other in FixedUpdate() with a camera following one of them.

    Also, a Time Correction Speed of 0 would never correct. I need to update the description on the next version and probably just not allow that value at all. Try adding zeros before the 1 until it's as low as you need it.

    Let me know if that's not the issue.
     
    Last edited: Aug 23, 2018
  30. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @MustangLM
    Actually, I am seeing some weirdness now. Let me take a full look at it and I'll get back to you.
     
  31. MustangLM

    MustangLM

    Joined:
    Feb 6, 2015
    Posts:
    35
  32. jasielmacedo

    jasielmacedo

    Joined:
    Dec 11, 2010
    Posts:
    7
    Hi @Fuestrine ,
    Thank you for this awesome asset. I'm developing a Multplayer Racing-Like game Called Deliverace and really, i've searched for something like this for years (This post proves my search) and finally I found it. Damn. Thank you.
    Anyway,
    Do you know if your asset is compatible with vehicle controller asset, like, Edy Vehicle Physics ou Realistic Car Controller?

    Because, for racing cars, during braking the car lifts the rear slightly
    And the sync uses Interpolation method and based oh this, for other clients the car penetrates the ground before syncing properly. (Testing with ping of 40ms).

    Example:

    State 1 -> running straight
    State 2 -> Braking and the front of car down a little bit to simulate Blake plate, but still straight
    State 3 -> reducing velocity, still straight

    For non owners, during State 2, the script understand that the car direction is negative Y and predict this action until State 3 occurs making the correcting putting the car back to the ground.

    Any advise in this case?

    I don't know if i made myself understandable but, if not i'll try to make a video.
     
  33. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @jasielmacedo
    Do you mean the car rotates into the ground like it's breaking but it's not actually losing velocity yet on Non-Owners? Is this with Smooth Sync?

    Smooth Sync should be able to sync any object's rotation, so if your car breaks on an Owner and the back goes up a bit, it should also do that on all Non-Owners if you are syncing that object.

    It sounds like you are wanting to predict actions based on the velocity of the car on Non-Owners? Using Smooth Sync I would think you wouldn't need to predict it for breaking, it should just automatically sync the position and rotation of the car.

    Let me know if I misunderstood.

    I'm having some issues with driving type games right now though where the camera tries to follow along fastish moving objects owned by other computers. It's a few posts before yours here: https://forum.unity.com/threads/rel...reducing-bandwidth.486605/page-9#post-3606433
    I'm looking into a solution though but just to ease your mind, if you buy it and it's still not smooth in this manner after I try to fix it, I'd be happy to issue a refund.
     
    Last edited: Aug 26, 2018
  34. jasielmacedo

    jasielmacedo

    Joined:
    Dec 11, 2010
    Posts:
    7
    @Fuestrine yes

    These problems occurs with Smooth Sync in high velocities
    And I've not any additional script to predict or change velocity or rotation.
    I'm doing a lot of tests and i realize that is the Vehicle Controller Problem and not Smooth Sync, i guess.

    The vehicle Controller that i'm using is "Edy's Vehicle Physics" asset.
    If you have any advice, will be welcome

    Thank you for all support
     
  35. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @MustangLM
    Just a heads up that I haven't forgotten about you. This is surprisingly tricky to track down.

    @jasielmacedo
    It sounds like your car controller is changing the rotation (maybe position too) on non-owners. That would mean you and Smooth Sync are trying to set the position of the car and it's conflicting. You'll most likely only want to change the car on the owner.
    Stick a
    if (hasAuthority)
    before your movement code in your car controller.
    Let me know how it goes or if you have other questions.
     
  36. MustangLM

    MustangLM

    Joined:
    Feb 6, 2015
    Posts:
    35
    @Fuestrine yea I know no problem, I am here also testing some things
     
  37. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @MustangLM
    In case you wanted to hear what I've found:
    So I took out everything that isn't just straight interpolate() and I still get the issue. There's pretty much nothing happening in interpolate() and the input and output doesn't seem bad though.
    The issue also seems to disappear if you have the camera following on the unowned object. The background isn't twitching or anything and it looks smooth. But the owned object looks jumpy.
    I think there's just something weird with the camera following at a rate and the other object following along at a very similar rate, but not quite exactly the same rate.
    But even with all of that, if you lower your "Send Rate" (to 5-7ish, and up your interpolationBackTime to compensate) it will end up being pretty dang smooth (but now you have a low Send Rate and have to have a higher interpolationBackTime). So that makes me think there really is some minor issue with interpolate() switching between States that just gets compounded by the camera following so that you can see every little tinge of movement.

    So that's basically where I'm at now. I'll keep looking though, it's definitely a tricky one.
     
    Last edited: Sep 1, 2018
  38. MustangLM

    MustangLM

    Joined:
    Feb 6, 2015
    Posts:
    35
    @Fuestrine I highly doubt its from the camera, I made many testing to justify this, basically if you follow the non-owned object you won't feel the back and forth twitch/jitter because the camera will inherit that jitter, you will actually start noticing your own object start to jitter this actually makes sense, if you watch the non-owned object frame by frame you'll notice either a pause every a couple of milli-seconds, or it moves backwards then a huge step forward and again a small step backwards, this is basically what a jitter is, to accomplish smooth syncing on a moving object it has to be moving without a single pause and at a constant rate with a varying step in the correct direction depending on the speed.
     
  39. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @MustangLM
    I didn't mean it's from the camera, just that it's noticeable because of it. If you add the camera to the unowned object, you won't notice jitter in the background. The object isn't really shaking that much, basically unoticeable except when you are following along it with a camera that's following something else.

    I'll keep looking, it's definitely a tricky one.
     
  40. MustangLM

    MustangLM

    Joined:
    Feb 6, 2015
    Posts:
    35
  41. dadamsj1

    dadamsj1

    Joined:
    Jul 25, 2017
    Posts:
    42
    @Fuestrine : What is the best way of dealing with smoothSync'd network identities on ServerSceneChange? When I change scenes I get spammed with null reference exceptions (obviously since they have been deleted). The game still plays fine after the scene change but I'm wondering if there is better way to deactivate the objects without manually disabling all the smoothsync scripts. Thanks!
     
  42. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @dadamsj1
    I believe I have a fix for that null in the next update.

    If you want to check out the change now:

    Code (CSharp):
    1. if (networkState.smoothSync == null ||
    2.                 networkState.smoothSync.netID.clientAuthorityOwner != msg.conn) return;
    is what it should be in SmoothSync.cs ~ 1877.

    You'll still get a Smooth Sync warning of "Could not find target", but that is normal when an object gets destroyed. The warning debugs are just there as a guide for developing. Feel free to comment out the Smooth Sync debug warnings if you don't want to see them anymore.

    Let me know if that wasn't the problem.
     
    Last edited: Sep 5, 2018
  43. TheDeepVR

    TheDeepVR

    Joined:
    May 8, 2018
    Posts:
    22
  44. Alkanov

    Alkanov

    Joined:
    May 15, 2017
    Posts:
    54
    Hi, what configuration can I use in order to use less than 30 packets per second but at the same time keeping movement as smooth/accurate as possible?

    I am using this plug in on a 2d mmorpg and with the default configuration (30 send rate) works fine, but I feel like this is a lot more data than what I really need for a 2d rpg game.. I have tried with 20 but it looks choppy and if I play a bit with interpolation then players position is way too different on each client.

    Any suggestions?
     
  45. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @Alkanov
    I'm not noticing any issues when I lower the example scene to 10 send rate.
    Try upping your positionEasingSpeed to 1 and see how it goes.

    Other than that, my best advice is to reset to defaults and see if that works. Then add back in your changes one by one to see why yours is choppy.

    Some common solutions to choppiness:
    Turn off compression.
    Maybe your snap thresholds are triggering.
    InterpolationBackTime too low. InterpolationBackTime doesn't have to be too high though. .1 with 10 send rate should work fine for most scenarios. You'll be extrapolating pretty much once every .1s but it stays accurate enough.

    If it's still choppy with default settings, send me a screen shot, or maybe your project itself so I can get a good look.
     
  46. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @ExyteHQ
    Does resetting to default settings work?

    Other advice:
    Put your EasingSpeeds to 1.
    Turn off compression.
    Send rate might honestly just be too high for Unity (or maybe Smooth Sync) to handle. At 60 fps that's once a frame!

    Let me know how it goes.
     
  47. TheDeepVR

    TheDeepVR

    Joined:
    May 8, 2018
    Posts:
    22
    @Fuestrine Thanks, I've done the following:
    • Set interpolateBackTime to 0.06.
    • Set sendRate back to default 30.
    • Set timeCorrectionSpeed to 0.001.
    • Set EasingSpeed to 1.
    Now it's quite smooth and responsive for 5 Ghz WiFi. See the following video (left bottom is remote Vive Tracker, right upper - local Vive Tracker) https://www.dropbox.com/s/dix76ka2ijy2jiv/ver-game1 9_6_2018 5_05_37 PM.mp4?dl=0. I still see some small lags but I bet they are caused by well known Vive Tracker's jitter. Also, it seems jitter is multiplied by Smooth Sync extrapolation algorithm. Anyway, thank you, I hope my settings will help someone.
     
  48. Fuestrine

    Fuestrine

    Joined:
    Feb 13, 2013
    Posts:
    589
    @ExyteHQ
    Good to hear. Let me know if you have other questions.

    I wouldn't think you'd be extrapolating too often at that send rate though. I think in a perfect scenario you can go down to .033 interpolationBackTime with 30 send rate without extrapolating.
    .06 interpolationBackTime should be more than enough to cover a lot of normal variance in lag / packet loss on the same wifi.
     
  49. Alkanov

    Alkanov

    Joined:
    May 15, 2017
    Posts:
    54
    Turning off compression, increasing interpolation back time and increasing Position Lerp Speed to 1 allowed me to use only 5 updates per second.. this is insanely good!

    Thank you for your help.

     
  50. Paradoks

    Paradoks

    Joined:
    Oct 13, 2009
    Posts:
    436
    @Alkanov
    Hi,
    It looks like you are using an older SmoothSync version ?
    If so can i ask you why ?