knowledge

2025年6月30日

bool OutletBeh::GetAirCleanSwitch()
{
	float emissionRate = 0.0f;
	CallParticleFunction(mTree, std::bind(&OutletBeh::GetParticleEmissionRateImpl, this, std::placeholders::_1, emissionRate));
	return emissionRate > 0.0f;
}

std::ref(emissionRate) 创建了对变量 emissionRate 的引用包装器。在这个上下文中,它的作用是允许 GetParticleEmissionRateImpl 函数修改 emissionRate 变量的值。

在 C++ 中,使用 std::bind 时,参数默认是按值传递的。如果需要传递引用以便被调用函数可以修改原始变量,就必须使用 std::refstd::cref(常量引用)。

查看代码,GetParticleEmissionRateImpl 方法接收参数为 float&(引用类型),它需要修改这个参数的值:

void OutletBeh::GetParticleEmissionRateImpl(std::shared_ptr<SceneNode> particleNode, float& emissionRate)
{
    // ...
    emissionRate = particle->GetSystem().GetParticleEmitter()->GetModules().GetEmissionModule().GetEmissionRate();
}

如果不使用 std::refstd::bind 会创建一个 emissionRate 的副本,对副本的修改不会影响原始变量。使用 std::ref 确保了函数能修改调用者作用域中的原始 emissionRate 变量。

2025年6月12日

关于KTX格式

KTX格式是Khronos Texture格式,它提供了几个关键优势:

  • 直接GPU加载 - KTX是为GPU设计的格式,可以直接被GPU加载,无需像JPEG那样先解码到CPU内存再传输到GPU
  • 支持压缩纹理 - 可以存储已压缩的GPU纹理格式(如ETC, ASTC, BC),减少GPU内存占用和带宽需求
  • 保留完整的纹理元数据 - 包括mipmap级别、纹理类型等信息
  • 跨平台兼容性 - 由Khronos Group(OpenGL/Vulkan标准组织)定义的标准格式
  • 虽然文件大小可能与JPG相近,但主要优势在于渲染性能和加载速度。对于序列帧动画的首尾帧,使用KTX可能是为了减少这些关键帧的加载延迟,因为这些帧在视觉过渡中最为关键,需要更快的加载速度以确保流畅的用户体验。

此外,KTX格式可以保持更高的图像质量而不引入JPG的压缩伪影,这对于静态展示的首尾关键帧特别重要。

怎么那么爱用函数回调?

双重逻辑非运算符

代码中的 !!mSlider 是C/C++中常见的双重逻辑非运算符用法,主要用于:

  1. 类型转换:将任意类型的值强制转换为严格的布尔值
  2. 运算逻辑:
    • 第一层 ! 将原值转为逻辑非值(0变1,非0变0)
    • 第二层 ! 再次反转得到等效布尔值
posted @ 2025-06-12 10:25  無碍  阅读(21)  评论(0)    收藏  举报