问题标签 [physfs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
180 浏览

c++ - Magick++ 没有从博客加载

我正在使用 Magick++ 加载一些图像。因为我想为所有图像加载包装 PhysFS,所以我需要通过 blob 而不是文件路径加载图像。

这段代码:

工作没有问题。

但是,一旦我做了一个 blob,我就会得到一个异常:

抛出的异常是:

以 Magick::ErrorMissingDelegate 类型的未捕获异常终止,没有此图像格式的解码委托 `'@error/blob.c/BlobToImage/350

我已验证 blob 与文件大小相同。所以我确信它正在将它读入内存。

我尝试使用标准库 ifstream 以及设置 std::ios::binary 但问题仍然存在。

0 投票
2 回答
391 浏览

c# - 用于非托管互操作的 C# 对象的指针

我目前正在为PhysFS library编写一个包装器,并且偶然发现了一些关于托管对象编组的麻烦。以PHYSFS_enumerateFilesCallback方法为例,该方法将函数指针和用户定义的指针作为其参数。如何将托管对象传递给此方法?这就是我目前正在做的事情:

最后,这就是我将任意对象传递给该方法的方法:

当我运行此代码时:

委托被合法数据调用 4 次,第五次包含垃圾数据,然后它抛出 AccessViolationException 我怀疑这是因为对象在调用委托之间被 GC。任何人都可以阐明这一点吗?

更新:更改挂载目录消除了垃圾数据,但仍然抛出异常,并且仍然在所有数据都可以使用之前

0 投票
2 回答
178 浏览

c++ - 为什么我的编译器试图从signed long long 转换为unsigned int

线

产生警告

warning C4244: 'initializing' : conversion from 'PHYSFS_sint64' to 'unsigned int', possible loss of data

PHYSFS_sint64是一个 typedefsinged long long

PHYSFS_fileLength返回一个PHYSFS_sint64

所以我不明白为什么当我尝试将 a 分配给 a 时编译器会尝试从signed long longto转换?unsigned intsigned long longsigned long long

当我明确输入signed long long而不是PHYSFS_sint64它时仍然输出相同的警告

我现在是不是很傻?我不明白

0 投票
1 回答
141 浏览

c++ - R6025 纯虚函数调用(类派生自 sf::InputStream)

对于我的游戏,我想使用 PhysFs 提取 zip 文件中的音乐文件

我创建了一个自定义类MusicStream,它继承自我sf::InputStream用作sf::Music's 流的类。

这是我的基本程序:

这完美无瑕,除了一件事:

当我关闭窗口并退出程序时,出现运行时错误R6025 pure virtual function call并且程序崩溃。

所以显然一个纯虚函数被称为(sf::InputStream的dtor??),但我实现了所有sf::InputStream的函数,这对我来说没有意义。

另外,我不确定代码是否相关,但如果是的话,这是自定义类:

音乐流.h

音乐流.cpp

0 投票
0 回答
261 浏览

c - 如何通过 PhysFS 加载动态库?

这是我的困境:我正在使用PhysFS,它允许我将多个目录和档案视为一个虚拟目录。这是针对未来的视频游戏,我打算让 modder 友好。PhysFS 是使其易于修改的最佳方式。

同时,我还打算使用一种脚本扩展器,它可以动态加载库并在 Lua 中注册它们。我已经创建了一个粗糙的、临时的、更大的概念验证 Lua 脚本扩展器

那么我的问题是什么?我的问题是dlopen / LoadLibrary仅适用于真实文件系统上的文件。我想通过 PhysFS 加载。我通过 PHYSFS_openRead 加载文件,然后使用 PHYSFS_read 将文件的全部内容加载到内存缓冲区中。

有人建议将.so / .dll文件从 PhysFS 加载到内存中,然后将其写入 Linux 中的 /tmp 或 Windows 中的 C:\temp,然后 dlopen 。但我不认为这是一种非常优雅的方式。

那么……还有其他想法吗?我确实查看了mmap并认为也许我可以手动加载 ELF 文件(在 Linux 上)并以某种方式手动提取函数,最后为 Lua 注册它们,但到目前为止,我能生成的只是一个程序,它给了我关于精灵

人们说我应该研究LibJIT,但我不确定这对我有什么帮助。

所以我该怎么做?如何通过 PhysFS 将库加载到内存中,并使用dlopen 的替代方法... dlsym 从中提取函数?

请不要建议dlopen,除非你真的建议我暂时写出文件。

我的问题更大:我如何链接?如何从我已经在内存中的库中获取函数?为什么有些人向我推荐LibJIT

0 投票
1 回答
435 浏览

c - #include 与 GLSL/C 的自定义 IO?

我有两个问题,两个非常重要的问题:

  1. 是否有 C 预处理器能够采用任何自定义函数来定位由 调用的文件#include?因为,比如说,我将我的代码存储在一个 ZIP 文件或其他东西中,并且依靠 PhysFS 来访问它们而不是解压缩它们。是否有可以使用的开源 C 预处理器,而不是仅限于普通的 fopen?
  2. 是否可以在 GLSL 代码上使用自定义或标准 C 预处理器?我知道 GLSL 已经有一个预处理器,但是它缺少这个#include功能,我想纠正它。
  3. 是否可以将上述两者结合起来,制作一个程序或视频游戏,其中 GLSL 源代码存储在 ZIP 或 PK3 文件中(因此可以使用 PhysFS 或任何自定义 IO 东西访问),并且自定义/修改过的 C 预处理器是用于处理#include 并获取包含的源?

我问这个是因为我不想为 GLSL 编写自己的 C 预处理器,除非绝对必要,并且更愿意利用现有的预处理器来实现带有自定义 IO 的#include。

几乎我需要 C 预处理器东西的唯一原因是因为我想要#include,并且我想要它与我的自定义 IO 东西。

我想实现的预处理器功能示例:

  1. #version 450使用、 或#version 310 es、 以及预先处理整个已预处理的源代码#extension GL_ARB_separate_shader_objects : enable
    1. 包括运行时常量。有人说制服可能更适合这个目的,但预定义的模棱两可的常量也可能没问题。
    2. 功能的可重用性。

预期用途的一个示例:

颜色渐变.glsl

渐变片段

这显然是一个微不足道的例子,但主要目的是增加代码的可重用性,并减少非预处理着色器必须包含的不必要代码量。

我的最终意图是将GlSlangSPIR-V Cross集成以将Vulkan 兼容的 GLSL (使用自定义 C 预处理器扩展)编译到 SPIR-V,如果使用的后端不是 Vulkan ,则可以选择返回到 GLSL (或 HLSL) 。由于我不知道如何在反编译回 GLSL 之前将多个 SPIR-V 二进制文件拼接在一起,我认为每个着色器模块只有一个二进制文件很重要,因此有必要#include使用多个二进制文件来代替。

0 投票
1 回答
159 浏览

c++ - PhysFS_init() 返回非零错误:“无错误”

我在我的代码中遇到了一个相当奇怪的崩溃,我不确定是什么原因造成的。我试图在我的 c++ 代码中使用 PhysFS。下面的代码是类的一部分,Visual Studio 2017 告诉我崩溃出现在 中PHYSFS_mount(),随后出现在 中,据EnterCriticalSection()我了解,这与互斥锁有关。现在根据我的理解,这应该是正确的(请注意,主要调用initArchives()首先)

崩溃显然出现在这里

我在这里做错了吗?这是图书馆的问题还是我的操作系统的问题?我错过了 PhysFS 的构建步骤中的某些内容吗?

编辑:我注意到我读错了 PHYSFS_init() 的返回值,但是现在我更加困惑,因为PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode())返回“没有错误”,这是怎么回事?

0 投票
1 回答
242 浏览

c++ - 使用 physfs 从 zip 内部使用 Lua “require”

使用 physfs 时,通过使用 luaL_dostring 并在我自己中读取文件,加载和运行 lua 脚本很容易,但是当涉及到使用“require”时,它显然有麻烦。

有没有人处理过这个问题?我需要....重写部分lua吗?我真的不想那样做!

谢谢。

更新,这就是我让它工作的方式

然后在创建lua状态之后......

0 投票
0 回答
133 浏览

c - 如何将 PhysFS 与 CMAKE 链接?

我正在尝试在 C 中的游戏中使用 PhysFS。我正在使用 CMake 生成 Makefile。CMake 表示很好地找到了包含文件夹和库,但在构建过程中出现错误:未定义对“PHYSFS_init”的引用。

这是我的 CMakeLists.txt 文件:

CMakeCache.txt:

我在/usr/local/include/physfs.h有标题 physfs.h