SFML community forums
Help => System => Topic started by: azkay on October 31, 2010, 08:42:19 am
-
Right now ive got a while loop in main() that loops a tcpreceive and parses the data from there, eg;
loop start
recv
switch recv
case 1:
move person left
case 2:
move person right
default:
loop end
Now, using the tutorial on using a sprite, I would want to code it so, when it receives a "move left" packet, it moves the sprite to the left.
I tried putting it all in the same receive loop, but there was lots of delay in there, so, I need two threads?
Whats the best way to setup multiple threads where data can still be accessed by either?
eg; One thread runs the OpenGL GUI loop, other thread runs the TCP receiving?
-
You should not need two threads. You should, however, control the amount of packages sent out. I'm pretty sure you are spamming lots of packages, leading to the delay. Try to limit the update, send and receive rate and it will work nicely. Start with 60 ticks a second and go from there.
-
If you use TCP, by default the API calls probably block when you're not receiving anything, which means that if the server doesn't send anything for one second, the game will be stuck one second.
You can use something like timeouts, select() (I would recommend this) or threads (only if really needed) to avoid that.
-
Well, after a day of raging I still havnt gotten it working.
Any ideas on how to get it all working properly?
I have taken out the data/user/login/etcetc, so it obviously wont run, same with the custom includes. But hopefully it shouldnt matter for this problem.
Basically, need to get the receive stuff working with the graphics stuff.
Now that im (not?) using threads, dont know if this thread should stay under "Systems", but oh well.
#define _CRT_SECURE_NO_WARNINGS
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include <SFML/System.hpp>
#include <sstream>
#include "misc.h"
#include "f.h"
#include "md5.h"
sf::SocketTCP Client;
sf::SelectorTCP Selector;
std::string STX = "\x02";
std::string ETX = "\x03";
std::string SOH = "\x01";
int main(){
std::vector<std::string> results;
std::stringstream all;
std::string ReceivedStr;
size_t Size = 0;
char Buffer[1];
std::vector<std::string> gInfo = fLogin("", "");
std::string hood = "";
std::string server = fServer(hood);
Client.Connect(8080, server);
//Client.SetBlocking(false);
Selector.Add(Client);
fSend(Client, "some,data");
fSend(Client, "some,data");
fSend(Client, "some,data");
sf::Event Event;
sf::RenderWindow App(sf::VideoMode(1024, 1024, 32), "SFML Graphics");
sf::Image Map;
sf::Image avatarMe;
Map.LoadFromFile("image1.jpg");
avatarMe.LoadFromFile("1aff79cba4bac.png");
sf::Sprite Flash(Map);
sf::Sprite Sprite(avatarMe);
while(App.IsOpened()){
while(App.GetEvent(Event)){
if (Event.Type == sf::Event::Closed)
App.Close();
}
float ElapsedTime = App.GetFrameTime();
if (App.GetInput().IsKeyDown(sf::Key::Left)) Sprite.Move(-100 * ElapsedTime, 0);
if (App.GetInput().IsKeyDown(sf::Key::Right)) Sprite.Move( 100 * ElapsedTime, 0);
if (App.GetInput().IsKeyDown(sf::Key::Up)) Sprite.Move(0, -100 * ElapsedTime);
if (App.GetInput().IsKeyDown(sf::Key::Down)) Sprite.Move(0, 100 * ElapsedTime);
App.Clear();
App.Draw(Flash);
App.Draw(Sprite);
App.Display();
if(Selector.Wait()){
Client.Receive(Buffer, sizeof(Buffer), Size);
ReceivedStr.append(Buffer, Buffer + Size);
if(Size <= sizeof(Buffer)){
if(ReceivedStr != ETX){
all << ReceivedStr;
}else{
if(all.str().length() > 2){
if(!isdigit(all.str().substr(0, 1)[0]))
all.str(all.str().substr(1, all.str().length()));
StringExplode(all.str(), STX, &results);
switch(atoi(results[0].c_str())){
case 35:
std::cout << all.str() << std::endl;
break;
default:
std::cout << all.str() << std::endl;
break;
}
}
all.str("");
}
ReceivedStr = "";
results.clear();
}
}
}
std::cout << "Press enter to exit..." << std::endl;
std::cin.ignore(10000, '\n');
Client.Close();
return EXIT_SUCCESS;
}
-
Still lags whether I set blocking to false or just comment it out.
If I comment out everything within the if(Selector.Wait()), except for the receive, it still lags. Tried increasing the buffer to 1024, still lags.
Im out of ideas.
-
We're using UDP, but you can look at our receive and send code here: https://github.com/svenstaro/NoisyHunter/blob/master/engine/src/NetworkManager.cpp
Also, use Wireshark to see how many packages you are receiving and sending out.
-
Hi
I use on both client and server nonblocking mode and use select to handle incoming, outgoing and error stuff. Never had any lag problems on that set up.
On client side loop is about
read from server
parse data if any
do logic
send to server
server loop something like
check new connection
check and handle clients, kick out dropped etc not valid
Read data
do logic
send data
Tho I dont use sfml network pack on client or server side. Orginally both client and server was on linux side, but now on only server is on linux. Used Allegro on graphic API back then when I wrote my game.
Currently Im remaking client side with SFML and partially remaking server side.
http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html was my bible when I wrote my network code to my game.
A.
-
But, does anyone see where/if I went wrong in the code I posted?
-
Can you reduce your code to a minimal and complete example which still reproduces your problem? That is, remove all stuff irrelevant for the error, while keeping a compilable code that still shows the mentioned issues.