当前位置: 首页 > 编程日记 > 正文

Unity3D心得分享

本篇文章的内容以各种tips为主,不间断更新

2019/05/10 最近更新: 使用Instantiate初始化参数去实例对象

Unity DEMO学习

===========================

Unity3D Adam Demo的学习与研究

Unity3D The Blacksmith Demo部分内容学习

Viking Village维京村落demo中的地面积水效果

Viking Village维京村落demo中的粒子距离消隐

The Courtyard demo学习

ShadowGun Demo学习(非技术向)

Unity AngryBots愤怒的机器人demo研究

注:关于《Book of the Dead》 demo,由于展示内容偏向unity新特性或者必须依赖HDRP的特性,故没写。

Unity Generic Tips

===========================

Unity3D 材质球设置参数无效果的解决方法

Unity3D欧拉和四元数两种旋转的用法

使用四元数点乘比较插值是否即将完成

解决摄像机旋转约束问题(RotateDelta,RotateClamp)

Unity中通过类名字符串取组件的方法

使anim,unity,prefab文件不显示乱码

Unity在编辑器状态下清空控制台信息

双面MeshCollider脚本

运行时修改代码不自动刷新

然后按Ctrl+R手动刷新,或者在Project面板下右键刷新

在代码中指定,暂停当前帧

Debug.Break或者Debug.LogError然后在控制台勾选报错暂停。

快速查看非闭合的MeshCollider

关闭MeshRenderer组件,即可显示出Collider的网格。

去除当前脚本警告

#pragma warning disable 0168

此示例可以清除变量未使用警告,具体对应警告ID。并且该预编译指令只对本文件有效。

也可以包裹使用

#pragma warning disable 0168....
#pragma warning restore 0168

一种更为简短的惰性字段初始化写法

object mObj;
object Obj { get { return mObj ?? (mObj = new object()); } }

以前一直这么写:

object Obj { get { mObj = mObj ?? new object(); return mObj; } }

无重复随机数创建

public int EliminateRepeatRandom(int last, int min, int max)
{var current = Random.Range(min, max);if (last == current)return (current + (int)Mathf.Sign(Random.value) * Random.Range(min + 1, max - 1)) % max;elsereturn current;
}

编辑器窗口滑动缩放(相较直接滑动滚轮步幅更小)

Alt+鼠标右键滑动

编辑器Scene窗口,便捷操控3D场景的方法

按住鼠标右键,wasdqe按键移动,分别对应3个轴向

将选中物品立刻移动到编辑器相机位置

ctrl+shift+f

显示当前选中物体的网格

在gizmos中勾选Selection Wire

去除恼人的standard shader高光

我们在用standard shader调制反射质感时,会有一块高光区域非常碍眼。

我们可以在Specular Hightlights处将其关闭

打印Vector3类型,但不保留2位小数

vector3有一个重载,可以指定format,其中f10就是保留到小数10位

不过由于是自己实现的,不能在string.format里用

xx.position.ToString("f10")

获得GameObject挂载任意Component中的接口

unity5.x可以直接GetComponent得到接口(unity5.3.4或更高版本有效)

GetComponent<IFoo>();

比较浮点数一致

Mathf.Approximately

删除Project面板里文件夹的展开状态

在Library/expandedItems,删除这个文件会重置展开状态

N卡显存占用查看

C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe

控制台内执行

Unity5 GI缓存目录

C:\Users\...\AppData\LocalLow\Unity\Caches\GiCache

unity资源商店缓存目录

C:\Users\...\AppData\Roaming\Unity

unity资源商店下载的资源包目录

...\AppData\Roaming\Unity\Asset Store-(具体unity版本).x\

在Unity中使用快捷键重命名

按F2

从中间删除数组元素,或者复制数组中间元素

复制中间元素:ctrl+d

从中间删除数组元素:shift+delete

或者右键数组中某个元素也会出现操作选项

快速打开所有可展开内容

Shift+Ctrl+Alt 点击可展开内容

判断目标是否在相机的平截头体内

var planes = GeometryUtility.CalculateFrustumPlanes(Camera.main);
var isContain = GeometryUtility.TestPlanesAABB(planes, bounds);if(isContain)
{//in frustum..
}

