考虑以下代码:
struct foo
{
static constexpr int value = 42;
};
void bar(const int* value) { std::cout << *value; }
int main() { bar(&foo::value); }
Run Code Online (Sandbox Code Playgroud)
编译没有问题,并没有在警告夫妇的在线编译器我试过了.鉴于没有.cpp定义该constexpr值的单个文件,如果bar从不同的编译单元调用该方法,指针的值是否可以不同?或者标准是否保证值最终只在所有编译单元中分配一次(即隐式_declspec(selectany))?
我记得当我看到DirectX 12的最初谈话时,我认为它消除了对纹理图谱的需求.然而,现在看起来并不是一个明显的结论,我正在阅读文档.
我见过的一个可以替代它的功能是HLSL中资源数组的动态非均匀索引:
Texture2D<float4> textures[128];
SamplerState sampler;
textures[NonUniformResourceIndex(textureIndex)].Sample(sampler, uv);
Run Code Online (Sandbox Code Playgroud)
另一个潜在的特性是ExecuteIndirect,它编码仍然是一堆单独的绘图和资源更改调用缓冲区,并在单个CPU调用中立即将其提交给GPU.
这两个都将解决纹理图集的局限性(无法在atlas区域使用边界模式,有问题的mipmapping),但我想知道性能特征或预期是否与纹理图谱相似或者该技术是否仍然合理.
我也很想知道答案是否适用于Mantle,Vulkan和Metal.
我对ID3D12GraphicsCommandList::SetGraphicsRootSignature方法的存在有点困惑。从我对这个 MSDN 页面的理解来看,它的唯一有效用法似乎是始终在 之后调用它SetPipelineState,并为其提供与创建管道状态对象时提供的相同的根签名。如果是这样,那么不隐含有什么好处?还有其他方法可以使用这种方法吗?
我正在编写一个 JIT 编译器,我惊讶地发现在 Win64 调用约定中,如此多的 x86-64 寄存器是非易失性的(被调用者保留的)。在我看来,非易失性寄存器只是在所有可以使用这些寄存器的函数中做更多的工作。在数值计算的情况下尤其如此,您希望在叶函数中使用许多寄存器,例如某种高度优化的矩阵乘法。但是,例如,16 个 SSE 寄存器中只有 6 个是易失性的,因此如果您需要使用更多,您将有很多溢出要做。
所以是的,我不明白。这里有什么权衡?
据我所知,GL_ALPHA8内部像素格式已从 OpenGL 3.1 中的 OpenGL 核心规范中删除。似乎不再有带有 alpha 通道但没有 RGB 通道的像素格式。这是否意味着唯一的选择是创建GL_RGBA8纹理并将 RGB 分量设置为 255,从而浪费 75% 的内存?
由于WinRT暴露了IStorageFolder接口和StorageFolder类,我的反应是在我的代码中使用接口.我推断,IStorageFolder它可以用作抽象来支持非文件系统文件夹,如压缩存档中的文件夹.但是,查看IStorageFolder接口,声明每个方法都返回具体StorageFolder实例.因此,不可能基于该接口实现虚拟文件系统.
那么如何IStorageFolder有用的抽象呢?或者它的存在是否有技术上的理由?