关于 Demo_Ocean 例子的分析

2023-11-16

关于 Demo_Ocean 例子的分析

重要总结:
1. 该例主要类不再继承自ExampleApplication和ExampleFrameListener, 重写驱动类和监听类
2. 如何创建OIS的输入系统
    1) 创建OIS::ParamList pl;
    2) 调用程序渲染窗口的 getCustomAttribute方法得到窗口WINDOW属性所代表的窗口句柄
    3) 将该窗口句柄插入pl中
    4) 以pl为参数, 调用OIS::InputManager的createInputSystem方法, 即可创建一个OIS输入管理器
    5) 该OIS输入管理器调用createInputObject方法, 可以创建键盘和鼠标对象
    6) 通过渲染窗口的getMetrics函数得到窗口高宽, 从而设定鼠标状态的高宽, 限制鼠标活动范围.
    7) 如果为缓冲输入, 调用各个对象的setEventCallback方法, 设置回调
3. CEGUI::System::getSingleton().getRenderer(); 可以得到当前的CEGUI渲染器
4. RenderTarget类的writeContentsToFile方法可以将渲染目标当前内容写入文件中
5. 在关闭Ogre或者异常发生的时候, 记住要清除共享指针, 否则会出现问题
        mActiveFragmentProgram.setNull();
        mActiveFragmentParameters.setNull();
        mActiveVertexProgram.setNull();
        mActiveVertexParameters.setNull();
        mActiveMaterial.setNull();
6. captureInput函数和releaseInput函数
    表明当捕捉CEGUI窗口的输入时, 会直接调用该窗口的事件处理函数
    而帧监听器的事件处理函数是通过注入CEGUI窗口实现的, 并没有调用CEGUI自身的事件处理函数
7. 本例主要是介绍如何通过CEGUI滚动条或者其他控件迅速改变材质着色程序变量的方法.
    函数 handleShaderControl 可以学习如何更改材质中着色程序的某一个变量
    函数 configureShaderControls 可以学习如何得到GPU程序参数, 以及物理索引等内容
8. 学会如何用control的脚本实现控制着色程序参数的变化

9. MaterialControls.h, MaterialControls.cpp文件用于控制材质的着色程序变量变化的相关类
10. 具体如何读取以及修改GPU的参数
    1) Ogre::GpuProgramParametersSharedPtr activeParameters; 为GPU程序参数
    2) activeParameters->getConstantDefinition(ActiveShaderDef.ParamName); 得到常量声明, ActiveShaderDef.ParamName为需要更改的参数名称
        其返回值赋值给 const Ogre::GpuConstantDefinition& def
    3) def.physicalIndex 得到该参数的物理索引
    4) activeParameters->getFloatPointer(ActiveShaderDef.PhysicalIndex); 根据该物理索引得到其在内存的指针const float* pFloat
    5) 对于本例中的ElementIndex表示该参数可能为一个数组, 则在该数组中根据ElementIndex取得其元素值
    6) 如果要修改该参数, 可用参数的_writeRawConstant函数
        activeParameters->_writeRawConstant(ActiveShaderDef.PhysicalIndex + ActiveShaderDef.ElementIndex, val);

    简略的说
    1. 根据参数名在GPU参数中得到常量声明
    2. 根据声明得到物理索引
    3. 根据索引得到该参数所在指针
    4. GPU参数的_writeRawConstant方法可用于修改常量


