OpenDDS之QosXml库编译(Windows + VS2019)

news2025/4/13 7:49:42

目录

  • 1、需求背景
  • 2、基础环境
  • 3、编译xercesc
    • 3.1、下载xercesc
    • 3.2、编译xercesc
  • 4、编译ACE_XML_Utils
    • 4.1、生成XML_Utils解决方案
    • 4.2、编译XML_Utils
  • 5、编译QOS_XML_XSC_Handlerd
    • 5.1、生成QOS_XML_XSC_Handlerd解决方案
    • 5.2、编译QOS_XML_XSC_Handlerd
  • 6、测试例子
    • 6.1、生成dump解决方案
    • 6.2、编译dump
    • 6.3、OpenDDS的xml格式

1、需求背景

在使用OpenDDS中,需要对不同场景设计出不同的qos方案配置。但是每次写在代码中,后续维护扩展均受限,为此需要使用xml文件配置的方法。其实OpenDDS源码中已经提供了xml配置的方法,但是由于没有编译xml解析库,所以这部分的库就没有生成出来。

2、基础环境

  • VS2019
  • perl Opendds ace+tao 均已完成编译。
  • cmake(3.27)

3、编译xercesc

3.1、下载xercesc

官网链接:http://xerces.apache.org/xerces-c/download.cgi
在这里插入图片描述
Source Distributions 区域找最新的zip下载即可。

3.2、编译xercesc

解压下载好的库后,基本目录结构如下图所示:
在这里插入图片描述

我们打开cmake-gui软件。需要填写souce code 和 build binaries 俩个路径。分别为源码路径和编译路径。然后点击【Configure】按钮,在弹出的界面选择VS2019其他默认即可。
在这里插入图片描述

然后在下面的CMAKE_INSTALL_PREFIX属性设置安装路径。这里我的DDS路径为D:OpenDDS,所以我安装在了OpenDDS路径下。
在这里插入图片描述

再次点击Configure 完成后,点击 Generate按钮。
在这里插入图片描述
生成后,点击Open Project按钮,打开工程。
在这里插入图片描述
选择Debug-64环境后,打开CMakePredefinedTargets文件夹中找到ALL_BUILD,右击编译。完成后,找到下面的INSTALL工程,右击编译。就会把所编译生成的文件以及头文件输出到你在cmake那块配置的路径中。至此,xercesc的编译就完成了。

4、编译ACE_XML_Utils

ACE_XML_Utils需要xerces库的支持,所以在编译ACE和TAO时并没有生成。

4.1、生成XML_Utils解决方案

注:需要使用VS2019的命令行
在 %OpenDDS%\ACE_wrappers\ace\XML_Utils\路径下执行命令:

perl mwc.pl -type vs2019

在该路径下就会生成ACE_XML_Utils.sln
在这里插入图片描述

4.2、编译XML_Utils

点击XML_Utils.sln打开工程。
在属性中需要增加以下配置:
在C/C++常规中增加xerces-c的头文件路径(D:\OpenDDS\xerces-c\include)
在链接器常规中增加xerces-c的库文件路径(D:\OpenDDS\xerces-c\lib)
在链接器输入中增加xerces-c_3D.lib库文件。(Debug是xerces-c_3D.lib,Release是xerces-c_3.lib)
在这里插入图片描述

最后编译XML_Utils工程。成功生成。
在这里插入图片描述

5、编译QOS_XML_XSC_Handlerd

5.1、生成QOS_XML_XSC_Handlerd解决方案

注:需要使用VS2019的命令行
在 %OpenDDS%\dds\DCPS\QOS_XML_Handler\路径下执行命令:

perl mwc.pl -type vs2019

在这里插入图片描述

在该路径下就会生成ACE_XML_Utils.sln

5.2、编译QOS_XML_XSC_Handlerd

点击QOS_XML_XSC_Handlerd.sln打开工程。
在属性中需要增加以下配置:
在C/C++常规中增加xerces-c的头文件路径(D:\OpenDDS\xerces-c\include)
在链接器常规中增加xerces-c的库文件路径(D:\OpenDDS\xerces-c\lib)
在链接器输入中增加xerces-c_3D.lib库文件。(Debug是xerces-c_3D.lib,Release是xerces-c_3.lib)
在这里插入图片描述
编译工程,成功生成。
在这里插入图片描述

6、测试例子

在%OpenDDS%\tests\DCPS\QoS_XML\dump有xml配置读取的例子。

