<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[PupYuan的博客]]></title><description><![CDATA[不治已病治未病，不治已乱治未乱]]></description><link>https://blog.csdn.net/DdogYuan</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; DdogYuan]]></copyright><item><title><![CDATA[游戏项目自动化测试的一些思考和想法]]></title><link>https://blog.csdn.net/DdogYuan/article/details/122022526</link><guid>https://blog.csdn.net/DdogYuan/article/details/122022526</guid><author>DdogYuan</author><pubDate>Sun, 19 Dec 2021 12:38:24 +0800</pubDate><description><![CDATA[自动化测试框架需要什么样的前置条件
对于游戏项目而言，什么样的测试比较合适
如何构建更健壮、效率更高的自动化测试

Actor Test
面对与动画、时间相关的行为该如何测试
该使用什么粒度的测试


自动化测试作为构建系统的一部分
参考资料

自动化测试框架需要什么样的前置条件

自动化测试代码需要能够独立地启动游戏，加载所需的资源，并直接跳过不相关的流程，直接步进到需要测试的流程。这个过程越短越好，因此，需要系统在设计上保证不同流程的解耦。例如系统能够在没有登录的状态下直接进入一个游戏场景，并根据配置.]]></description><category></category></item><item><title><![CDATA[运营期游戏项目重构实践复盘]]></title><link>https://blog.csdn.net/DdogYuan/article/details/122021181</link><guid>https://blog.csdn.net/DdogYuan/article/details/122021181</guid><author>DdogYuan</author><pubDate>Sun, 19 Dec 2021 10:41:08 +0800</pubDate><description><![CDATA[对于运营期游戏项目，有哪些重构实践？怎样重构能避免对已有系统造成影响？结合自己前几年的开发经验做了一些记录和总结。]]></description><category></category></item><item><title><![CDATA[虚幻引擎的PostProcessVolume和相机的后处理设置的关系]]></title><link>https://blog.csdn.net/DdogYuan/article/details/120875187</link><guid>https://blog.csdn.net/DdogYuan/article/details/120875187</guid><author>DdogYuan</author><pubDate>Wed, 20 Oct 2021 21:26:59 +0800</pubDate><description><![CDATA[PostProcessVolume和相机的后处理设置
虚幻引擎要做后处理的话，会看到PostProcessVolume这个物件，同时在相机中也会看到后处理相关的设置，这两个有什么区别？以及他们的关系是什么？