1. OceanDemo 类
    // 重写的主驱动类
        函数 configure
            配置对话框
        函数 chooseSceneManager
            创建一个ST_GENERI场景管理器
        函数 createCamera
            创建相机
        函数 createViewports
            当前窗口创建视口
        函数 setupResources
            加载资源位置
        函数 loadResources
            初始化所有的资源组
        函数 setupGUI
            创建CEGUI窗口
        函数 createScene
            设置环境光, 天空盒
            创建节点
            创建所有的光, 光节点, 公告板来设置表示光的对象
            设置相机位置
            创建平面表示海洋
                法线 UNIT_Y
                d 为 20
                场景管理器创建平面对象
                创建实体为该平面
                创建节点挂接该实体
        函数 setup
            其他如同以前一样
            增加两个函数
            initDemoEventWiring();
            initComboBoxes();
        
        函数 initComboBoxes
            初始化组合框, 给该组合框添加控制脚本所拥有的材质, 并在屏幕上显示材质名称
            
        函数 initDemoEventWiring
            给所有的CEGUI窗口增加事件处理函数
                ExitDemoBtn - PushButton::EventClicked - handleQuit
                ModelCombos - Combobox::EventListSelectionAccepted - handleModelComboChanged
                ShaderCombos - Combobox::EventListSelectionAccepted - handleShaderComboChanged
                root
                    - EventMouseMove - OceanDemo_FrameListener::handleMouseMove
                    - EventMouseButtonUp - OceanDemo_FrameListener::handleMouseButtonUp
                    - EventMouseButtonDown - OceanDemo_FrameListener::handleMouseButtonDown
                    - EventMouseWheel - OceanDemo_FrameListener::handleMouseWheelEvent
                    - EventKeyDown - OceanDemo_FrameListener::handleKeyDownEvent
                    - EventKeyUp - OceanDemo_FrameListener::handleKeyUpEvent
                ModelSpinCB - Checkbox::EventCheckStateChanged - OceanDemo_FrameListener::handelModelSpinChange
                LightSpinCB - Checkbox::EventCheckStateChanged - OceanDemo_FrameListener::handelLightSpinChange
                CameraRBtn - RadioButton::EventSelectStateChanged - OceanDemo::handleMovementTypeChange
                ModelRBtn - RadioButton::EventSelectStateChanged - OceanDemo::handleMovementTypeChange
                VerticalScroll - Scrollbar::EventScrollPositionChanged - OceanDemo::handleScrollControlsWindow
        
        函数 handleQuit
            跳用根的queueEndRendering函数直接退出
            
        函数 setShaderControlVal
            设置其中一个着色器控制的值
            
        函数 handleShaderControl
            重要函数, 处理材质的变化, 如散射, 镜面等等, 最重要的是可以设置材质中着色程序特定变量的值
            
        函数 handleModelComboChanged
            根据选择的Model选择正确的实体挂接
        
        函数 handleShaderComboChanged
            根据选择更改海洋的材质.
            
        函数 handleScrollControlsWindow
            每当 滚动含有着色器选项的垂直滚动条, 其内容的变化
        
        函数 handleMovementTypeChanged
            更改当前移动的物体对象
        
        函数 configureShaderControls
            得到当前活跃材质的GPU程序指针和GPU程序参数指针
            列出当前材质在控制脚本中列出的可以修改的程序参数
            根据参数列表设置着色器控制容器
            以及设置所有参数在CEGUI窗口上实现的子窗口
            另外要得到该参数在GPU程序中的物理索引
            
            
2. OceanDemo_FrameListener 类
    // 重写的帧监听器类
    基类: Ogre::FrameListener, OIS::KeyListener, OIS::MouseListener
    
    函数 convertOISButtonToCegui
        // Ogre的按钮转换成CEGUI可认的按钮
    函数 CheckMovementKeys
        // 检测按键, 改变一些变量状态
    函数 updateStats
        // 更新CEGUI窗口的一些子窗口文本
        
    构造函数
        创建OIS的输入系统 - OIS::InputManager* mInputManager
            1) 创建OIS::ParamList pl;
            2) 调用程序渲染窗口的 getCustomAttribute方法得到窗口WINDOW属性所代表的窗口句柄
            3) 将该窗口句柄插入pl中
            4) 以pl为参数, 调用OIS::InputManager的createInputSystem方法, 即可创建一个OIS输入管理器
            5) 该OIS输入管理器调用createInputObject方法, 可以创建键盘和鼠标对象
            6) 通过渲染窗口的getMetrics函数得到窗口高宽, 从而设定鼠标状态的高宽, 限制鼠标活动范围.
            7) 如果为缓冲输入, 调用各个对象的setEventCallback方法, 设置回调    
        得到CEGUI的渲染器
            mGuiRenderer = CEGUI::System::getSingleton().getRenderer();
            根据窗口名称, 得到各个子窗口
                CEGUI::WindowManager::getSingleton().getWindow("name");
                
    析构函数
        // 销毁OIS的输入对象和管理器
        
    函数 frameRenderingQueued
        抓取鼠标和键盘状态
        根据频率更新CEGUI的状态指示
        根据用户的选择选中要变换的对象,然后移动和旋转该对象
        根据用户选择旋转对象和光
        根据用户选择进行截屏
        
    函数 handleMouseMove
        处理CEGUI根窗口的鼠标移动
        如按下了左键, 右键没有按下, 设置旋转量
        如按下了右键, 左键没有按下, 设置左右的移动量
        两者同时按下, 则设置前后运动的移动量
        设置mUpdateMovement为真, 则提示下一帧需要处理对象的变化
        
    函数 handleMouseButtonUp
        处理鼠标按键弹起事件
            显示鼠标, 位置设置为上次鼠标隐藏时所处的位置
            其根窗口调用 releaseInput函数, 表示不再从窗口捕捉输入.
            
    函数 handleMouseButtonDown
        处理鼠标按键按下事件
            隐藏鼠标, 保存鼠标位置
            根窗口调用captureInput()函数, 捕捉窗口的输入
    函数 handleMouseWheelEvent
        处理鼠标滚轮, 设置对象的前后移动
    函数 handleKeyDownEvent, handleKeyUpEvent
        处理按键, 判断是否移动对象
    函数 handelModelSpinChange
        根据选择设置 mSpinModel变量
    函数 handelLightSpinChange
        设置 mSpinLight
    
    函数 mouseMoved, mousePressed, mouseReleased
        注入CEGUI窗口中
    函数 keyPressed
        设置按键消息, 如退出, 截屏, 并注入CEGUI窗口
    函数 keyReleased
        注入CEGUI窗口
    