6.1、生成dump解决方案

注:需要使用VS2019的命令行
在 %OpenDDS%\dds\DCPS\QOS_XML_Handler\路径下执行命令:

perl mwc.pl -type vs2019 -features xerces=1

在这里插入图片描述
在该路径下就会生成dump.sln文件

6.2、编译dump

点击dump.sln打开工程。在qos_dump.cpp中就有所有的qos读取示例。
代码如下:


#include "dds/DCPS/QOS_XML_Handler/QOS_XML_Loader.h"
#include "dds/DdsDcpsC.h"

int ACE_TMAIN (int, ACE_TCHAR *[])
{
  int retval = 0;
  try
    {
      OpenDDS::DCPS::QOS_XML_Loader xml_loader;
      DDS::ReturnCode_t const retcode = xml_loader.init (ACE_TEXT ("qos#TestProfile"));
      if (retcode == DDS::RETCODE_OK)
        {
          DDS::ReturnCode_t retcode_qos;
          ::DDS::DataWriterQos dw_qos;
          retcode_qos = xml_loader.get_datawriter_qos (
                                dw_qos,
                                ACE_TEXT("qos#TestProfile"),
                                ACE_TEXT("TopicName"));
          if (retcode_qos != DDS::RETCODE_OK)
            {
              ACE_ERROR ((LM_ERROR, "MAIN - "
                "get_datawriter_qos return an error. Retcode <%d>\n",
                retcode_qos));
              ++retval;
            }
          if (dw_qos.history.kind != ::DDS::KEEP_ALL_HISTORY_QOS)
            {
              ACE_ERROR ((LM_ERROR, "MAIN - "
                "get_datawriter_qos return an invalid history kind.\n"));
              ++retval;
            }
          if (dw_qos.history.depth != 5)
            {
              ACE_ERROR ((LM_ERROR, "MAIN - "
                "get_datawriter_qos return an invalid history depth.\n"));
              ++retval;
            }

          ::DDS::DataReaderQos dr_qos;
          retcode_qos = xml_loader.get_datareader_qos (
                                dr_qos,
                                ACE_TEXT("qos#TestProfile"),
                                ACE_TEXT("TopicName"));
          if (retcode_qos != DDS::RETCODE_OK)
            {
              ACE_ERROR ((LM_ERROR, "MAIN - "
                "get_datareader_qos return an error. Retcode <%d>\n",
                retcode_qos));
              ++retval;
            }

          if (dr_qos.type_consistency.ignore_sequence_bounds != true)
          {
            ACE_ERROR ((LM_ERROR, "PARSEXML - "
                  "get_datareader_qos returned an invalid type type_consistency ignore_sequence_bounds.\n"));
            ++retval;
          }
          if (dr_qos.type_consistency.ignore_string_bounds != true)
          {
            ACE_ERROR ((LM_ERROR, "PARSEXML - "
                  "get_datareader_qos return an invalid type type_consistency ignore_string_bounds.\n"));
            ++retval;
          }
          if (dr_qos.type_consistency.ignore_member_names != true)
          {
            ACE_ERROR ((LM_ERROR, "PARSEXML - "
                  "get_datareader_qos return an invalid type type_consistency ignore_member_names.\n"));
            ++retval;
          }
          if (dr_qos.type_consistency.prevent_type_widening != true)
          {
            ACE_ERROR ((LM_ERROR, "PARSEXML - "
                  "get_datareader_qos return an invalid type type_consistency prevent_type_widening.\n"));
            ++retval;
          }
          if (dr_qos.type_consistency.force_type_validation != true)
          {
            ACE_ERROR ((LM_ERROR, "PARSEXML - "
                  "get_datareader_qos return an invalid type type_consistency force_type_validation.\n"));
            ++retval;
          }
          if (dr_qos.representation.value.length() != 2)
          {
            ACE_ERROR ((LM_ERROR, "PARSEXML - "
                  "get_datareader_qos return an invalid length %d for data_representation.\n",
                  dr_qos.representation.value.length()));
            ++retval;
          }

          ::DDS::TopicQos tp_qos;
          retcode_qos = xml_loader.get_topic_qos (
                                tp_qos,
                                ACE_TEXT("qos#TestProfile"),
                                ACE_TEXT("TopicName"));
          if (retcode_qos != DDS::RETCODE_OK)
            {
              ACE_ERROR ((LM_ERROR, "MAIN - "
                "get_topic_qos return an error. Retcode <%d>\n",
                retcode_qos));
              ++retval;
            }

          if (tp_qos.durability_service.history_kind != DDS::KEEP_LAST_HISTORY_QOS)
          {
            ACE_ERROR ((LM_ERROR, "PARSEXML - "
                  "get_topic_qos returned an invalid type durability_service history_kind.\n"));
            ++retval;
          }

          ::DDS::PublisherQos pub_qos;
          retcode_qos = xml_loader.get_publisher_qos (
                                pub_qos,
                                ACE_TEXT("qos#TestProfile"));
          if (retcode_qos != DDS::RETCODE_OK)
            {
              ACE_ERROR ((LM_ERROR, "MAIN - "
                "get_publisher_qos return an error. Retcode <%d>\n",
                retcode_qos));
              ++retval;
            }

          ::DDS::SubscriberQos sub_qos;
          retcode_qos = xml_loader.get_subscriber_qos (
                                sub_qos,
                                ACE_TEXT("qos#TestProfile"));
          if (retcode_qos != DDS::RETCODE_OK)
            {
              ACE_ERROR ((LM_ERROR, "MAIN - "
                "get_subscriber_qos return an error. Retcode <%d>\n",
                retcode_qos));
              ++retval;
            }

          ::DDS::DomainParticipantQos dp_qos;
          retcode_qos = xml_loader.get_participant_qos (
                                dp_qos,
                                ACE_TEXT("qos#TestProfile"));
          if (retcode_qos != DDS::RETCODE_OK)
            {
              ACE_ERROR ((LM_ERROR, "MAIN - "
                "get_participant_qos return an error. Retcode <%d>\n",
                retcode_qos));
              ++retval;
            }
        }
      else
        {
          ACE_ERROR ((LM_ERROR, "MAIN - Init return an error. Retcode <%d>\n",
            retcode));
          ++retval;
        }
    }
  catch (const CORBA::Exception& ex)
    {
      ex._tao_print_exception ("QOS_Dump::main\n");
      return -1;
    }
  catch (...)
    {
      ACE_ERROR ((LM_ERROR, ACE_TEXT ("Unexpected exception\n")));
      return 1;
    }

  return retval;
}

