搜索“= new”关键字
一般来说,很难找到面向对象程序中是何时开始实例化的。而对象何时创建,何时消亡是对理解对象的生命周期及其关键的。一种不是那么严谨的方法是看文件中哪些地方使用了new语句。
利用VS Code全局搜索功能搜索“= new”关键字,排除extern文件夹(即第三方库)以后得到33个文件中的149个结果。
如图所示
再进行人工手动筛选,去掉Utilities、Tools、Test、Exporter等相关的。
再去掉Boundary、PBD相关的
折叠之后得到
这里面显然可以分为三组:
GUI目录下的
Simulator目录下的
SPlisHSPlasH目录下的
我们依次观察
GUI目录
该目录下只有三个文件有该关键字。
GUI\imgui\imguiParameters.cpp 下多是重复的创建ParameterObject的
这显然是用来将参数显示到GUI上,并实现绑定的。不重要。
GUI\OpenGL\MiniGL.cpp:
创建一个Shader
GUI\OpenGL\Shader.cpp:
看名字infoLog应该是和log有关。
Simulator目录
该目录下有5个文件具有该关键字
首先是main.cpp
这显然是最关键的。
它实例化了一个SimulatorBase类型的对象。这就是模拟启动器的实例。应该是个单例。
下面又实例化了Simulator_GUI_imgui对象。这就是GUI的实例。应该也是个单例。
Simulator\SceneConfiguration.cpp:
用于创建场景导入器
(由于图床出了点问题这里开始用代码)
Simulator\SceneConfiguration.cpp:
45 {
46: m_current = new SceneConfiguration ();
47 }
Simulator\SimulatorBase.cpp:
这里由于太多,我只截取几个,实例化以下几个对象:
boundary(静态和动态)
SceneLoader::BoundaryData
m_boundarySimulator = new StaticBoundarySimulator(this);
m_boundarySimulator = new PBDBoundarySimulator(this);
SceneLoader::BoundaryData *emitterBoundary = new SceneLoader::BoundaryData();
Simulator\StaticBoundarySimulator.cpp:
显然也是Boundary
例如
StaticRigidBody *rb = new StaticRigidBody();
BoundaryModel_Akinci2012 *bm = new BoundaryModel_Akinci2012();
BoundaryModel_Koschier2017 *bm = new BoundaryModel_Koschier2017();
BoundaryModel_Bender2019 *bm = new BoundaryModel_Bender2019();
Simulator\GUI\imgui\Simulator_GUI_imgui.cpp:
都是GUI参数绑定的,不再赘述
SPlisHSPlasH\FluidModel.cpp:
发射器
m_emitterSystem = new EmitterSystem(this);
SPlisHSPlasH目录
SPlisHSPlasH\Simulation.cpp
SPlisHSPlasH\Simulation.cpp:
这个文件也很关键,实际算法都是从这里实例化的。
它实例化了以下对象:
- AnimationFieldSystem
- NeighborhoodSearch
- FluidModel
- 各类timeStep类定义的压力求解算法,如
- TimeStepWCSPH
- TimeStepPCISPH
- TimeStepPBF
- TimeStepIISPH
- TimeStepDFSPH
- TimeStepPF
- TimeStepICSPH
m_animationFieldSystem = new AnimationFieldSystem();
m_neighborhoodSearch = new NeighborhoodSearch(m_supportRadius);
FluidModel *fm = new FluidModel();
以下是各种具体的timeStep类。这属于策略模式。
if (method == SimulationMethods::WCSPH)
{
m_timeStep = new TimeStepWCSPH();
m_timeStep->init();
setValue(Simulation::KERNEL_METHOD, Simulation::ENUM_KERNEL_CUBIC);
setValue(Simulation::GRAD_KERNEL_METHOD, Simulation::ENUM_GRADKERNEL_CUBIC);
}
else if (method == SimulationMethods::PCISPH)
{
m_timeStep = new TimeStepPCISPH();
m_timeStep->init();
setValue(Simulation::KERNEL_METHOD, Simulation::ENUM_KERNEL_CUBIC);
setValue(Simulation::GRAD_KERNEL_METHOD, Simulation::ENUM_GRADKERNEL_CUBIC);
}
else if (method == SimulationMethods::PBF)
{
m_timeStep = new TimeStepPBF();
m_timeStep->init();
setValue(Simulation::KERNEL_METHOD, Simulation::ENUM_KERNEL_POLY6);
setValue(Simulation::GRAD_KERNEL_METHOD, Simulation::ENUM_GRADKERNEL_SPIKY);
}
else if (method == SimulationMethods::IISPH)
{
m_timeStep = new TimeStepIISPH();
m_timeStep->init();
setValue(Simulation::KERNEL_METHOD, Simulation::ENUM_KERNEL_CUBIC);
setValue(Simulation::GRAD_KERNEL_METHOD, Simulation::ENUM_GRADKERNEL_CUBIC);
}
else if (method == SimulationMethods::DFSPH)
{
m_timeStep = new TimeStepDFSPH();
m_timeStep->init();
setValue(Simulation::KERNEL_METHOD, Simulation::ENUM_KERNEL_PRECOMPUTED_CUBIC);
setValue(Simulation::GRAD_KERNEL_METHOD, Simulation::ENUM_GRADKERNEL_PRECOMPUTED_CUBIC);
}
else if (method == SimulationMethods::PF)
{
m_timeStep = new TimeStepPF();
m_timeStep->init();
setValue(Simulation::KERNEL_METHOD, Simulation::ENUM_KERNEL_PRECOMPUTED_CUBIC);
setValue(Simulation::GRAD_KERNEL_METHOD, Simulation::ENUM_GRADKERNEL_PRECOMPUTED_CUBIC);
}
else if (method == SimulationMethods::ICSPH)
{
m_timeStep = new TimeStepICSPH();
m_timeStep->init();
setValue(Simulation::KERNEL_METHOD, Simulation::ENUM_KERNEL_CUBIC);
setValue(Simulation::GRAD_KERNEL_METHOD, Simulation::ENUM_GRADKERNEL_CUBIC);
}
其中SimulationMethod就是个枚举量而已
enum class SimulationMethods { WCSPH = 0, PCISPH, PBF, IISPH, DFSPH, PF, ICSPH, NumSimulationMethods };
others
SPlisHSPlasH\Simulation.h:
debug工具
m_debugTools = new DebugTools();
SPlisHSPlasH\TimeManager.cpp:
时间管理器
current = new TimeManager ();
SPlisHSPlasH\Elasticity\Elasticity_Kugelstadt2021.cpp:
这个是具体的算法,忽略。
总结
除去Extern等,我们得到了33个文件中的149个结果含有new关键字。筛选一些Utilities等的,还剩下以下几个
我们分为三组:
- GUI
- Simulator
- SPlishsplash
他们分别实例的关键对象有
目录 | 实例化的关键实例 |
---|---|
GUI | Shader; GUI相关Parameter |
Simulator | SimulatorBase; Simulator_GUI_imgui; SceneConfiguration; Boundary相关 |
splishsplash | AnimationFieldSystem; NeighborhoodSearch; FluidModel; 各类timeStep类压力求解算法 |
其中标黑的几个是尤其重要的。