【splishsplash】对象何时实例化?--搜索所有= new语句

搜索“= 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:
这个文件也很关键,实际算法都是从这里实例化的。
它实例化了以下对象:

  1. AnimationFieldSystem
  2. NeighborhoodSearch
  3. FluidModel
  4. 各类timeStep类定义的压力求解算法,如
    1. TimeStepWCSPH
    2. TimeStepPCISPH
    3. TimeStepPBF
    4. TimeStepIISPH
    5. TimeStepDFSPH
    6. TimeStepPF
    7. 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

他们分别实例的关键对象有

目录实例化的关键实例
GUIShader; GUI相关Parameter
SimulatorSimulatorBase; Simulator_GUI_imgui; SceneConfiguration; Boundary相关
splishsplashAnimationFieldSystem; NeighborhoodSearch; FluidModel; 各类timeStep类压力求解算法

其中标黑的几个是尤其重要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值