即使做了池来缓存,依旧第一次激活GameObject时游戏会卡一下(即播技能特效顿卡问题)

个人猜测是贴图和mesh没传到GPU,mesh倒还好,主要是贴图。

目前我建议的方法是用Graphics把所有经常用的对象全部实时DrawMesh去画,且包含贴图材质球。

可以新建一个16X16的RT画上去,骗过unity。缺点是会多几百个批次。

方法很极端,但有用。

自定义ScriptableObject所生成对象的图标

只需要为原始ScriptableObject脚本对象赋上图标即可

清空StringBuilder

StringBuilder sb = new StringBuilder();
sb.Length = 0;

有多种方法,但修改Length属性效率最高,参考这位园友的测试:https://www.cnblogs.com/SpiderKevin/p/3891425.html

Process执行的程序当前目录不正确问题(例.bat文件在d盘,但取到的当前目录是unity文件的目录)

var cacheDirectory = Directory.GetCurrentDirectory();
Directory.SetCurrentDirectory("your directory");
Process.Start("...");
Directory.SetCurrentDirectory(cacheDirectory);

执行之前设置一次当前目录即可。

Unity中快速将当前窗口放大至全屏

shift+space

获取当前项目中的所有程序集

AppDomain.CurrentDomain.GetAssemblies()

Unity Optimize Tips

===========================

遍历list或者数组时,缓存count,可以减少调用次数(10万次循环测试)

for (int i = 0, iMax = temp.Count; i < iMax; i++)temp[i].GetHashCode();

在极端情况下,直接用枚举器遍历字典会更快,而且不会产生GC

UnityEngine.Profiling.Profiler.BeginSample("-----1");
foreach (var item in temp)item.Value.GetHashCode();
UnityEngine.Profiling.Profiler.EndSample();UnityEngine.Profiling.Profiler.BeginSample("-----2");
foreach (var item in temp.Values)item.GetHashCode();
UnityEngine.Profiling.Profiler.EndSample();UnityEngine.Profiling.Profiler.BeginSample("-----3");
using (var handle = temp.GetEnumerator())
{while (handle.MoveNext())handle.Current.Value.GetHashCode();
}
UnityEngine.Profiling.Profiler.EndSample();

使用Instantiate初始化参数去实例对象

public class Foo : MonoBehaviour
{void Start(){var sw = new Stopwatch();sw.Start();var go = new GameObject();go.transform.position = Vector3.one;for (int i = 0; i < 10000; i++){var instancedGO = Instantiate(go);instancedGO.transform.SetParent(transform);instancedGO.transform.localPosition = Vector3.zero;instancedGO.transform.localRotation = Quaternion.identity;instancedGO.transform.localScale = Vector3.one;//102ms//Instantiate(go, transform.position, transform.rotation, transform);//74ms
        }sw.Stop();UnityEngine.Debug.Log("sw: " + sw.ElapsedMilliseconds);}
}

可以实例化出来再赋值,也可以使用参数直接复制

但是1万次循环测试下两种方法差了20多ms

关于Unity事件函数空调用

尽量少使用封装Unity事件的通用基类,这样会造成函数空调

unity会在C++层面检测是否实现某个事件函数(Start,Update,LateUpdate...etc)

如果没有这个函数则不会加入调用列表中

使用Matrix MultiplyPoint3x4而不是MultiplyPoint

对于非投影矩阵,使用MultiplyPoint3x4进行变换更快。

详见官方文档:https://docs.unity3d.com/ScriptReference/Matrix4x4.MultiplyPoint3x4.html

避免直接调用Camera.main

Camera.main内部会去调用FindGameObjectWithTag,1万次循环的测试下造成了1ms左右的开销

而缓存后大约在0.2ms

mCacheCamera = mCacheCamera ?? Camera.main;Profiler.BeginSample("Foo");
for (int i = 0; i < 10000; i++)mCacheCamera.GetHashCode();
Profiler.EndSample();

高效向量投影

有时候我们只需要投影轴上的值,而不是坐标。所以可以一行代码搞定:

var value = Vector3.Dot(point, onNormal);

并且少了normal向量的检查。比起Vector3的向量投影省了2步操作。

设置合理的各向异性过滤级别Aniso Level