它们的适用范围是不同的。PostProcessVolume是一个摆在场景中的物件，可以看到它会有一个范围，这个范围表示的是当相机进入此范围时，会对相机进行后处理。而相机的后处理设置指的是此相机会一直拥有的一个后处理效果。
PostProcessVolume可以调成无限大，这样无论在场景中哪个相机，都会]]></description><category></category></item><item><title><![CDATA[设计一个新的数据结构，可以等概率地随机获得字典中的键]]></title><link>https://blog.csdn.net/DdogYuan/article/details/119656029</link><guid>https://blog.csdn.net/DdogYuan/article/details/119656029</guid><author>DdogYuan</author><pubDate>Thu, 12 Aug 2021 23:32:59 +0800</pubDate><description><![CDATA[初步思路：新数据结构维护一个列表，维护添加进来的键
每次给数据结构设值和删除的时候，额外维护一个列表，从列表中添加和删除键。在做随机取键的时候，从该列表中随机选一个键。
但额外维护的列表，会导致这个数据结构在删除值的时候，无法O(1)地从列表中删除指定的键。
新数据结构使用字典，映射索引到键
核心的思路是，在每次设值的时候，将该键映射到一个值。然后在每次删除键的时候，能在O(1)时间内找到这个映射值。
每次设值的时候可以将键映射到当前字典的大小，在删除任意键N的时候，找到该键的映射值N1，将当前映射到字典大]]></description><category></category></item><item><title><![CDATA[python和C#的垃圾回收机制对比]]></title><link>https://blog.csdn.net/DdogYuan/article/details/119520690</link><guid>https://blog.csdn.net/DdogYuan/article/details/119520690</guid><author>DdogYuan</author><pubDate>Sun, 08 Aug 2021 21:09:19 +0800</pubDate><description><![CDATA[再啃了一遍python和C#的垃圾回收机制，将其综合对比并总结一下。
Python的垃圾回收机制
首先总结一下python的垃圾回收机制：
1：引用计数。python使用引用计数来统计每个对象被引用的次数，每当python对象引用数量降为0时，其内存会被立刻释放掉。这种方案的优点是原理简单，对象内存能被平稳地释放掉（因为内存释放发生在代码正常执行时，边运行边释放内存）。而缺点是无法解决循环引用问题。因此python的垃圾回收机制除了引用计数外，还补充了其他机制来解决引用计数。
2：标记-清除算法。pytho]]></description><category></category></item><item><title><![CDATA[Unity的垃圾回收是在主线程运行的吗？]]></title><link>https://blog.csdn.net/DdogYuan/article/details/104580881</link><guid>https://blog.csdn.net/DdogYuan/article/details/104580881</guid><author>DdogYuan</author><pubDate>Sat, 29 Feb 2020 20:23:37 +0800</pubDate><description><![CDATA[面试题
Unity的垃圾回收是在主线程中运行的吗？
回答
首先，Unity并不负责垃圾回收，Unity的脚本基于mono，而mono基于.NET（mono和.net的关系还没理清）。
在.NET 4.0之前，CIL使用并发垃圾回收技术来清理不再使用的对象。当对第0代或第1代（这两代称为暂时代）对象执行回收的时候，系统会暂时挂起所有活动的线程，确保应用程序在回收过程中不会访问托管堆。不在暂时代的对象...]]></description><category></category></item><item><title><![CDATA[Unity UI 优化Batch方法]]></title><link>https://blog.csdn.net/DdogYuan/article/details/104174478</link><guid>https://blog.csdn.net/DdogYuan/article/details/104174478</guid><author>DdogYuan</author><pubDate>Tue, 04 Feb 2020 20:22:49 +0800</pubDate><description><![CDATA[Unity UI 优化Batch方法预备知识什么是Draw Call，Batch?什么是Batching?什么是Canvas的rebatch？Unity UI 优化Batch方法正确使用Sprite Atlases调整子节点的顺序分割画布(Canvas)分割画布的策略分割画布的方式分割画布分割的越多越好吗？References
预备知识
什么是Draw Call，Batch?
每次绘制一个物体在屏...]]></description><category></category></item><item><title><![CDATA[glfw+glad使用opengl4.x的computeShader配置事项]]></title><link>https://blog.csdn.net/DdogYuan/article/details/89632748</link><guid>https://blog.csdn.net/DdogYuan/article/details/89632748</guid><author>DdogYuan</author><pubDate>Sun, 28 Apr 2019 10:19:27 +0800</pubDate><description><![CDATA[computeShader是opengl4.2版本引入的特性，所以为了使用它必须将glfw+glad版本升级，有如下几个需要注意的事项：
glad升级
glad需要升级到4.2+以后的版本，这里我选择了4.6，glad在线服务：https://glad.dav1d.de/

glfw版本升级
glfw要升级到多少版本具体不清楚，这里选择了glfw3.3（截至到目前最新的版本），glfw官网：htt...]]></description><category></category></item><item><title><![CDATA[stb_image.h单头文件库的重复包含问题]]></title><link>https://blog.csdn.net/DdogYuan/article/details/88665366</link><guid>https://blog.csdn.net/DdogYuan/article/details/88665366</guid><author>DdogYuan</author><pubDate>Tue, 19 Mar 2019 16:22:41 +0800</pubDate><description><![CDATA[问题阐述
由于stb_image.h这个库在声明了：
#define STB_IMAGE_IMPLEMENTATION

之后便会成为可执行的源码，故不建议在头文件中声明和使用stb_image.h中的函数。
例子说明
我们在model.h中引入了stb_image.h库并直接在model.h中声明了一个加载纹理的方法：
TextureFromFile(...)