6.3、OpenDDS的xml格式

<?xml version="1.0" encoding="UTF-8"?>
<dds xmlns="http://www.omg.org/dds"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.omg.org/dds dds_qos.xsd">
  <qos_profile name="TestProfile">
    <datareader_qos>
          <representation>
            <value>
              <element>XCDR_DATA_REPRESENTATION</element>
              <element>XCDR2_DATA_REPRESENTATION</element>
            </value>
          </representation>
          <type_consistency>
            <kind>ALLOW_TYPE_COERCION</kind>
            <ignore_sequence_bounds>true</ignore_sequence_bounds>
            <ignore_string_bounds>true</ignore_string_bounds>
            <ignore_member_names>true</ignore_member_names>
            <prevent_type_widening>true</prevent_type_widening>
            <force_type_validation>true</force_type_validation>
          </type_consistency>
          <durability>
                 <kind>VOLATILE_DURABILITY_QOS</kind>
          </durability>
          <deadline>
               <period>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </period>
          </deadline>
          <latency_budget>
               <duration>
                    <sec>0</sec>
                    <nanosec>0</nanosec>
               </duration>
          </latency_budget>
          <liveliness>
               <kind>AUTOMATIC_LIVELINESS_QOS</kind>
               <lease_duration>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </lease_duration>
          </liveliness>
          <reliability>
               <kind>BEST_EFFORT_RELIABILITY_QOS</kind>
               <max_blocking_time>
                    <sec>0</sec>
                    <nanosec>100000000</nanosec>
               </max_blocking_time>
          </reliability>
          <destination_order>
                <kind>BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS</kind>
          </destination_order>
          <history>
               <kind>KEEP_LAST_HISTORY_QOS</kind>
               <depth>1</depth>
          </history>
          <resource_limits>
               <max_samples>LENGTH_UNLIMITED</max_samples>
               <max_instances>LENGTH_UNLIMITED</max_instances>
               <max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance>
          </resource_limits>
          <!--user_data>
               <value></value>
          </user_data-->
          <ownership>
               <kind>SHARED_OWNERSHIP_QOS</kind>
          </ownership>
          <time_based_filter>
               <minimum_separation>
                    <sec>0</sec>
                    <nanosec>0</nanosec>
               </minimum_separation>
          </time_based_filter>
          <reader_data_lifecycle>
               <autopurge_nowriter_samples_delay>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </autopurge_nowriter_samples_delay>
               <autopurge_disposed_samples_delay>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </autopurge_disposed_samples_delay>
          </reader_data_lifecycle>
     </datareader_qos>
    <datawriter_qos>
          <durability>
               <kind>VOLATILE_DURABILITY_QOS</kind>
          </durability>
          <durability_service>
               <service_cleanup_delay>
                    <sec>0</sec>
                    <nanosec>0</nanosec>
               </service_cleanup_delay>
               <history_kind>KEEP_LAST_HISTORY_QOS</history_kind>
               <history_depth>1</history_depth>
               <max_samples>LENGTH_UNLIMITED</max_samples>
               <max_instances>LENGTH_UNLIMITED</max_instances>
               <max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance>
          </durability_service>
          <deadline>
               <period>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </period>
          </deadline>
          <latency_budget>
               <duration>
                    <sec>0</sec>
                    <nanosec>0</nanosec>
               </duration>
          </latency_budget>
          <liveliness>
               <kind>AUTOMATIC_LIVELINESS_QOS</kind>
               <lease_duration>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </lease_duration>
          </liveliness>
          <reliability>
               <kind>RELIABLE_RELIABILITY_QOS</kind>
               <max_blocking_time>
                    <sec>0</sec>
                    <nanosec>100000000</nanosec>
               </max_blocking_time>
         </reliability>
         <destination_order>
              <kind>BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS</kind>
          </destination_order>
          <history>
               <kind>KEEP_ALL_HISTORY_QOS</kind>
               <depth>5</depth>
          </history>
          <resource_limits>
               <max_samples>LENGTH_UNLIMITED</max_samples>
               <max_instances>LENGTH_UNLIMITED</max_instances>
               <max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance>
          </resource_limits>
          <transport_priority>
               <value>0</value>
          </transport_priority>
          <lifespan>
               <duration>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </duration>
          </lifespan>
          <!--user_data>
               <value></value>
         </user_data-->
         <ownership>
              <kind>SHARED_OWNERSHIP_QOS</kind>
          </ownership>
          <ownership_strength>
               <value>0</value>
          </ownership_strength>
          <writer_data_lifecycle>
               <autodispose_unregistered_instances>true</autodispose_unregistered_instances>
          </writer_data_lifecycle>
     </datawriter_qos>
     <domainparticipant_qos>
          <!--user_data>
               <value></value>
          </user_data-->
          <entity_factory>
               <autoenable_created_entities>true</autoenable_created_entities>
          </entity_factory>
     </domainparticipant_qos>
     <subscriber_qos>
          <presentation>
               <access_scope>INSTANCE_PRESENTATION_QOS</access_scope>
               <coherent_access>false</coherent_access>
               <ordered_access>false</ordered_access>
          </presentation>
          <partition>
               <name>
                 <element>ABC</element>
                 <element>DEF</element>
                 <element>GHI</element>
                 <element>JKL</element>
                 <element>MNO</element>
                 <element>PQR</element>
                 <element>STU</element>
                 <element>VW</element>
                 <element>XYZ</element>
              </name>
          </partition>
          <!--group_data>
               <value></value>
          </group_data-->
          <entity_factory>
               <autoenable_created_entities>true</autoenable_created_entities>
          </entity_factory>
     </subscriber_qos>
     <publisher_qos>
          <presentation>
               <access_scope>INSTANCE_PRESENTATION_QOS</access_scope>
               <coherent_access>false</coherent_access>
               <ordered_access>false</ordered_access>
          </presentation>
          <partition>
               <name>
                 <element>XYZ</element>
                 <element>VW</element>
                 <element>STU</element>
                 <element>PQR</element>
                 <element>MNO</element>
                 <element>JKL</element>
                 <element>GHI</element>
                 <element>DEF</element>
                 <element>ABC</element>
              </name>
          </partition>
          <!--group_data>
               <value></value>
          </group_data-->
          <entity_factory>
               <autoenable_created_entities>true</autoenable_created_entities>
          </entity_factory>
     </publisher_qos>
     <topic_qos>
          <!--topic_data>
               <value></value>
          </topic_data-->
          <durability>
               <kind>VOLATILE_DURABILITY_QOS</kind>
          </durability>
          <durability_service>
               <service_cleanup_delay>
                    <sec>0</sec>
                    <nanosec>0</nanosec>
               </service_cleanup_delay>
               <history_kind>KEEP_LAST_HISTORY_QOS</history_kind>
               <history_depth>1</history_depth>
               <max_samples>LENGTH_UNLIMITED</max_samples>
               <max_instances>LENGTH_UNLIMITED</max_instances>
               <max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance>
          </durability_service>
          <deadline>
               <period>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </period>
          </deadline>
          <latency_budget>
               <duration>
                    <sec>0</sec>
                    <nanosec>0</nanosec>
               </duration>
          </latency_budget>
          <liveliness>
               <kind>AUTOMATIC_LIVELINESS_QOS</kind>
               <lease_duration>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </lease_duration>
          </liveliness>
          <reliability>
               <kind>BEST_EFFORT_RELIABILITY_QOS</kind>
               <max_blocking_time>
                    <sec>0</sec>
                    <nanosec>100000000</nanosec>
                    </max_blocking_time>
          </reliability>
          <destination_order>
               <kind>BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS</kind>
          </destination_order>
          <history>
               <kind>KEEP_LAST_HISTORY_QOS</kind>
               <depth>1</depth>
          </history>
          <resource_limits>
               <max_samples>LENGTH_UNLIMITED</max_samples>
               <max_instances>LENGTH_UNLIMITED</max_instances>
               <max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance>
          </resource_limits>
          <transport_priority>
               <value>0</value>
          </transport_priority>
          <lifespan>
               <duration>
                    <sec>DURATION_INFINITE_SEC</sec>
                    <nanosec>DURATION_INFINITE_NSEC</nanosec>
               </duration>
          </lifespan>
          <ownership>
               <kind>SHARED_OWNERSHIP_QOS</kind>
          </ownership>
     </topic_qos>
  </qos_profile>
