问题标签 [video-memory]

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 投票
2 回答
280 浏览

iphone - UIImageView & 显存

我的 UiimageViews 有一个有趣的问题。我有一个应用程序(有 2 个房子的游戏),我在屏幕上加载了很多图像(我正在使用 UIIMageView)。在 ios4.3 上运行良好,但在 ios5 上发生了很多崩溃(我查看了 spc 程序上的可用内存差异约为 40-50mb!)。

我已经删除了所有可能的@2x 图像(用于视网膜设备),现在我的崩溃情况有所减少 - 但它们仍然存在。

我分析发现所有的崩溃都出现在viewWillAppearviewDidAppear之间。看起来像图像加载到视频内存时。

我在游戏中有 2 个房子,我可以先加载任何房子,然后我卸载房子(当然仪器显示我没有泄漏)。我尝试加载第二所房子,然后我崩溃了。看起来图像没有从显存中卸载。是否可以 ?

当我们删除@2x 图像时,我们可以加载更多房屋,但有时会在 viewWillAppear 和 viewDidAppear 之间再次崩溃。

谢谢,

0 投票
0 回答
512 浏览

iphone - CALayer OpenGL(-ES) 纹理内存使用情况

我有一个使用太多纹理内存的 iPhone 应用程序。我试图找出应用程序的哪个 CALayers 使用了太多的纹理内存。

不幸的是,我无法弄清楚特定 CALayer 使用了多少纹理内存。

有什么我可以使用的好技巧吗?

0 投票
3 回答
2904 浏览

opengl - 通过OpenGL编程访问整个显存

如何通过OpenGL编程访问显卡的显存,具体是获取显存的所有内容?

我尝试了以下两种方法,但都失败了。附上它们,希望您能指出我的程序或我对显存结构的理解中的错误。提前致谢!

我的基本想法是继续在显存中分配一个未初始化的区域,直到探索完显存的所有内容。

(1) 在 main 函数中,我创建了一个带有双缓冲区的窗口(参见下面的代码)。

然后,在“myDisplay”函数中,首先我调用 glReadPixels() 函数从后帧缓冲区中读出一个给定大小的像素矩形,将这些像素信息保存在一个数组“PixelData”中,最后将这些像素信息显示在通过调用 glDrawPixels() 函数来显示屏幕。执行此程序后,只出现一个黑色窗口。黑色是默认颜色。所以这意味着窗口不包含任何内容。然后我尝试从后面的帧缓冲区中读取其他区域,所有这些区域都没有包含任何内容。

从上面得出的结论是,后帧缓冲区中不包含任何内容。然而,这是不合理的,因为前缓冲区应该只包含当前屏幕内容/窗口,因此在屏幕底部打开和最小化的其他窗口应该在后帧缓冲区中有它们的内容,但后帧缓冲区是空的。那么这些窗口(由我在底部打开和最小化)存储在哪里?

我猜为我的程序分配的帧缓冲区(前后)只占整个视频内存的一小部分。因此,那些最小化的窗口内容应该存储在视频内存的其他位置。

过了一段时间,看了一篇OpenGL frameBuffer object (FBO)的介绍,里面有一句话:默认情况下,OpenGL使用framebuffer作为渲染目的地,完全由窗口系统创建和管理。此默认帧缓冲区称为窗口系统提供的帧缓冲区。这似乎验证了我的上述猜测。

(2) 然后我开始做FBO,希望FBO可以帮助我探索整个显存内容。

在下面的 main 函数中,我创建了一个 FBO 和 7 个渲染缓冲区对象(RBO),然后通过颜色附加点将这 7 个 RBO 附加到这个 FBO。

下面是我的显示回调函数的主要部分。它的作用是使用空格键控制读取哪个renderBuffer对象,然后将其内容显示在屏幕上。

最后的结果令人失望。所有 renderBuffer 对象的内容都是空的。我不知道这是什么原因,因为我认为所有这些 RBO 都从未初始化过,应该包含一些剩余的内容。

0 投票
1 回答
1628 浏览

c# - 直接视频缓冲区访问

当我使用显卡在屏幕上渲染东西时,如果我理解正确的话,只有三个选项可用。这些是

  1. DirectX(或 XNA)
  2. OpenGL
  3. Windows Driver Kit 和创建图形驱动程序的最小实现

我对 DirectX 或 OpenGL 的经验很少,但据我所知,您必须编写一个像素着色器程序来告诉渲染管道如何处理每个像素。这些着色器在 HLSL 中编程。但据我所知,DirectX 和 OpenGL 都无法返回一个指向内存的指针,我可以byte[]从我的 C# 程序中写入一些缓冲区并对其进行渲染。还是我在这里弄错了?

WDK 可能是一个更好的选择,因为它可以实现绝对最小的图形驱动程序实现,它只返回指向我可以写入 RGB 数据的内存的指针。因此,一方面我可以摆脱 DirectX 或 OpenGL 提供的所有抽象(我不需要),但另一方面,驱动程序开发的复杂性并不能完全节省时间。

