- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
阅读《 OpenGL编程指南》第8版。
这实际上是一个硬件问题,实际上...
我介绍了有关OpenGL缓冲区的部分,据我了解它们是在图形卡内存中分配的内存空间,这是否正确?
如果是这样,我们如何使用glMapBuffer()获得一个指针来读取或修改该内存?据我所知,所有可能的内存地址(例如,在64位系统上有uint64_t num = 0x0; num = ~num;
个可能的地址)都用于系统内存,就像在RAM / CPU端内存中一样。
glMapBuffers()返回void *到某些内存。该指针如何指向图形卡内部的内存?特别是如果我有32位系统,超过4GB的RAM,然后是具有2GB / 4GB内存的图形卡。肯定没有足够的地址吗?
最佳答案
这实际上是一个硬件问题,实际上...
不,这不对。一会儿您会明白为什么。
我介绍了有关OpenGL缓冲区的部分,据我了解它们是在图形卡内存中分配的内存空间,这是否正确?
不完全的。您必须了解,虽然OpenGL使您真正接近实际的硬件,但与直接接触它仍然相距甚远。 glMapBuffer的作用是设置虚拟地址范围映射。在现代计算机系统上,该软件无法在物理地址上运行。而是使用虚拟地址空间(一定大小)。该虚拟地址空间看起来像软件的一个大连续内存块,而实际上它由物理页面的拼凑而成。这些页面可以以任何方式实现,它们可以是实际的物理内存,可以是I / O内存,甚至可以由其他程序在原位创建。该机制由CPU的内存管理单元与OS协作提供。
因此,对于每个进程,操作系统都会管理一个表,该表将进程虚拟地址空间的哪一部分映射到哪个页面处理程序。如果您正在运行Linux,请查看/proc/$PID/maps
。如果您有一个使用glMapBuffer的程序(在您的程序中,请勿调用系统)在地图缓冲区之前和之后读取/proc/self/maps
并查找差异。
据我所知,所有可能的内存地址(例如,在64位系统上,uint64_t num = 0x0; num =〜num;可能的地址)被用于系统内存,就像在RAM / CPU端内存中一样。
什么让你有那个想法?谁告诉过你(如果有人告诉过你)应该被打在脸上……很难。
您拥有的是虚拟地址空间。而且该地址空间与硬件方面的物理地址空间完全不同。实际上,虚拟地址空间的大小和物理地址空间的大小可能相差很大。例如,很长一段时间以来,周围都有32位CPU和32位操作系统。但那时已经希望拥有超过4 GiB的系统内存。因此,尽管CPU仅支持一个进程的地址空间的32位(指针的最大大小),但它可能已经向内存提供了36位的物理地址线,以支持约64 GiB的系统RAM;然后,手动切换这些额外的位将是OS的工作,因此尽管每个进程只能看到大约3 GiB的系统RAM(最大)进程,但这些进程可能会扩散。诸如此类的技术已被称为物理地址扩展(PAE)。
此外,并非进程中的所有地址空间都由RAM支持。就像我已经解释的那样,地址空间映射可以由任何东西支持。通常,内存分页处理程序还会实现交换,即,如果周围没有足够的可用RAM,它将使用HDD存储(实际上,在Linux上,所有用户空间的内存请求都由磁盘I / O缓存处理程序支持)。同样,由于地址空间映射是针对每个进程的,因此地址空间的某些部分被映射为内核内存,这对于所有进程(在物理上)都是相同的,并且也位于所有进程的相同位置。从用户空间不能访问该地址空间映射,但是一旦syscall转换为内核空间,就可以访问它;是的,操作系统内核也在内部使用虚拟内存。它只是无法从可用的支持中进行广泛选择(例如,如果网络驱动程序的内存由网络本身支持,则网络驱动程序将很难操作)。
无论如何:在现代的64位系统上,您具有64位的指针大小,并且在当前的硬件中,有48位的物理RAM地址线。这就留出了足够的空间,即16×48位(EDIT意味着2 ^ 16-1乘以48位地址空间),用于没有RAM的虚拟映射。而且因为有很多事情要做,所以每张PCI卡都有自己的地址空间,这有点像CPU的RAM(记住我前面提到的PAE,在过去32位的情况下,类似这样)必须与扩展卡进行通话)。
现在是OpenGL驱动程序。它只是提供了一个新的地址映射处理程序,该地址处理程序通常仅建立在PCI地址空间处理程序的基础上,该处理程序将映射进程的虚拟地址空间的一部分。并且该地址空间中发生的任何事情都将由该映射处理程序反映到最终由GPU访问的缓冲区中。但是,GPU本身可能正在直接访问CPU内存。 AMD计划的是,GPU和CPU将生活在同一个Die上,并访问同一个内存,因此不再存在物理区别。
关于opengl - glMapBuffer()和glBuffers,使用(void *)访问如何与硬件一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17800140/
作为作业的一部分,我正在尝试创建一个用户级线程库,如 pthreads。 为了处理线程之间的上下文切换,我使用了“swapcontext”函数。在使用它之前,我必须使用“makecontext”函数创
我是一名初级 C++ 程序员,我正在 Linux 机器上编程。 我遇到了这个错误: cannot convert ‘void* (Network::*)(void*)’ to ‘void* (*)(v
我知道,例如 void *(*myFuncName)(void*) 是一个函数指针,它接受并返回 void*。 这是一个有两个参数的指针吗?void 指针是该类型的另一个返回 void* 和 void
所以我被告知它们彼此几乎相同 void function1 (void(func)(int), int arg){ func(arg); } void function2 (void(*fun
我目前正在 GNU Radio 上开发一个 bloc,我想使用一个线程。该线程用于从 UDP 套接字获取数据,因此我可以在我的 GNU Radio 集团中使用它。 “一般工作”功能是执行所有信号和数据
我正在尝试在主函数中创建一个线程并通过我的线程调用另一个类的函数。 在 main.cpp 中: SocketHandler *callserver; pthread_t thread1; pthrea
我正在使用pthread 为我自己实现线程类。所以,我创建了 Thread 类如下: class Thread { public: Thread() { } virtual void*
我收到上述警告并理解它,但就是不知道如何解决它。我的代码在下面,但基本上我所做的是在结构中存储一个函数指针,并在我从 main.c 调用的另一个函数中初始化该结构。当我将代码与默认函数(即 free(
在我的 android 应用程序中,我在 doInBackground 中执行一些操作通过扩展 AsyncTask类(class)。 (我在这个类中执行任何 UI 都没用) 这是正确使用 AsyncT
我在 GNU 编译器集合中使用 C。所以我需要将函数指针传递给一个函数。现在有两种我想要处理的可接受的函数指针原型(prototype): void function(void); 和 void fu
我正在尝试使用“CameraManager”类创建一个新线程,但出现以下错误: cannot convert '*void(CameraManager:: * )(void*) to void*( *
我想构建一个可以隐藏线程创建的“IThread”类。子类实现“ThreadMain”方法并使其自动调用,如下所示: class IThread { public: void BeginThre
我不明白什么 void (**)(void *, const char *) /* ^^ why are there 2 asterisks here? 意思是,它是一个指向函数的指针,但我失败
我必须将“risposta”类型的参数“r”发送到函数 RispostaServer。编译器给我:invalid conversion void*(*)() to void*(*)(void*) 这是
所以我目前正在使用,或者至少正在尝试编写一个利用 this C pthread threadpool library. 的程序 值得注意的是 thpool.h 中的以下函数: int thpool_a
我正在尝试使用 void* 指针将不同的对象存储在一个全局表中。问题是如何取回 void* 对象。如果我有一个公共(public)基类,比如 Object ,我总是可以将 void* 指针存储为 Ob
我是一名 C 程序员(在 linux 上),但现在我有一个关于 C++ 的项目,并且有一个问题。 这里是示例代码 g_action.sa_sigaction = (void(*)(int,siginf
class Scoreget{ private: //some variables public: Scoreget(){ //
这个问题在这里已经有了答案: Is there a difference between foo(void) and foo() in C++ or C? (4 个答案) func() vs fun
我正在尝试使用 SDL 和 SDL_Mixer 为音频创建一个 C++ 应用程序,并且正在尝试遵循 this教程。但是,使用 SDL_Mixer 的 Mix_HookMusicFinished() 不
我是一名优秀的程序员,十分优秀!