MaterialControls.h, MaterialControls.cpp文件分析


1. ShaderControl 结构体
    用来保存着色器的控制信息
    三个接口:
        getRange - 得到范围
        convertParamToScrollPosition - 程序参数转化为滑动条位置(函数参数减去最小值)
        convertScrollPositionToParam - 滑动条位置转化为程序参数(函数参数加上最小值)
        
2. ShaderControlsContainer 为 ShaderControl结构体变量的vector容器类型, ShaderControlIterator 为该容器类型的迭代器类型

3. MaterialControls 类
    该类主要用于控制该材质的所有着色器控制对象, 即所有的ShaderControl对象.
    接口:
        getDisplayName - 返回用于显示的名称
        getMaterialName - 使用的材质名称
        getShaderControlCount - 该材质的ShaderControl对象 数
        getShaderControl - 根据索引范围特定的 ShaderControl对象
        addControl - 添加 ShaderControl对象
        
4. MaterialControlsContainer 为 MaterialControls对象的vector容器, MaterialControlsIterator 为该容器的迭代器类型

5. ShaderControlGUIWidget 结构体
    该结构体用于包含三个成员, 都为CEGUI的窗口, 其中一个为 Scrollbar
    
6. loadMaterialControlsFile, loadAllMaterialControlFiles 函数
    加载.control文件
    每一节如果含有material的设置, 就创建一个新的MaterialControls对象, 然后压入MaterialControlsContainer容器中
        而后遍历该节, 如果有control的设置, 该MaterialControls对象就添加新的ShaderControl对象

重要类与函数

