我正在测试一个 OpenGL 应用程序,我故意不删除大量 OpenGL 构造来检查内存泄漏。
例如,我创建了一个包含多个着色器的数组,但从未调用过 glDeleteShader()
然而 valgrind 报告没有内存泄漏,
是 valgrind 无法检测到这些内存泄漏,还是有一些垃圾收集器在我背后确保不会发生此类泄漏?
VS code 喜欢为我思考,这是文本编辑器可以做的第一件事。为了“帮助”,它将自动输入 [] 和 {},删除时也会删除 [] 而不仅仅是 ]。当输入 HTML 时,它还会尝试</div>
在错误的时间自动添加...
99% 的情况是,当它添加一个我自己没有添加的角色时,它会产生问题。我怎样才能关闭该功能?即,如果我没有显式地按某个键来修改字符,则 VS 代码无权触及该字符。
我复制粘贴了这个vulkan 教程中的代码,试图将其拆开并理解 Vulkan API。但是,我无法让它在没有错误的情况下运行。
如果我禁用验证,代码会按预期运行。但是,如果启用验证,我会得到:
validation layer: SPIR-V module not valid: Codesize must be a multiple of 4 but is 421. The Vulkan spec states: If pCode points to SPIR-V code, codeSize must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01376
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,那就是 LunarSDK 验证检查之一。
所以我认为我必须要求一个 vulkan 扩展来处理 glsl 着色器而不是 Spir-v,但我不知道该怎么做,因为这是我第一次处理 API,我不知道我在寻找什么代码. 我尝试阅读教程和文档,但找不到如何修复它。
假设您有一个2D点阵列,并且正在寻找最小/最大边界框.
哪个会更快,手动方法:
float min_x = min_y = highest, max_x = max_y = lowest;
for(auto p: points) {
max_x = max(max_x, p.x);
max_y = max(max_y, p.y);
min_x = min(min_x, p.x);
min_y = min(min_y, p.y);
}
Run Code Online (Sandbox Code Playgroud)
或使用C++工具:
auto[min_x, max_x] =
minmax_element(values.begin(), values.end(), [](auto p1, auto p2) { return p1.x < p2.x; });
auto[min_y, max_y] =
minmax_element(values.begin(), values.end(), [](auto p1, auto p2) { return p1.y < p2.y; });
Run Code Online (Sandbox Code Playgroud)
我想知道哪个理论上应该更快.我不关心特定机器完成所花费的时间(以毫秒为单位),我想知道在基准测试之前我应该期望哪一个更快.
我正在编译一些没有优化的代码但是在启用优化的情况下中断.我怀疑代码的某些关键部分被优化了,导致逻辑崩溃.
我想做的事情如下:
code...
#disable opt
more code...
#enable opt
Run Code Online (Sandbox Code Playgroud)
如果我可以设置该部分的优化级别(如O0,O1 ......)会更好
对于那些暗示它是代码的人:
要删除的代码部分是(通过反汇编目标文件来检查):
void wait(uint32_t time)
{
while (time > 0) {
time--;
}
}
Run Code Online (Sandbox Code Playgroud)
我严重怀疑该代码有问题
如果希望正常渲染,渲染最近的相机对象,则按如下方式设置OpenGL标志:
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)
所以我认为这样做:
glDepthFunc(GL_GREATER);
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)
也可以让我渲染距离相机最远的碎片.但是在设置这样的标志时我看不到输出.(我的申请没有进行任何其他修改)
如何渲染最远离相机的碎片?
我正在手动检查由 VK_LAYER_LUNARG_standard_validation
找到了包装器,但是它根据文档应该包装的一些验证层没有找到。
我正在查询这样的图层:
const std::vector<const char*> validationLayers =
{
"VK_LAYER_GOOGLE_threading",
"VK_LAYER_LUNARG_parameter_validation",
"VK_LAYER_LUNARG_device_limits",
"VK_LAYER_LUNARG_object_tracker",
"VK_LAYER_LUNARG_image",
"VK_LAYER_LUNARG_core_validation",
"VK_LAYER_LUNARG_swapchain",
"VK_LAYER_GOOGLE_unique_objects",
};
void PrintLayerStatus(VkLayerProperties layer_info, string layer_name, bool layer_found)
{
string major = to_string(VK_VERSION_MAJOR(layer_info.specVersion));
string minor = to_string(VK_VERSION_MINOR(layer_info.specVersion));
string patch = to_string(VK_VERSION_PATCH(layer_info.specVersion));
string version = major + "." + minor + "." + patch;
string mark = (layer_found) ? string(CHECK) : string(CROSS);
RecordLog("\n" + string(layer_name) + ", "
"Vulkan version " + version + ", "
+ "layer version " + …
Run Code Online (Sandbox Code Playgroud) 我正在尝试转换现有的代码库以使用在lunar SDK 中的vulkan.hpp 中定义的包装器。
\n\n特别是,我有以下代码行:
\n\nvkEnumerateInstanceLayerProperties(&layerCount, nullptr);
这是使用 vulkan 进行操作的原生 C 方式。
\n\n我尝试将其更改为:
\n\nvk::enumerateInstanceLayerProperties(&layerCount, nullptr);
\n这是 vulkan.hpp 的命名约定。然而,这无法编译,并出现多个错误,第一个是error: \xe2\x80\x98unsigned int*\xe2\x80\x99 is not a class, struct, or union type
vulkan.hpp中定义的签名是:
\n\ntemplate <typename Allocator, typename Dispatch>\n VULKAN_HPP_INLINE typename ResultValueType<std::vector<LayerProperties,Allocator>>::type enumerateInstanceLayerProperties(Allocator const& vectorAllocator, Dispatch const &d )\n
Run Code Online (Sandbox Code Playgroud)\n\n我的假设是第一个参数需要是一个向量:\nstd::vector<vk::LayerProperties> availableLayers;\n vk::enumerateInstanceLayerProperties(availableLayers, nullptr);
然而,这也无法编译,警告我:\nerror: request for member \xe2\x80\x98vkEnumerateInstanceLayerProperties\xe2\x80\x99 in \xe2\x80\x98d\xe2\x80\x99, whichis of non-class type \xe2\x80\x98std::nullptr_t\xe2\x80\x99
d
是函数的第二个参数。
成功编译这段代码需要什么调度?
\n我正在尝试以下操作:
Eigen::SparseMatrix<double> bijection(2 * face_count, 2 * vert_count);
/* initialization */
Eigen::VectorXd toggles(2 * vert_count);
toggles.setOnes();
Eigen::SparseMatrix<double> deformed;
deformed = bijection * toggles;
Run Code Online (Sandbox Code Playgroud)
Eigen 返回一个错误,声称:
error: static assertion failed: THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS
586 | EIGEN_STATIC_ASSERT((internal::is_same<Dest,void>::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
Run Code Online (Sandbox Code Playgroud)
根据本征文件
允许稀疏矩阵和向量积。我究竟做错了什么?
我已经实现了半边数据结构作为模板库。原因是,我必须将该库从 glm 移植到 eigen,然后我必须将其扩展为在任意维度上工作,但仅限于 3D。
因此,我发誓永远不会只是为了获得一半优势而到处改变类型。
然而,尽管我的 half edge 按预期运行和执行,但它的标头太大,以至于在包含它的任何文件上占用了 30% 左右的编译时间。
令人沮丧的是,也许图书馆所做的 80% 的工作完全不知道几何数据是什么。
一般概述是这样的
template<typename Data>
class HalfMesh
{
vector<Data> data;
vector<HalfEdge> verts;
vector<HalfEdge> edges;
vector<Face> faces;
void SomeMethod(){/* uses only verts, edges, and faces */}
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下verts, edges, faces
,都是非模板化类,并且该结构所做的 80% 涉及这 3 个类,而不是Data
.
我想减少编译时间,所以理想情况下我想将一些成员方法移入 cpp 文件并移出标头。
是否有一些语法告诉 c++“所有这些函数对于任何模板都是相同的,链接到 cpp 文件并让我将实现移出标头”?
c++ ×7
vulkan ×3
math ×2
opengl ×2
arrays ×1
c ×1
compilation ×1
eigen ×1
gcc ×1
header ×1
ide ×1
linux ×1
matrix ×1
memory ×1
memory-leaks ×1
optimization ×1
performance ×1
sdk ×1
templates ×1
text-editor ×1
valgrind ×1
wrapper ×1