Jump to content
  • Advertisement


  • Content Count

  • Joined

  • Last visited

Community Reputation

674 Good

About lride

  • Rank

Personal Information

  • Interests
  1. struct BaseNetObj { std::vector<char> data; std::function<void()> func; }; struct NetPerson { void say() { std::cout << a << b << c << "\n"; } int a; int b; int c; }; template <typename T> BaseNetObj makeBase() { BaseNetObj obj; obj.data.resize(sizeof(T)); obj.func = std::bind(&T::say, (T*)obj.data.data()); return obj; } int main() { BaseNetObj obj0 = makeBase<NetPerson>(); BaseNetObj obj1 = makeBase<NetPerson>(); BaseNetObj obj2 = makeBase<NetPerson>(); NetPerson * p0 = (NetPerson*)obj0.data.data(); p0->a = p0->b = p0->c = 1; NetPerson * p1 = (NetPerson*)obj1.data.data(); p1->a = p1->b = p1->c = 1; obj0.func(); //111 obj1.func(); //111 for (int i = 0; i < obj0.data.size(); ++i) { obj2.data = obj0.data ^ obj1.data; } obj2.func(); //000 } I think the above should do it. No inheritance, virtual functions. The base class holds the raw data in a vector. I can still do emulate polymorphism with std::function.
  2. This is the way how I do delta compression: All objects' information is represented in integers. I xor the two objects and I get lots of 0s. Then I do run length encoding. I think I can solve this problem by adding virtual void * data(), and virtual int size() methods.
  3. I want to be able to call a virtual function on the xor'd object. The reason is I'm trying to implement delta compression for compressing snapshots for a multiplayer game. I need to xor the contents of two objects and then call a virtual function to pack the bits.
  4. struct Base { virtual void func() = 0; }; struct A : Base { void func() { std::cout << "a: " << a << "\n"; } int a; }; int main() { A a; a.a = 1; A a2 = a; A a3; char * ap = reinterpret_cast<char*>(&a); char * ap2 = reinterpret_cast<char*>(&a2); char * ap3 = reinterpret_cast<char*>(&a3); for (int i = 0; i < sizeof(A); ++i) *(ap3 + i) = *(ap + i) ^ *(ap2 + i); Base * b = &a3; b->func(); } I want to bitwise xor the contents of an object with virtual functions like above. But I think i get a crash in above scenario because I xor'd the vptr too. Is there a way to achieve what I want?
  5. Server rewinding to account for player's ping spike is a terrible idea imo. If a player has unstable network condition, he/she should not expect a smooth gameplay.
  6. You could tick slightly slower. E.g. if you tick at 25hz, that's 40ms per tick. Increasing that to 41ms will slow you down by about 2.5%, which is probably not very noticeable to the player, but it will also not close the gap very fast (6.4s for 3 ticks at 25hz). There's a bit of a trade off to make between closing the gap faster and how noticeable the slowdown is to the player, this doesn't have to be a static value though, you can adjust the slowdown based on how large the gap is.   Thanks, this approach sounds good. 
  7. I'm making a 2d multiplayer platformer. I do client prediction for my own player and do interpolation for other players. I understand client always tries to stay ahead of server, so an input for tick T should arrive close to when server simulates T. For every input packet, server tells the client how far the input was off. If the input was too early, then the client needs to slow down. If the input was late, then the client needs to speed up. What i don't understand is how to slow down or speed up. For example, if server tells me it received my input for tick 10 at tick 7(3 ticks early), then I need to slow down 3 ticks worth of time. How should I go about doing this?
  8. Thanks, that works. But I don't understand why I don't get a warning with packer.pack<0, 127>(7u)?
  9. Here, I'm calling uint32_t version of Packer::pack, but I'm getting this warning.  Could someone help me out? Thanks! Packer packer; packer.pack<0, 127>(7u); //no warning packer.pack<0, 128>(7u); //warning class Packer { public: Packer(); const void * getData() const; std::size_t getDataSize() const; void pack(bool data); template <std::int8_t min = (std::numeric_limits<std::int8_t>::min)(), std::int8_t max = (std::numeric_limits<std::int8_t>::max)()> void pack(std::int8_t data); template <std::uint8_t min = (std::numeric_limits<std::uint8_t>::min)(), std::uint8_t max = (std::numeric_limits<std::uint8_t>::max)()> void pack(std::uint8_t data); template <std::int16_t min = (std::numeric_limits<std::int16_t>::min)(), std::int16_t max = (std::numeric_limits<std::int16_t>::max)()> void pack(std::int16_t data); template <std::uint16_t min = (std::numeric_limits<std::uint16_t>::min)(), std::uint16_t max = (std::numeric_limits<std::uint16_t>::max)()> void pack(std::uint16_t data); template <std::int32_t min = (std::numeric_limits<std::int32_t>::min)(), std::int32_t max = (std::numeric_limits<std::int32_t>::max)()> void pack(std::int32_t data); template <std::uint32_t min = (std::numeric_limits<std::uint32_t>::min)(), std::uint32_t max = (std::numeric_limits<std::uint32_t>::max)()> void pack(std::uint32_t data); ...  
  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!