贴图Aniso Level(Anisotropic filtering level)设置,可以改善mipmap贴图造成的远处模糊

但会增加图形硬件的性能开销,对该值要求不高的贴图,我们可以降低它的值进行优化

实时反射探针优化

如果需求必须使用实时反射探针,可以将其更新模式设为脚本驱动,在渲染前对反射内容进行模型lod替换或shader、材质上的替换

可以达到一定优化作用。

阴影优化

在场景中我们可以使用lod模型来投射阴影,场景中对于一些阴影对画面美观影响不大的模型,我们可以关闭这些模型的阴影投射

来进行优化。

NGUI Panel优化

Ngui中panel内的内容是会静态合批的,所以当内容较多时把静态的物件和会变化的动态物件放在不同的panel里

以提高性能。

Unity Editor Tips

===========================

Animator在Editor状态下预览工具

Unity3D中Console控制台的扩展

在Editor下获得时间

EditorApplication.timeSinceStartup

获得编译器自打开到当前的时间。

Editor下获得滚轮滑动值

Event.current.delta

https://docs.unity3d.com/ScriptReference/Event-delta.html

注意要先判断当前鼠标按钮id,滚轮的id是1

获取Project面板中当前选中物体的路径

AssetDatabase.GetAssetPath(Selection.activeObject);

取Unity当前目录的路径(是Unity自身安装目录,取当前项目目录请用Directory.GetCurrentDirectory())

EditorApplication.applicationPath

EditorApplication.applicationContentsPath

显示对话框

EditorUtility.DisplayDialog

UnityDatabase拷贝文件

AssetDatabase.CopyAsset(需要拷贝文件,目标目录);

1.只能拷贝单个文件,不能拷贝目录

2.目标必须是目录路径,不能是文件路径

3.不用System.io而用它,因为插件能够跨平台

Editor状态下设置Scene窗口的相机位置

SceneView.lastActiveSceneView.pivot = ...;
SceneView.lastActiveSceneView.Repaint();

Editor下使用右键菜单

使用GenericMenu可以直接调出Unity的右键菜单

Editor下检查prefab是否都打了标签/读写标签Labels

AssetDatabase.GetLabels

AssetDatabase.SetLabels

Editor下拿到当前拖拽对象(跨窗口)

DragAndDrop.objectReferences

在DragExited时处理拖拽内容,就可以在松手时触发了

if (Event.current.type == EventType.DragExited && DragAndDrop.objectReferences.Length > 0)
{var dragItem = DragAndDrop.objectReferences[0];...

如果是多选拖拽,数组里的就是多选的所有对象,否则就是一个。

Editor下控制控件的焦点

通常只要把focus设为空,就可以取消焦点

GUI.FocusControl("");

一些特殊的情况,比如弹出性组件,需要知道控件是否被改变过,而非值是否改变过

可以这么做,通过GetNameOfFocusedControl拿到Focus的name进行比较

var oldFocus = GUI.GetNameOfFocusedControl();
var changedIndex = EditorGUI.Popup(rect, index, array);
var newFocus = GUI.GetNameOfFocusedControl();if (newFocus != oldFocus)
{//Do something...
GUI.FocusControl("");
}

Editor下获得'剪切','拷贝','撤销'等命令

可以使用commandName获得

Event.current.commandName == "Copy"

EditorWindow窗口大小锁死后没有边框的解决方法

var window = GetWindow(typeof(MyWindow), true);window.minSize = new Vector2(960, 540);
window.maxSize = window.minSize;

用GetWindow创建窗口时,第二个参数填true。创建为独立的工具窗口,即可恢复边框

Editor下Dirty掉当前修改过的场景对象内容

一般非场景对象用

EditorUtility.SetDirty(target);

而场景对象则用

EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene());

Editor下BeginScrollView报错InvalidCastException

和调用顺序有关,也是Layout/Repaint和输入之间的问题。

改变调用先后顺序有可能解决。

在Editor下绘制自定义光标

比如缩放需要绘制缩放的自定义光标,滑动又需要滑动的

使用下方法即可绘制,Rect自定义Cursor区域的Rect。

需要每次OnGUI更新都调,而非只Add一次

EditorGUIUtility.AddCursorRect(Rect, MouseCursor.Pan);