此外,根据我在搜索更多信息时发现的信息,在过去的 DOS 中有一个地址 0B00 或类似的地址,允许开发人员直接在屏幕缓冲区上绘图。它当然已经消失了,我猜它不再可用,但出于兼容性原因,我已经阅读了这些内存空间仍然保留。有可能以某种方式利用它吗?

从 C# 访问视频内存以便我可以直接在屏幕上写入的最简单方法是什么?DirectX 或 OpenGL 是否提供这样的功能,使我能够直接在某处复制字节数组并对其进行渲染?

0 投票
1 回答
1421 浏览

assembly - 8086 装配视频内存差异

我正在开发一个 16 位 TASM 项目,其中很大一部分涉及非常广泛地访问视频内存。该项目处于 320x200x256 VGA 模式,我正在通过 Dosbox 运行它

例如,我有以下一组指令来在程序开始时填充/擦除屏幕:

并且函数 FillScreen 通常被赋予 0FFh,因此它应该绘制为白色。

自从我使用 TASM 以来,我一直在使用 Turbo Debugger 进行调试。并且发生了一些非常奇怪的事情——我可以在调试器中按 F7 逐行推进,或者我可以按 F9 跳到最后。所以我正在看 es 段的内容(在两种情况下都设置为 A000),两次,一次是按 F9,然后是按 F7(直到我不能再按住)

当我按 F9 时,一切都显示在屏幕上,但没有分配给视频内存。一点也不。在程序结束时,我检查 es 内是否有任何内容,并且全为零。

当我按住 F7 几分钟时,我可以看到值被放置在寄存器中,所以我知道它们在那里,但是当我在几百个像素后停止按住键并放开它时,值停止被分配。当我查看屏幕时,一半是一种颜色,一半是另一种。

我不知道这是否是我的调试器或 dosbox 或我的代码中的某些东西的问题,但我必须将这些值保存在某个地方,以便以后可以访问它们。基本上,我的程序到底是怎么回事?

编辑:我没有代表发布图像,所以如果我按住 F7 为 0x600 像素然后放开颜色 0x3B,http: //puu.sh/3iKhw.png就是它的样子。中间的那条线是误点击才出现的

0 投票
2 回答
5046 浏览

operating-system - 显存地址

显存地址(0xB8000),谁将显存映射到这个地址?
从地址复制数据并放到屏幕上的例程,它是处理器内置功能吗(这个驱动程序是处理器自带的)?

0 投票
1 回答
127 浏览

c - BIOS显存交互位置计算奇怪

我编写了一个非常简单的内核,它在 GRUB 的帮助下加载到 QEMU 中。我可能在指针计算中遇到问题,但无法真正弄清楚出了什么问题。

以下代码按预期工作,它打印给定的字符。

但是,当我将视频指针计算更改为此它不起作用时,屏幕上不会出现任何内容:

但是当我将 pos 变量设为 unsigned int 时,它工作不正确,但是当我将其设为 1 时,它作为第一个,但为什么它需要为 1?

我的 C 标志:CFLAGS = -std=c99 -pedantic -Wall -nostdlib -ffreestanding -g

0 投票
1 回答
207 浏览

assembly - 使用视频映射内存在 x86 程序集中在光标下写入

我正在编写一个尝试使用视频映射内存的简单应用程序(从地址 0B800 开始)。在大多数情况下,我可以直接写入该内存并且字符会立即出现在屏幕上,但我发现如果我尝试直接在光标下写入,我曾经尝试写入的内容都不会粘住。有没有解决的办法?如何直接在光标下书写?

目前使用这样的东西写入内存:

其中 BX 具有我要写的属性和字符。

0 投票
0 回答
48 浏览

language-agnostic - 将命令存储在视频内存中与通过 PCIe 访问它们

我目前正在阅读Fabian "ryg" Giesen的“图形管道之旅”系列博客的第 2 部分。

在这个特定的部分中,他谈到了一个有趣的观点。GPU 处理的命令既可以从驻留在 GPU 上的视频内存中读取,也可以通过 PCI Express 总线从 CPU 端读取。

我含蓄地理解了一些优点和缺点。但是,我对他们很模糊。我不能说我完全理解这些权衡。无论如何,我将尝试连贯地表达我的想法。

在显存中存储数据:

  • 肯定更快。
  • 但是,它有内存开销(不确定带宽)。

从 CPU 读取:

  • 在将数据存储在视频内存中是一种浪费的情况下可能会更好(也许是因为它永远不会再次使用?)。
  • 我认为在重用数据时将数据存储在视频内存中会很有用,因为它可以节省 PCIe 总线上的带宽。
  • 但是这种通信会比直接从显存中读取要慢。

我有一种感觉,两者之间有更多的复杂性和权衡取舍。另外,我不完全确定我上面所说的是真的。我希望有人:

  1. 说明一些重要的权衡和可能的其他复杂性,只是为了更好地理解。
  2. 验证我上面所说的是否正确!(我还不是很清楚。)
0 投票
1 回答
81 浏览

assembly - 为什么只写三个字在内存上?汇编语言


只有三个字符显示在屏幕或显存上?