From 2c351a8bccdfe0fe9ad0ccb4dba5e15ef23b4c0c Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 13 Apr 2011 17:24:38 +0200 Subject: - rewrite network methods (ugly but good performance) - fix memleaks --- pacman-c++/mainwidget.cpp | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) (limited to 'pacman-c++/mainwidget.cpp') diff --git a/pacman-c++/mainwidget.cpp b/pacman-c++/mainwidget.cpp index 5dc392c..d441607 100644 --- a/pacman-c++/mainwidget.cpp +++ b/pacman-c++/mainwidget.cpp @@ -35,11 +35,14 @@ MainWidget::MainWidget(QWidget *parent) /* call updateMap after m_color ist set! */ createGui(); - m_scene->updateMap(Util::createDemoMap()); + Transmission::map_t map = Util::createDemoMap(); + m_scene->updateMap(map); + Util::deleteMap(map); + map = NULL; connect(m_socket, SIGNAL(readyRead()), this, SLOT(tick())); - QTimer *sendTimer = new QTimer(); + QTimer *sendTimer = new QTimer(this); connect(sendTimer, SIGNAL(timeout()), this, SLOT(sendKeyUpdate())); sendTimer->start(Constants::tick); @@ -143,12 +146,12 @@ Transmission::field_t MainWidget::translateKey(int key) void MainWidget::tick() { - std::string dataStr; - Util::QByteArrayToStdString(m_socket->readAll(), dataStr); - + //TODO: allocate + reuse packet + QSharedPointer data = Util::receivePacket(m_socket); ProtoBuf::MapUpdate packet; - bool worked = packet.ParseFromString(dataStr); + bool worked = packet.ParseFromArray(data->data(), data->size()); Q_ASSERT(worked); + Q_UNUSED(worked); Transmission::map_t map = Util::createUninitialisedMap(); Q_ASSERT(packet.field_size() == (int) (Constants::map_size.width * Constants::map_size.height)); int i = 0; @@ -161,7 +164,11 @@ void MainWidget::tick() } } m_scene->updateMap(map); + Util::deleteMap(map); updateScore(packet); + + if (m_socket->bytesAvailable() > (qint64)sizeof(qint64)) + tick(); } void MainWidget::keyPressEvent(QKeyEvent* event) @@ -226,28 +233,27 @@ void MainWidget::playerScoreClicked() Color::Color MainWidget::connectToServer() { - // check command line arguments for server port + /* TODO: check command line arguments for server port */ const QStringList &args = QCoreApplication::arguments(); QString srv = args.value(1, "127.0.0.1"); qDebug() << "[Connect] server=" << srv; - // connect to server + /* connect to server */ m_socket = new QTcpSocket(this); m_socket->connectToHost(srv, Constants::Networking::port); bool worked = m_socket->waitForConnected(Constants::Networking::connection_timeout); if (worked) { - // additional init - // first packet is our color + /* additional init: first packet is our color */ worked = m_socket->waitForReadyRead(); if (worked) { - // receive color - std::string data; - Util::QByteArrayToStdString(m_socket->readAll(), data); + /* receive color */ + QSharedPointer data = Util::receivePacket(m_socket); ProtoBuf::WhoAmI packet; - bool worked = packet.ParseFromString(data); + bool worked = packet.ParseFromArray(data->data(), data->size()); Q_ASSERT(worked); + Q_UNUSED(worked); return static_cast(packet.color() & Transmission::color_mask); } } -- cgit v1.2.3