Editor下的LayerMaskField

Unity并没有提供LayerMask控件,其Layer控件返回的只是层编号

下面是一个扩展的LayerMaskField:

public static LayerMask LayerMaskField(string label, LayerMask layerMask)
{List<string> layers = new List<string>();List<int> layerNumbers = new List<int>();for (int i = 0; i < 32; i++){string layerName = LayerMask.LayerToName(i);if (layerName != ""){layers.Add(layerName);layerNumbers.Add(i);}}int maskWithoutEmpty = 0;for (int i = 0; i < layerNumbers.Count; i++){if (((1 << layerNumbers[i]) & layerMask.value) > 0)maskWithoutEmpty |= (1 << i);}maskWithoutEmpty = EditorGUILayout.MaskField(label, maskWithoutEmpty, layers.ToArray());int mask = 0;for (int i = 0; i < layerNumbers.Count; i++){if ((maskWithoutEmpty & (1 << i)) > 0)mask |= (1 << layerNumbers[i]);}layerMask.value = mask;return layerMask;
}

转载于:https://www.cnblogs.com/hont/p/3305769.html

相关文章:

django搭建示例-ubantu环境

python3安装--------------------------------------------------------------------------- 最新的django依赖python3,同时ubantu系统默认自带python2与python3&#xff0c;这里单独安装一套python3&#xff0c;并且不影响原来的python环境 django demo使用sqlite3&#xff0c…

C++11中std::lock_guard的使用

互斥类的最重要成员函数是lock()和unlock()。在进入临界区时&#xff0c;执行lock()加锁操作&#xff0c;如果这时已经被其它线程锁住&#xff0c;则当前线程在此排队等待。退出临界区时&#xff0c;执行unlock()解锁操作。更好的办法是采用”资源分配时初始化”(RAII)方法来加…

OpenAI机械手单手轻松解魔方,背靠强化学习+新技术ADR

编译 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】10月15日&#xff0c;人工智能研究机构OpenAI发布了一条机械手单手解魔方的视频。这个自学式的类人机器人手臂名为 Dactyl&#xff0c;不仅可以单手解魔方&#xff0c;甚至能在外加各种干扰&#x…

AMD and CMD are dead之js模块化黑魔法

缘由 在2013-03-06 13:58的时候&#xff0c;曾甩下一片文章叫&#xff1a;《为什么不使用requirejs和seajs》&#xff0c;并放下豪言说发布一款完美的模块化库&#xff0c;再后来就把那篇文章删了&#xff0c;再然后就没有然后。该用seajs还用seajs&#xff0c;甚至我码的SCJ都…

一文了解Python常见的序列化操作

关于我 编程界的一名小小程序猿&#xff0c;目前在一个创业团队任team lead&#xff0c;技术栈涉及Android、Python、Java和Go&#xff0c;这个也是我们团队的主要技术栈。 联系&#xff1a;hylinux1024gmail.com 0x00 marshal marshal使用的是与Python语言相关但与机器无关的二…

TEE(Trusted Execution Environment)简介

TEE(Trusted Execution Environment)&#xff0c;可信执行环境&#xff0c;该环境可以保证不被常规操作系统干扰的计算&#xff0c;因此称为”可信”。这是通过创建一个可以在TrustZone的”安全世界”中独立运行的小型操作系统实现的&#xff0c;该操作系统以系统调用(由TrustZ…

自动驾驶关键环节:行人的行为意图建模和预测(上)

作者 | 黄浴出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】介绍一下最近行人行为意图建模和预测的研究工作&#xff0c;还是分上下两部分&#xff0c;本文为上半部分。Social LSTM: Human Trajectory Prediction in Crowded Spaces比较早的是斯坦福大学 201…

自定义windows下自动清除文件夹或者文件的只读属性的脚本

脚本内容入下&#xff1a;其中脚本中 ”/d"作用 &#xff08;可以用来改变当前驱动器目录&#xff09;例如&#xff1a; 我现在是在D盘&#xff0c;现在我要切换到C:\windows目录 脚本参数中 ATTRIB -R /S /D 解释内容如下&#xff1a;&#xff08;上述脚本参数中的 cd …

C++11容器中新增加的emplace相关函数的使用