</dds>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度文库旋转验证码识别

最近研究了一下图像识别&#xff0c;一直找到很好的应用场景&#xff0c;今天我就发现可以用百度的旋转验证码来做一个实验。没想到效果还挺好&#xff0c;下面就是实际的识别效果。 1、效果演示 2、如何识别 2.1准备数据集 首先需要使用爬虫&#xff0c;对验证码图片进行采…

leetcode最大二叉树

在本题中&#xff0c;我们是要将给定的数组构成一个二叉树&#xff0c;其根节点是数组中最大的元素&#xff0c;左子树都是最大值左边元素组成的&#xff0c;右子树都是最大值右边元素组成的。所以本题的关键在于我们先需要找到最大的元素。 我们构造二叉树&#xff0c;一般是采…

Vue.js 实用技巧:深入理解 Vue.mixin

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

商业数据增长超88%!小红书热门内容解析,用户“打卡”新玩法

长久以来&#xff0c;“打卡”在社交媒体盛行&#xff0c;频频涌现新风潮&#xff0c;几乎覆盖美食、旅游、美妆等众多热门行业&#xff0c;今天吃了什么、玩了什么、做了什么&#xff1f;大众都喜欢通过打卡来分享。特别是小红书平台&#xff0c;打卡内容热度经久不衰&#xf…