Ogre
    RenderTarget 类
        RenderTarget::FrameStats 结构体
        其成员存储关于FPS的信息
        
        函数 getStatistics 
            // 返回 当前渲染性能的细节, 保存于 RenderTarget::FrameStats 结构体中
            备注: 如果使用者的应用程序希望显示自己的性能信息, 或者用于其他的方面, 这个方法可以返回一些有用的数据
        函数 getCustomAttribute
            // 得到一自定义属性(该属性可能是平台设定的)
            备注: 这个函数可以满足任意API的需要, 可以查看平台特定的细节. 渲染窗口的"WINDOW"属性, 可以得到窗口句柄
        函数 writeContentsToFile
            将渲染目标的当前内容写入文件中
            
    GpuProgramParametersSharedPtr 类型
        同 SharedPtr<GpuProgramParameters>
        
    SharedPtr<T> 类模板
        关联计数的共享指针, 用于当需要的时候销毁指针
        备注: 这是一个标准的共享指针实现, 用于当删除对象时, 计算出其关联数.
            如果 OGRE_THREAD_SUPPORT 定义为1, 使用该类是线程安全的.
            
    GpuProgramParameters 类
        将用于GpuProgram的程序参数收集在一起.
        备注: GPU程序状态包含用于程序的常量参数, 或者引擎根据需要自动将生成的渲染系统状态绑定到常量上去.
        GpuProgramParameters 对象通过GpuProgram创建, 可能有多个Pass实例共享, 正因为此, 一般使用共享指针来管理这些对象, 以便当没有任何Pass使用它们的时候自动删除
        高级程序使用参数(一致变量), 低级程序使用索引常量(indexed constants), 该类支持两者, 但你可以通过调用hasNamedParameters()得知是否支持命名常量.
        在文档中, 有位于'logical'和'phsical'索引之下的关联, 逻辑索引为使用低级程序的索引, 表现为一float4数组. 其中的一部分可能为可设置的, 一部分可能为程序中预定义的常量.
        我们只存储那些被设置的常量, 在我们的缓存中, 如果使用逻辑索引, 则缓存中可以有间隙,  而后我们映射这些缓存的逻辑索引至物理索引.
        当使用高级程序时, 逻辑索引不需要存在, 当然, 如果高级程序拥有直接的从参数名称到逻辑索引的映射, 则也许存在逻辑索引. 
        另外, 高级语言也许或也许不将元素的数组打包, 打包的话则将比连续的float4所占空间更小.
        ConstantDefinition 结构体可以保存这些信息, 以便于高级程序语言的需要. 你不必担心这些, 除非你想要从该结构读出参数, 而不是设置它们.
        
    TextureFilterOptions 类型
        这是一个枚举类型, 可以快速设置缩小倍率, 放大倍率和mip过滤器的高级过滤选项.
        枚举值:
            TFO_NONE            等同于 min = FO_POINT, mag = FO_POINT, mip = FO_NONE
            TFO_BILINEAR        等同于 min = FO_LINEAR, mag = FO_LINEAR, mip = FO_POINT
            TFO_TRILINEAR        等同于 min = FO_LINEAR, mag = FO_LINEAR, mip = FO_LINEAR
            TFO_ANISOTROPIC        等同于 min = FO_ANISOTROPIC, mag = FO_ANISOTROPIC, mip = FO_LINEAR
            
    StringUtil 类
        函数 split
            // 将该字符串根据分隔符分割成数组
        函数 parseInt
            // 将该字符转换成整数
            
    ResourceGroupManager 类
        函数 findResourceNames 
            // 在资源组中查找匹配的所有文件和文件夹
            
CEGUI
    UVector2 类
        一个二维向量类建立统一尺寸. 该类对象常用于表示位置和大小.
    Window 类
        函数 captureInput 
            // 捕捉窗口的输入
    Scrollbar 类
        函数 setDocumentSize 
            // 设置文档或者数据的大小
            这个文档大小必须看成当滚动时数据的总大小(即一文本文件的行数)