C11中&#xff0c;针对顺序容器(如vector、deque、list)&#xff0c;新标准引入了三个新成员&#xff1a;emplace_front、emplace和emplace_back&#xff0c;这些操作构造而不是拷贝元素。这些操作分别对应push_front、insert和push_back&#xff0c;允许我们将元素放置在容器头…

Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)

2019独角兽企业重金招聘Python工程师标准>>> 在线演示地址&#xff1a;SilverlightWCF 新手实例 象棋 在线演示 在SilverlightWCF 新手实例 象棋 主界面-棋谱-布局写谱(三十六)中&#xff0c;我们完成下棋双方的棋谱显示&#xff0c;这节&#xff0c;我们为观众增加…

确认!语音识别大牛Daniel Povey将入职小米,曾遭霍普金斯大学解雇,怒拒Facebook

整理 | 夕颜 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 【导读】10 月 17 日&#xff0c;语音界传奇 Daniel Povey 发布推特&#xff0c;宣布自己 2019 年末将要入职小米&#xff0c;目前正在签订合同阶段&#xff0c;入职后&#xff0c;他将带领一支团队研发…

软链接与硬链接

$ ln f1 f2 #创建f1的一个硬连接文件f2$ ln -s f1 f3 #创建f1的一个符号连接文件f3$ ls -li # -i参数显示文件的inode节点信息转载于:https://www.cnblogs.com/zhizouxiao/p/3794668.html

一文读懂Python复杂网络分析库networkx | CSDN博文精选

作者 | yyl424525来源 | CSDN博客文章目录1. 简介安装支持四种图绘制网络图基本流程2. Graph-无向图节点边属性有向图和无向图互转3. DiGraph-有向图一些精美的图例子环形树状图权重图Giant ComponentRandom Geometric Graph 随机几何图节点颜色渐变边的颜色渐变Atlas画个五角星…

C++11多线程中std::call_once的使用

C11中的std::call_once函数位于<mutex>头文件中。在多线程编程中&#xff0c;有时某个任务只需要执行一次&#xff0c;此时可以用C11中的std::call_once函数配合std::once_flag来实现。如果多个线程需要同时调用某个函数&#xff0c;std::call_once可以保证多个线程对该函…

Solaris 上网配置

2019独角兽企业重金招聘Python工程师标准>>> 早上装solaris10系统的时候&#xff0c;没选默认&#xff0c;选了desk-session模式安装。全英文无界面安装&#xff0c;中间还跑出几个乱码。 靠着随便选随便F2&#xff0c;终于安装完了。 就在那设完分辨率后&#xff0…

Configure,Makefile.am, Makefile.in, Makefile文件之间关系

为什么80%的码农都做不了架构师&#xff1f;>>> 1.autoscan (autoconf): 扫描源代码以搜寻普通的可移植性问题&#xff0c;比如检查编译器&#xff0c;库&#xff0c;头文件等&#xff0c;生成文件configure.scan,它是configure.ac的一个雏形。 your source files…

这款耳机一点不输千元级的AirPods

你如果问我&#xff1a;生活中你觉得必不可少的一件电子产品是什么&#xff1f;那么我会毫不犹豫的回答你&#xff1a;是耳机&#xff01;出门忘带耳机是绝对不能忍听不听没关系&#xff0c;但是有它比较安心我觉得生活中不仅是我很多人都对耳机有一种依赖因为很多人都喜欢音乐…

CUDA Samples: Image Process: BGR to Gray

在图像处理中&#xff0c;颜色变换BGR到Gray&#xff0c;常见的一般有两种计算方式&#xff0c;一种是基于浮点数计算&#xff0c;一种是基于性能优化的通过移位的整数计算。浮点数计算公式为&#xff1a; gray 0.1140 * B 0.5870 * G 0.2989 * R;整数计算公式为&#xff1…

CYQ.Data 数据框架系列索引

2019独角兽企业重金招聘Python工程师标准>>> 索引基础导航&#xff1a; 1&#xff1a;下载地址&#xff1a;http://www.cyqdata.com/download/article-detail-426 2&#xff1a;入门教程&#xff1a;http://www.cyqdata.com/cyqdata/article-cate-33 3&#xff1a;购…

Tesseract 3 语言数据的训练方法

