bool Renderable::load(const tinyxml2::XMLElement *pElement) { pElement->QueryIntAttribute("order", &m_drawOrder); const tinyxml2::XMLElement* childElement = pElement->FirstChildElement("Texture"); if(!childElement) { CORE_WARNING("No Texture element declared in Renderable component."); return false; } // Get file name std::string textureFile = make_string(childElement->GetText()); if(textureFile.empty()) { CORE_WARNING("No texture file defined in Renderable Component"); return false; } // Trim whitespace trim(textureFile); sf::TexturePtr pTexture = TextureLocator::getObject()->get(textureFile); if(!pTexture) { CORE_ERROR("Failed to get texture: " + textureFile); return false; } TextureRegion tmpRegion(pTexture); childElement = pElement->FirstChildElement("Dimensions"); if(childElement) { pElement->QueryFloatAttribute("width", &m_width); pElement->QueryFloatAttribute("height", &m_height); setWidth(m_width != 0 ? m_width / PhysicsLocator::PixelsPerMeter.x : 0); setHeight(m_height != 0 ? m_height / PhysicsLocator::PixelsPerMeter.y : 0); } m_textureRegion = tmpRegion; return true; }
int32_t CoreUDPHandler::send(BinStream& bin_strm, const Inet_Addr& remote_addr) { int32_t rc = sock_dgram_.send(bin_strm.get_rptr(), bin_strm.data_size(), remote_addr); if(rc < 0) { if(XEAGAIN == error_no() || XEINPROGRESS == error_no()) //插入一个写事件,防止SOCKET异常 { CORE_WARNING("core udp send EAGAIN"); REACTOR_INSTANCE()->register_handler(this, MASK_WRITE); bin_strm.rewind(true); return 0; } else { bin_strm.rewind(true); CORE_FATAL("core udp send failed, remote addr = " << remote_addr); return -1; } bin_strm.rewind(true); } THROTTLER()->add_udp_packet(bin_strm.data_size(), true); bin_strm.rewind(true); return rc; }
void Connection_Manager::on_del_connection(CConnection* conn) { if(conn->get_server_type() >= eDaemon_Server) { //BASE_GUARD(BaseThreadMutex, cf_mon, mutex_); CORE_WARNING("on del connection, sid = " << conn->get_server_id() << ", stype = " << GetServerName(conn->get_server_type())); Server_Node_Map::iterator it = nodes_.find(conn->get_server_id()); if(it != nodes_.end()) { it->second.conn = NULL; it->second.index = 0; it->second.strms.clear(); if(it->second.daemon_del_) { if(notify_ != NULL) { notify_->on_server_dead(it->second.server_id, it->second.server_type); } nodes_.erase(it); } } } }
int32_t CConnection::send(CCorePacket& packet, bool no_delay) { int32_t ret = -1; GAIN_BINSTREAM(strm); *strm << packet; if(sbuffer_.remaining_length() < strm->data_size() + sizeof(uint32_t)) { if(sbuffer_.length() < MAX_BUFFER_SIZE)//扩大TCP发送缓冲区,防止缓冲区太小造成发送包异常 { sbuffer_.realloc_buffer(strm->data_size() + sizeof(uint32_t)); CORE_WARNING("sbuffer realloc buffer, size = " << sbuffer_.length()); } else //发送报文丢弃 { CORE_ERROR("sbuffer is full, sbuffer.size = " << sbuffer_.length()); RETURN_BINSTREAM(strm); return -1; } } THROTTLER()->add_tcp_packet(strm->data_size(), true); send_flag_ = true; if(sbuffer_.put(*strm)) { if(no_delay) { sbuffer_.send(sock_stream_); } if(sbuffer_.data_length() > 0) { REACTOR_INSTANCE()->register_handler(this, MASK_WRITE); } else { REACTOR_INSTANCE()->remove_handler(this, MASK_WRITE); } ret = 0; } RETURN_BINSTREAM(strm); return ret; }
bool Connection_Manager::on_add_connection(CConnection* conn) { CORE_INFO("on add connection, sid = " << conn->get_server_id() << ", server type = " << GetServerName(conn->get_server_type())); if(conn->get_server_id() == 0) { return false; } if(conn->get_server_type() >= eDaemon_Server) { Server_Node_Map::iterator it = nodes_.find(conn->get_server_id()); if(it != nodes_.end()) { it->second.conn = conn; it->second.index = conn->get_index(); for(StreamList::iterator list_it = it->second.strms.begin(); list_it != it->second.strms.end(); ++list_it) { if(!list_it->empty()) conn->send(*list_it); } it->second.strms.clear(); } else { Server_Node_t node; node.server_id = conn->get_server_id(); node.server_type = conn->get_server_type(); node.daemon_del_ = true; nodes_[conn->get_server_id()] = node; nodes_[conn->get_server_id()].index = conn->get_index(); nodes_[conn->get_server_id()].conn = conn; } CORE_WARNING("on add connection, sid = " << conn->get_server_id() << ", stype = " << GetServerName(conn->get_server_type())); return true; } return false; }
int32_t CConnection::send(const string& bin_stream) { if(bin_stream.empty()) return -1; uint32_t data_size = bin_stream.size(); if(sbuffer_.remaining_length() < data_size + sizeof(uint32_t)) { if(sbuffer_.length() < MAX_BUFFER_SIZE)//扩大TCP发送缓冲区,防止缓冲区太小造成发送包异常 { sbuffer_.realloc_buffer(data_size + sizeof(uint32_t)); CORE_WARNING("sbuffer realloc buffer, size = " << sbuffer_.length()); } else //发送报文丢弃 { CORE_ERROR("sbuffer is full, sbuffer.size = " << sbuffer_.length()); return -1; } } send_flag_ = true; THROTTLER()->add_tcp_packet(data_size, true); if(sbuffer_.put(bin_stream)) { if(sbuffer_.data_length() > 0) { REACTOR_INSTANCE()->register_handler(this, MASK_WRITE); } else { REACTOR_INSTANCE()->remove_handler(this, MASK_WRITE); } } return 0; }