http://www.cppblog.com/summericeyl/archive/2009/11/08/100411.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 Demo_Ocean 例子的分析 的相关文章

  • Ubuntu运行rviz报错:OGRE EXCEPTION(3:RenderingAPIException): Unable to create a suitable GLXContext

    写在前面 笔者的测试环境 xff1a Ubuntu20 04 xff0c ROS noteic 一 问题描述 运行rviz时出现报错 xff1a span class token punctuation span WARN span cla
  • Ubuntu运行rviz报错:OGRE EXCEPTION(3:RenderingAPIException): Unable to create a suitable GLXContext

    写在前面 笔者的测试环境 xff1a Ubuntu20 04 xff0c ROS noteic 一 问题描述 运行rviz时出现报错 xff1a span class token punctuation span WARN span cla
  • Ogre-渐变背景色(gradient background)的实现

    转载自 xff1a http blog csdn net hefee article details 6287341 背景色在ogre里面是通过ViewPort类中的setBackgroundColour xff08 xff09 这个成员函
  • Ogre 界面(Overlay)

    Ogre 界面 Overlay 标签 border脚本buttontemplatesplugins引擎 2011 10 16 23 12 4725人阅读 评论 2 收藏 举报 分类 引擎技术 9 这里的界面是指菜单 HUD及提示信息框在内的
  • 纹理(Textures)

    纹理 Textures 原文 Textures 作者 JoeyDeVries 翻译 Django 校对 Geequlim BLumia 我们已经了解到 我们可以为每个顶点使用颜色来增加图形的细节 从而创建出有趣的图像 但是 如果想让图形看起
  • ogre每帧渲染在SceneManager::_renderScene()

    今天抄0 12版本ogre 在这里是每帧渲染的内容 以后可以再调试下高版本的 在这里设置个断点 void SceneManager renderScene Camera camera Viewport vp bool includeOver
  • [OGRE]基础教程来四发:来谈一谈地形系统

    OGRE 基础教程来四发 来谈一谈地形系统 标签 OGRE 2013 10 09 17 22 2238人阅读 评论 1 收藏 举报 分类 OGRE 11 版权声明 本文为博主原创文章 未经博主允许不得转载 英文链接如下 http www o
  • 如果XML文件太大(10M),打开方式选择

    用UltraEdit打开 其他的例如Editplus和notepad 根本打不开上百M的文件 一打开就死了
  • ogre 1.7.0

    今天编译了orge 第一次安装编译orge挺麻烦的 现把编译和安装步骤总结一下 1 ogre 1 7 0的下载地址 https sourceforge net projects ogre files ogre 1 7 ogre v1 7 0
  • Ogre学习记录

    Ogre学习记录 Posted on 2008 07 09 15 36 RichardHe 阅读 839 评论 2 编辑 收藏 引用 所属分类 OGRE 1 设计初衷 它设计初衷是完全跨平台的 抽象的接口隐藏了平台相关的细节 它设计初衷是大
  • 地形平滑算法

    地形平滑算法 2013 06 20 18 33 2486人阅读 评论 0 收藏 举报 分类 OGRE 41 C C 10 版权声明 本文为博主原创文章 未经博主允许不得转载 拉出来的地下不平滑怎么办 笨办法就是美工一个顶点一个顶点的调整 而
  • 5 个免费开源的 3D 建模/渲染工具。

    5 个开源 3D 建模 渲染工具 3八 2011 作者 riku 本文采用 CC BY NC SA 2 5协议授权 转载请注明 本文链接 5 个免费开源的 3D 建模 渲染工具 1 Art of Illusion 跨平台 支持 Window
  • 地形纹理Splatting技术(翻译)

    地形纹理Splatting技术 翻译 文章来源 http www gamedev net reference articles article2238 asp Texture Splatting in Direct3D Introducti
  • Axiom3D:Ogre地形代码解析

    Axiom3D Ogre地形代码解析 作者 天天不在 发布日期 2014 09 01 20 52 05 我来说两句 0 Tag标签 地形 代码 大致流程 这里简单介绍下 Axiom中采用的Ogre的地形组件的一些概念与如何生成地形 先说下大
  • Texture Format全解析

    Texture Format全解析 Texture Format全解析 What internal representation is used for the texture This is a tradeoff between size
  • hlsl register

    https msdn microsoft com en us library dd607359 v VS 85 aspx register Optional keyword for assigning a shader variable t
  • DirectD3D-纹理映射

    DirectD3D 纹理映射 标签 Direct3Ddirectx游戏游戏开发 2014 11 12 14 03 321人阅读 评论 0 收藏 举报 分类 DirectX 8 版权声明 本文为博主原创文章 未经博主允许不得转载 纹理映射的概
  • 学习笔记:多重纹理

    学习笔记 多重纹理 2009 09 01 14 20 52 转载 分类 学习笔记 多重纹理 多重纹理就是在渲染一个多边形的时候可以用到多张纹理图 把多张纹理图进行一些颜色的操作 可以达到一些效果 但是多重纹理必须是在显卡支持的情况下 但是还
  • 2021年11月6日-11月12日(ogre抄写+ue4视频,本周35小时,共1035小时,剩8965小时。)

    这周还不错 不但完成了本周学习任务 还完成了本月学习任务 方法就是 拼命抄源码 抄到吐时就再看看Ue4视频教程 内外兼修 可以在未来的日子里这么进行 每天5小时学习 还是进入状态的 5 7 35小时 共1035小时 剩8965小时 另外 去
  • Ogre g++ 编译时错误

    在ubuntu上 我已经编译并安装了所有的ogre库 但是 当我尝试使用此命令编译教程时 g o otest ogre cpp I pkg config libs cflags OGRE OIS lOgreMain lOI 它输出 tmp

