文号
t30075
阅读
13050
回复
13
收藏
6
高手来。Win编程怎样可以访问显存。
2010/10/28
IP:湖北
先解决我的疑惑,早期的显示器画面是怎样显示出来的?不要回答CRT工作原理。我想知道从前的保留内存里那部分显存的工作情况。那时有必要出现“显卡”吗?

再解决我的疑惑,显卡的概念是怎样从主板中独立出来的?即使目前有板载显卡一说,也仍然继承了“显卡”概念。

还解决我的疑惑,3D图形加速卡出现之前的显卡有啥特别之处?

最后解决我的疑惑,目前的显存有独立显卡自带显存,和主机内存里 抠出一部分做显存。二者可以通过Win编程访问吗?二者在CPU可寻址的内存地址空间里吗?
16年2个月前IP:未同步
263543
1楼
1&2.根据不知道谁谁谁说的计算鸡原理里面,本来就是输入控制运算储存输出,最开始的是貌似是纸带,后来貌似就渐渐发展出屏幕了,所以那个本来就是功能之一应该是没有显存这个概念的,后来是因为计算鸡模块化设计了,所以显示部分就自动脱离出来了........类似CPU一块,内存一块这样的.
3.没啥特别之处,就是负责显示功能,当然那个时候的低通做工和用料是相当YY的,之所以出现3D卡(当年还有2D卡+3D卡两个单独售卖的时代,参见Voodoo时代的显卡),是因为最初的3D运算是CPU负责的,越来越高的需求让CPU吃不消了,所以就出现了3D卡来分担图形这块的工作
4.不懂
引用
评论
16年2个月前IP:未同步
263553
2楼
使用驱动程序开发工具,如WinDriver,例程中就有操作显存的。
或者以前的directdraw
引用
评论
dctyu作者
16年2个月前IP:未同步
263559
3楼
以前玩过directdraw ,做了一个800X600全画面,帧率奇慢。
简直怀疑directdraw 的缓冲区概念如下
在内存缓冲区里做好了一帧画面,然后通过总线把整幅画面从内存“硬”拷贝到显存上。然后再输出。中间的拷贝多此一举。

我能否直接在显存里写内容,即时表现到屏幕。
引用
评论
dctyu作者
16年2个月前IP:未同步
263564
4楼
帧率奇慢的原因还有一个猜测:
既然有标准函数库就应该调用标准函数库。标准函数的实现是通过驱动程序直接与显卡“沟通”的。标准函数是调用显卡程序并在显卡上运行。

如果是自己逐点写显存反而慢。
引用
评论
16年2个月前IP:未同步
263579
5楼
使用WinIO可以访问物理内存,我没做过显卡方面的开发,但是直觉上认为应该可以

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
引用
评论
16年2个月前IP:未同步
263592
6楼
先查得显卡的PCI bus ID和Device ID,获得其BAR地址。BAR1即为frame buffer所在。然后通过设备驱动程序的方法映射到线性地址后即可访问。

顺便讲一句,DDraw和D3D都是直接绘图到显存,不存在先画到主存的问题。
引用
评论
16年2个月前IP:未同步
263606
7楼
但是有些老式游戏运用在新计算机结构上仍然会做这样的“蠢事”
比如将纹理先用CPU计算好后在送到显卡去这类的。
引用
评论
16年2个月前IP:未同步
263609
8楼
引用第7楼アストレア于2010-10-29 13:11发表的  :
但是有些老式游戏运用在新计算机结构上仍然会做这样的“蠢事”
比如将纹理先用CPU计算好后在送到显卡去这类的。


纹理肯定都是一开始从CPU端传过去的。
GPU使用纹理时直接从显存读。
引用
评论
16年2个月前IP:未同步
263627
9楼
很久以前显示系统应该是仅仅以字符传递信息的,现在做51单片机开发的话 在C里面用stdio.h的时候  仍然是串口字符输出
引用
评论
dctyu作者
16年2个月前IP:未同步
263654
10楼
引用第6楼小俊于2010-10-29 09:42发表的  :
先查得显卡的PCI bus ID和Device ID,获得其BAR地址。BAR1即为frame buffer所在。然后通过设备驱动程序的方法映射到线性地址后即可访问。

顺便讲一句,DDraw和D3D都是直接绘图到显存,不存在先画到主存的问题。


谢谢。这也就是说,独立显卡上的自带显存也是在CPU寻址空间里的。通过DDraw,Win内核先得到显存的实际地址,然后映射为虚拟地址。最后用户程序向指定虚拟地址里写内容便是直接写到了显存。
引用
评论
dctyu作者
16年2个月前IP:未同步
263658
11楼
再问,DDraw程序写显存以后就进入换页,便在屏幕上呈现出来了。
同样是写显存,有通过D3D直接改变显存里的纹理贴图的办法没?
引用
评论
16年2个月前IP:未同步
263664
12楼
引用第10楼dctyu于2010-10-29 21:28发表的  :

谢谢。这也就是说,独立显卡上的自带显存也是在CPU寻址空间里的。通过DDraw,Win内核先得到显存的实际地址,然后映射为虚拟地址。最后用户程序向指定虚拟地址里写内容便是直接写到了显存。


不是通过DDraw。肯定是显卡驱程做的。DX只是调用显卡驱程。。。
引用
评论
16年2个月前IP:未同步
263665
13楼
引用第11楼dctyu于2010-10-29 21:40发表的  :
再问,DDraw程序写显存以后就进入换页,便在屏幕上呈现出来了。
同样是写显存,有通过D3D直接改变显存里的纹理贴图的办法没?


按照常规途径(显卡驱动程序或DX、OpenGL等API),主机端无法直接修改显存上的东西(只能以纹理方式互相拷贝)。GPU可以直接访问显存,所以,可以由主机端发起执行一段shader代码来实现。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的