LeetCode Python - 31.下一个排列

目录 题目答案运行结果 题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更…

xss.haozi.me:0x03及04

这里有一个正则所以&#xff08;&#xff09;要用到实体编码 <a href"javascript:alert1">cc</a> 03 04都一样

Softmax 回归 + 损失函数 + 图片分类数据集【动手学深度学习v2】李沐动手学深度学习课程笔记

目录 Softmax回归 损失函数 图片分类数据集 Softmax回归从零开始实现 Softmax回归简洁实现 Softmax回归 回归和分类的区别 回归问题举例上节课的预测房价问题&#xff0c;分类问题就是对样本进行分类 回归和分类的具体区别 假设真实的类别为第i个类别&#xff08;值为1&#x…

掌握WhatsApp手机号质量评分:增加信息可达性

WhatsApp手机号质量评分是用于衡量用户手机号与平台互动的健康度&#xff0c;确保用户通讯时的合规性和安全性。在实掌握WhatsApp手机号质量评分实际应用中&#xff0c;这个评分会影响用户的消息发送的可达性。高质量的评分意味着用户的账户被视为可信赖的&#xff0c;其发送的…

知识点碎片一,物联网通信协议和技术

loT通信协议 1. 前言 本文属于老吴个人对物联网研发学习的路线整理&#xff0c;属于个人对物流网产品研发的知识碎片的学习&#xff0c;文章没有先后顺序&#xff0c;随笔记录。文章如果有错误&#xff0c;希望各位读者指出问题所在&#xff0c;老吴将不胜感激。 2. 名称概述…

