Здравствуйте. Пишу клиент-серверную игру на сокетах. На сервере создаются и постоянно изменяются несколько списков с обьектами (Пули, враги, etc), для передачи на клиент этих списков использую json(jackson). Проблема в производительности этого всего (при рисовании на клиенте очень глючит). На локальном уровне все работает нормально. Помогите пожалуйста с оптимизацией, хотя бы в какую сторону двигаться.
Класс передачи с сервера на клиент:
public class ClientConnection extends Thread {
Socket client;
OutputStream daos;
PrintWriter printWriter;
BufferedReader fromClient;
GamePlay gamePlay;
JsonGenerator jsonGenerator;
public ClientConnection(Socket client)
{
gamePlay = new GamePlay(); //здесь обрабатывается игровая ситуация
this.client = client;
try {
printWriter = new PrintWriter(client.getOutputStream());
fromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));
JsonFactory jsonFactory = new JsonFactory();
jsonGenerator = jsonFactory.createGenerator(daos);
} catch (IOException e) {
try {
client.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
this.start();
}
@Override
public void run()
{
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
while (true) {
try {
synchronized (gamePlay.bullets.getBullets()) {
mapper.writeValue(printWriter, gamePlay.bullets.getBullets());
}
synchronized (gamePlay.enemies.getEnemies()) {
mapper.writeValue(printWriter, gamePlay.enemies.getEnemies());
}
mapper.writeValue(printWriter,gamePlay.ship);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Класс считывания на клиенте
public class Client extends Thread{
private static final String SERVER_IP = "127.0.0.1";
private static final int SERVER_PORT = 9999;
DrawGame drawGame;
PrintWriter writer;
BufferedReader br;
JsonParser jsonParser;
public static void main(String[] args) {
Socket clientSocket;
PrintStream outToServer = null;
JsonFactory jsonFactory = new JsonFactory();
try {
clientSocket = new Socket(Client.SERVER_IP,Client.SERVER_PORT);
Client client = new Client();
//client.inputStream = new DataInputStream(clientSocket.getInputStream());
client.br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
client.writer = new PrintWriter(clientSocket.getOutputStream());
client.drawGame = new DrawGame(); //тут все рисуется
client.jsonParser = jsonFactory.createParser(client.br);
client.start();
JFrame frame = new JFrame("Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(1000, 1000);
frame.add(client.drawGame);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run(){
TypeReference bul = new TypeReference<ArrayList<Bullet>>() { };
TypeReference enem = new TypeReference<ArrayList<Enemy>>() { };
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
while (true) {
try {
ArrayList<Bullet> b = mapper.readValue(jsonParser,bul);
drawGame.setBullets(b);
ArrayList<Enemy> e = mapper.readValue(jsonParser,enem);
drawGame.setEnemies(e);
Ship ship = mapper.readValue(jsonParser, Ship.class);
drawGame.ship = ship;
} catch (IOException e) {
e.getStackTrace();
}
}
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пытаюсь заставить работать Эклипс 47 быстрее, не во время загрузки а в процессе длительной работы с ним
Задали на собеседовании такой вопросПервичный гуглинг дал ответ, что такой структуры данных в чистом нативном виде вообще нет в Java, то есть...
Внимание! Можете не напрягаться над решением, просто подскажите в каком направлении думать!