OCR,光学字符识别 光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描&#xff0c;然后对图像文件进行分析处理&#xff0c;获取文字及版面信息的过程。OCR技术非常专业&#xff0c;一般多是印刷、打印行业的从业人员使用&#xff0c;可以快速的将纸质资料…

Windows C++中__declspec(dllexport)的使用

__declspec是Microsoft VC中专用的关键字&#xff0c;它配合着一些属性可以对标准C/C进行扩充。__declspec关键字应该出现在声明的前面。 __declspec(dllexport)用于Windows中的动态库中&#xff0c;声明导出函数、类、对象等供外面调用&#xff0c;省略给出.def文件。即将函数…

图灵奖得主LeCun力推无监督学习:要重视基于能量的学习方法

作者 | Tiernan Ray译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导语&#xff1a;图灵奖得主深度学习大牛 Yann LeCun 表示&#xff0c;人工智能的下一个发展方向可能是放弃深度学习的所有概率技巧&#xff0c;转而掌握一系列转移能量值的方法。据说&a…

html5小游戏Untangle

2019独角兽企业重金招聘Python工程师标准>>> 今天介绍一个HTML5的小游戏&#xff0c;让大家体验到HTML5带来的乐趣。这个小游戏很简单&#xff0c;只要用鼠标拖动 蓝点&#xff0c;让图上的所有线都不相交&#xff0c;游戏时间就会停止&#xff0c;是动用大家头脑的…

【VMCloud云平台】SCCM(四)域内推送代理

继上一篇云平台完成SCCM部署篇之后&#xff0c;SCCM篇正式开始&#xff0c;今天将开始介绍SCCM为域内机器推送代理&#xff08;紫色为完成实施&#xff0c;红色为实施中&#xff09;&#xff1a; 1、 点击站点&#xff1a; 2、 右键属性&#xff0c;点击客户端安装设置&#…

Python实现决策树(Decision Tree)分类

关于决策树的简介可以参考&#xff1a; http://blog.csdn.net/fengbingchun/article/details/78880934在 https://machinelearningmastery.com/implement-decision-tree-algorithm-scratch-python/ 中给出了CART(Classification and Regression Trees,分类回归树算法,简称CART…

顶尖技术专家严选,15场前沿论坛思辨,2019中国大数据技术大会邀您共赴

扫码了解2019中国大数据技术大会&#xff08;https://t.csdnimg.cn/IaHb&#xff09;更多详情。2019中国大数据技术大会&#xff08;BDTC 2019&#xff09;将于12月5日-7日在北京长城饭店举办&#xff0c;本届大会将聚焦智能时代&#xff0c;大数据技术的发展曲线以及大数据与社…

jQuery 加法计算 使用+号即强转类型

1 var value1 $("#txt1").val(); 2 var value2 $("#txt2").val(); 3 //数值前添加号 number加号和数值加号需要用空格隔开 即实现加法运算 4 $("#txt3").val(value1 value2); 转载于:https://www.cnblogs.com/xiemin-minmin/p/11026784.…

Android Volley 库通过网络获取 JSON 数据

本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库通过网络获取 JSON 数据 参考资料 Android 关于网络操作一般都会介绍 HttpClient 以及 HttpConnection 这两个包。前者是 Apache 开源库&#xff0c;后者是 Android 自带 API。企业级应用&#xff0…

​哪些开发问题最让程序员“头秃”?我们分析了Stack Overflow的11000个问题

作者 | Nick Roberts编译 | AI科技大本营&#xff08;ID:rgznai100&#xff09;自 2008 年成立以来&#xff0c;Stack Overflow 一直在拯救所有类型的开发人员。自那时以来&#xff0c;开发人员提出了数百万个关于开发领域的问题。但是&#xff0c;迫使开发者转向 Stack Overfl…

OpenCV3.3中决策树(Decision Tree)接口简介及使用

OpenCV 3.3中给出了决策树Decision Tres算法的实现&#xff0c;即cv::ml::DTrees类&#xff0c;此类的声明在include/opencv2/ml.hpp文件中&#xff0c;实现在modules/ml/src/tree.cpp文件中。其中&#xff1a;(1)、cv::ml::DTrees类&#xff1a;继承自cv::ml::StateModel&…