动网格学习:如何系统学习,案例及相关学习内容目录-学习材料

一、学习文章及相关案例 动网格&#xff08;Moving Mesh&#xff09;是一种在数值模拟中用于处理流动区域随时间变化的技术。在流体动力学模拟中&#xff0c;当物理模型或某些区域的网格需要随着流动的进行而动态改变时&#xff0c;就会采用动网格技术。例如&#xff0c;在模…

设计师必备!8款在线原型图工具分享

在线原型图的核心功能是可视化需求&#xff0c;因此一个易于使用的在线原型图工具对原型图设计至关重要。使用熟悉的Photoshop 对于Illustrator来说&#xff0c;虽然它们功能强大&#xff0c;但界面太复杂&#xff0c;初学者很难快速上手&#xff0c;面对批量调整的在线原型图还…

PostgreSQL restartpoint 原理详解

背景 大部分人对 PG 的 checkpoint 机制会熟悉一点&#xff0c;但是对 restartpoint 却不太熟悉&#xff0c;网上介绍这方面的文章也比较少。因此&#xff0c;本文将以 PG 14.7 的社区代码为基础&#xff0c;介绍 PG 中的 restartpoint 机制。 原理介绍 什么是 restartpoint…

VR 全景模式OpenGL原理

VR 全景模式OpenGL原理 VR 全景模式原理 VR 全景模式原理将画面渲染到球面上&#xff0c;相当于从球心去观察内部球面&#xff0c;观察到的画面 360 度无死角&#xff0c;与普通播平面渲染的本质区别在渲染图像部分&#xff0c;画面渲染到一个矩形平面上&#xff0c;而全景需…

稀碎从零算法笔记Day4-LeetCode:交替合并字符串

前言&#xff1a;今天妹有深夜档&#xff0c;因为8点有个飞机 题型&#xff1a;字符串、双指针&#xff08;笔者没用这个思路&#xff09; 链接&#xff1a;1768. 交替合并字符串 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 著作权归作者所有。商业转…

Linux 文件系列:深入理解文件描述符fd,重定向,自定义shell当中重定向的模拟实现

Linux 文件系列:深入理解文件fd,重定向,自定义shell当中重定向的模拟实现 一.预备知识二.回顾C语言中常见的文件接口跟重定向建立联系1.fopen函数的介绍2.fclose函数的介绍3.代码演示1.以"w"(写)的方式打开2.跟输出重定向的联系3.以 "a"(追加)的方式打开4.…

Vue3 配置 vite.config.js 解决跨域问题

Vue3 配置 vite.config.js 解决跨域问题 问题再现 Access to XMLHttpRequest at ‘http://localhost:8080/user/register’ from origin ‘http://localhost:5173’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested…

JS数组,if等结构语序

目录 浏览器的断点调试&#xff1a; 流程控制&#xff1a; 顺序流程控制&#xff1a;流程代码会逐行向下进行。 分支流程控制&#xff1a; IF语句&#xff1a; Switch语句&#xff1a; Switch和if的区别&#xff1a; 三元表达式&#xff1a; 循环&#xff1a; for循环…

麻省理工最新开发AI模型,让机器人实现自主规划路线

文 | BFT机器人 麻省理工学院的研究人员独具匠心地应用了人工智能来解决仓库中的机器人路径规划问题&#xff0c;以此缓解交通拥堵的难题。据该学院介绍&#xff0c;他们的团队开发了一种深度学习模型&#xff0c;其效率比传统的强随机搜索方法高出近四倍&#xff0c;极大地提…

设计模式:策略模式 ⑥

一、策略模式思想 简介 策略模式&#xff08;Strategy Pattern&#xff09;属于对象的行为模式。其用意是针对一组算法&#xff0c;将每一个算法封装到具有共同接口的独立的类中&#xff0c;从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。…

关于V5版本的echarts的引导线标签文字存在描边问题

1.如果存在描边&#xff1a;&#xff08;如图所示&#xff0c;炒鸡难受好吧&#xff0c;也不知道官方为什么这样初始化&#xff09; 2.只需在series的label中配置color:#FFF即可