随机推荐

  • MySQL 中读写分离可能遇到的问题

    前言 MySQL 中读写分离是经常用到了的架构了 通过读写分离实现横向扩展的能力 写入和更新操作在源服务器上进行 从服务器中进行数据的读取操作 通过增大从服务器的个数 能够极大的增强数据库的读取能力 MySQL 中的高可用架构越已经呈现出越
  • ubuntu 光盘读取

    把光盘放入光驱后 要挂载光驱 将光驱设备挂在到 mnt 下 sudo mount dev sr0 mnt mount dev sr0 is write protected mounting read only 到 mnt目录下就可以看到光盘
  • 一条SQL语句求前面记录的平均值

    有算法要求如下 For i 1 i lt 10 i ta i t 1 t 2 t i i 用一条SQL语句实现它 分别用表变量 ta 和 t 来对应 ta 和 t declare t table id int d decimal 18 4
  • 第一课 认识Python

    相比大家都听说过Python是一门容易学习的语言 那么实际是怎么样呢 我们从以下几点看看 1 首先 Python是最容易学习和最好用的语言 Python容易阅读和编写 比较清晰 格式非常简洁 表达能力强 这样同样写一个程序 Python比其
  • uniApp条件编译以及跳转方法

    1 使用Uniapp的方法获取系统环境 仅在JS中可以使用 uni getSystemInfoSync platform 获取应用所在的平台 if uni getSystemInfoSync platform ios if uni getS
  • pickle与.pkl文件

    经常遇到在Python程序运行中得到了一些字符串 列表 字典等数据 想要保存下来 长长久久的 方便以后使用 这个时候Pickle模块就派上用场了 pickle 模块及其同类模块 cPickle 向 Python 提供了 pickle 支持
  • mipi介绍

    文章目录 1 MIPI简介 1 1 DSI layer 2 D PHY 2 1 D PHY介绍 2 2 电平状态 2 3 lane结构 2 4 data lane操作模式 2 4 1 escape mode和space one hot co
  • kylin启动netstat: n: unknown or uninstrumented protocol

    检查hadoop配置的时候出现问题 报错如下 lcc lcc apache kylin 2 6 0 hbase1x bin check env sh Retrieving hadoop conf dir KYLIN HOME is set
  • 史上最快的实例分割SparseInst Int8量化实录

    近期 YOLOv7里面借鉴 复 制 粘 贴 了一个新的模型 SparseInst 我借助YOLOv7的基建能力 将其导出到了ONNX 获得了一个非常不错的可以直接用OnnxRuntime 或者TensorRT跑的实例分割 后续也可能把lin
  • 数据挖掘十大算法

    参考 ICDM 数据挖掘十大算法
  • flutter 去除超出警报

    给超出内容套上SingleChildScrollView组件即可 SingleChildScrollView child
  • wpf datagrid自动生成列时特殊字符转换

    DataGrid控件可以根据DataTable自动生成行和列 但是如果列名包括一些特殊字符 的时候 会出现无法显示出数据或者显示DataRowView的情况 原因是这些字符是Xaml里用来标识绑定path和xpath的符号 例如我们会这么用
  • C语言补漏:字符串指针与字符数组传参

    字符串指针与字符数组传参 深信服的笔试上被吊打 其中对一道用指针做形参的题目印象十分深刻 借此恶补了一晚上指针 今天总结 以作警示 试想有如下情形 将一个字符串指针做形参赋值函数修改其字符串 函数结束后字符串被改变了吗 include
  • 快速上手Gobject

    转自 http blog csdn net acs713 article details 7778051 What is G object 很多人被灌输了这样一种概念 要写面向对象程序 那么就需要学习一种面向对象编程语言 例如C Java
  • chrome扩展开发调试

    chrome扩展由content scripts browser actions background等多个部分组成 其中 content scripts属于注入web页面 所以在contentscripts中的console log会被正
  • Uncaught TypeError: AMap.MarkerClusterer is not a constructor

    实验点聚合时报错 cluster new AMap MarkerClusterer map markers styles sts gridSize 80 改为 map plugin AMap MarkerClusterer function
  • SQL语法基础

    SQL语法基础 SQL语法基础 SQL 是用于访问和处理数据库的标准的计算机语言 SQL 语句 需要在数据库上执行的大部分工作都由 SQL 语句完成 tips SQL 对大小写不敏感 SELECT 与 select 是相同的 一些最重要的
  • 【每周一个编程技巧 - Java笔记】玩转SSM:SpringBoot+Mybatis多条件筛选

    SpringBoot Mybatis多条件筛选 在实际的业务开发系统中 做的最多的工作就是增 删 改 查操作 而这部分增 删 改 查的操作中又有80 的都是查询操作 本文记录的主要内容是 基于SpringBoot和Mybatis来实现条件查
  • tesseract-orc编译及使用(WINDOWS VS 2019)

    1 准备资源 Vs2010或者更高版本 本教程使用vs2019 1 1Tesseract源码 分支切换到3 04 看到vs2010 git地址https github com tesseract ocr tesseract下载源码 文件夹并
  • 关于 Demo_Ocean 例子的分析

    关于 Demo Ocean 例子的分析 重要总结 1 该例主要类不再继承自ExampleApplication和ExampleFrameListener 重写驱动类和监听类 2 如何创建OIS的输入系统 1 创建OIS ParamList