同时我们直接在model.h中定...]]></description><category></category></item><item><title><![CDATA[Ogre的渲染流程解析]]></title><link>https://blog.csdn.net/DdogYuan/article/details/85011943</link><guid>https://blog.csdn.net/DdogYuan/article/details/85011943</guid><author>DdogYuan</author><pubDate>Sat, 15 Dec 2018 10:17:21 +0800</pubDate><description><![CDATA[渲染循环
一般由应用程序调用root-&amp;amp;amp;gt;startRendering(void)开启渲染循环。
void Root::startRendering(void)
{
         ...
        //游戏渲染循环是一个无限循环，除非被frame listeners或者queueEndRendering()终止
        mQueuedEnd = false;

       ...]]></description><category></category></item><item><title><![CDATA[Unity协程解析——状态机实现的代码分步执行]]></title><link>https://blog.csdn.net/DdogYuan/article/details/84535802</link><guid>https://blog.csdn.net/DdogYuan/article/details/84535802</guid><author>DdogYuan</author><pubDate>Mon, 26 Nov 2018 12:47:48 +0800</pubDate><description><![CDATA[Unity协程的效果
协程是一个分部执行，遇到条件（yield return 语句）会挂起，直到条件满足才会被唤醒继续执行后面的代码。
Unity在每一帧（Frame）都会去处理对象上的协程。Unity主要是在Update后去处理协程（检查协程的条件是否满足）
协程跟Update()其实一样的，都是Unity每帧对会去处理的函数（如果有的话），至少是每帧的LateUpdate()后去运行。
在Un...]]></description><category></category></item><item><title><![CDATA[C++ 虚函数的内部实现]]></title><link>https://blog.csdn.net/DdogYuan/article/details/83411102</link><guid>https://blog.csdn.net/DdogYuan/article/details/83411102</guid><author>DdogYuan</author><pubDate>Fri, 26 Oct 2018 11:59:48 +0800</pubDate><description><![CDATA[单继承的情况下
若类有虚函数，则在构造函数的时候编译器会自动为类的实例（对象）在其内存的首部（0地址偏移处）增添一个虚函数表指针vfptr，指向该类的虚函数表。虚函数表中会存放该类所有的虚函数地址，普通函数则不会被放入其中。如果是子类重写了父类的虚函数，那么在建立虚函数表的时候被重写的虚函数的地址被替换成了子类的虚函数。
而使用父类指针BaseClass* base指向一个子类对象DerivedC...]]></description><category></category></item><item><title><![CDATA[翻转字符串——不用额外的内存空间]]></title><link>https://blog.csdn.net/DdogYuan/article/details/82939776</link><guid>https://blog.csdn.net/DdogYuan/article/details/82939776</guid><author>DdogYuan</author><pubDate>Thu, 04 Oct 2018 19:41:23 +0800</pubDate><description><![CDATA[描述
给定一个字符串，逐个翻转字符串中的每个单词。
说明
单词的构成：无空格字母构成一个单词
样例
给出s = “the sky is blue”，返回&amp;quot;blue is sky the&amp;quot;
使用额外空间的思路
使用std::string的find_first_of，以’ '为参数，将s分割成多个单词并推进堆栈中，然后利用堆栈的先进后出的特点，以弹出的顺序去得到逆序的字符串。这样会使用额外的空间来暂存...]]></description><category></category></item><item><title><![CDATA[Lintcode181——将整数A转换为B]]></title><link>https://blog.csdn.net/DdogYuan/article/details/82915822</link><guid>https://blog.csdn.net/DdogYuan/article/details/82915822</guid><author>DdogYuan</author><pubDate>Mon, 01 Oct 2018 12:13:34 +0800</pubDate><description><![CDATA[题目描述
描述
如果要将整数A转换为B，需要改变多少个bit位？

Both n and m are 32-bit integers.

您在真实的面试中是否遇到过这个题？  
样例
如把31转换为14，需要改变2个bit位。

(31)10=(11111)2

(14)10=(01110)2

初始思路
两个数异或之后得到数t（例如样例中t为10001）
问题转换为判断t中有多少个1
可以通过移...]]></description><category></category></item><item><title><![CDATA[非泛型集合的集合问题]]></title><link>https://blog.csdn.net/DdogYuan/article/details/82495488</link><guid>https://blog.csdn.net/DdogYuan/article/details/82495488</guid><author>DdogYuan</author><pubDate>Fri, 07 Sep 2018 13:54:07 +0800</pubDate><description><![CDATA[非泛型集合的使用实例

　　假设我们创建了非泛型的System.Collections.ArrayList来保存数值（分配在栈上的）数据，查询ArrayList成员，就会发现它们所操作的是System.Object数据:

public class ArrayList:...
{
  ...
  public virtual int Add(object value);
  public virt...]]></description><category></category></item><item><title><![CDATA[C#按值传递引用类型&按引用传递引用类型]]></title><link>https://blog.csdn.net/DdogYuan/article/details/82423233</link><guid>https://blog.csdn.net/DdogYuan/article/details/82423233</guid><author>DdogYuan</author><pubDate>Wed, 05 Sep 2018 14:20:39 +0800</pubDate><description><![CDATA[值类型和引用类型

与引用类型相对的是值类型。

值类型

当把一个值类型赋给另外一个时，就是对字段成员逐一进行复制，此时在栈上新建了值类型的两个副本，每一个都可以被独立操作。



引用类型

和栈中的值类型相比，当对引用类型应用赋值操作符时，我们就是在内存中重定向引用变量的指向。 
其中，所有类实例都是引用类型。

按值传递引用类型

回顾一下形参和实参

 
在一般传值调用的机制中只能把实参...]]></description><category></category></item><item><title><![CDATA[Intelligent Scissors 原理与实现]]></title><link>https://blog.csdn.net/DdogYuan/article/details/80554873</link><guid>https://blog.csdn.net/DdogYuan/article/details/80554873</guid><author>DdogYuan</author><pubDate>Sun, 03 Jun 2018 10:49:21 +0800</pubDate><description><![CDATA[边缘特征

我们观察到，磁力套索会自动地去贴合图像中物体的边缘，而图像的边缘特征可以由图像像素的一阶导数和二阶导数描述，故图像中梯度幅值和拉普拉斯算子响应值较高的更可能是图像中的边缘。





最小代价路径



用户操作流程

整个程序的操作流程是这样的，用户首先在想要的轮廓附近设置一个初始点（称之为seed point），然后移动鼠标，在这个过程中曲线会自动地去贴合图像物体的轮廓。



程...]]></description><category></category></item><item><title><![CDATA[Intelligent Scissors 介绍]]></title><link>https://blog.csdn.net/DdogYuan/article/details/80371070</link><guid>https://blog.csdn.net/DdogYuan/article/details/80371070</guid><author>DdogYuan</author><pubDate>Sat, 19 May 2018 01:54:49 +0800</pubDate><description><![CDATA[这学期的计算机视觉有一个非常有趣的project：实现PhotoShop中的智能套索~在此做个记录和总结。

Intelligent Scissors 介绍

PhotoShop中磁力套索，可以用来“抠出”指定图片中想要的部分。 


使用的时候，边界会“自动”地贴合到边缘，达到只需少量的人工操作就可以迅速分割出物体边界的功能。



Intelligent Scissors 资料索引

论文

...]]></description><category></category></item><item><title><![CDATA[Intelligent Scissors 绘图功能的构建]]></title><link>https://blog.csdn.net/DdogYuan/article/details/80371116</link><guid>https://blog.csdn.net/DdogYuan/article/details/80371116</guid><author>DdogYuan</author><pubDate>Sat, 19 May 2018 01:51:32 +0800</pubDate><description><![CDATA[绘图功能需求描述

首先，程序的绘制部分是需要实时交互的，即使用者点击设置了seed point后，再次移动鼠标，在移动鼠标的过程中图像不停地展示鼠标位置到seed point的最小代价路径。

动态绘图的实现方式

在鼠标回调函数中，每次回调都新建一个Mat temp，将原图的图像数据拷贝到temp中，然后在temp上进行绘制，然后刷新opencv的窗口。

例如我在鼠标回调函数的末尾加了一个d...]]></description><category></category></item><item><title><![CDATA[Ogre源码编译与安装]]></title><link>https://blog.csdn.net/DdogYuan/article/details/79559667</link><guid>https://blog.csdn.net/DdogYuan/article/details/79559667</guid><author>DdogYuan</author><pubDate>Wed, 14 Mar 2018 21:04:50 +0800</pubDate><description><![CDATA[Orge源码编译与安装

这学期的课程需要分析Orge源码，所以打算编译Orge源码来满足课程要求； 
Orge版本我这里使用的是1.10.11 


需要提前安装


Visual Studio （我使用的是VS2017）
CMake https://cmake.org/download/ （我用的是3.11.0）




安装过程



1. 下载


下载Orge编译所需要的依赖项：ogre...]]></description><category></category></item></channel></rss>