This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
component:gpu:zh [2023/12/17 10:39] hfsr [改变色深] |
component:gpu:zh [2023/12/27 02:03] (current) hfsr [资源配额与能耗] |
||
---|---|---|---|
Line 127: | Line 127: | ||
============== | ============== | ||
- | 显卡的内部有显存,你可以将他们以页的形式进行分配。你可以自定义页大小(宽与高,都需要大于0)。每次分配都会从显卡的显存中扣除宽度x高度的大小。高级别GPU的显存比低级别的多。页缓冲区的工作方式类似于隐藏不渲染的[[component:screen:zh|屏幕]],有其自己的宽度、高度和色深。GPU缓冲区支持的最大色深由GPU的等级决定。重启电脑将会释放所有的缓冲区。 | + | 显卡的内部有显存,你可以将他们以页的形式进行分配。你可以自定义页大小(宽与高都需要大于0)。每次分配都会从显卡的显存中扣除`宽度*高度`的大小。高级别GPU的显存比低级别的多。页缓冲区的工作方式类似于隐藏不渲染的[[component:screen:zh|屏幕]],有其自己的宽度、高度和色深。GPU缓冲区支持的最大色深由GPU的等级决定。重启电脑将会释放所有的缓冲区。 |
- | 每个页缓冲区都有序号,GPU会查找下一个可用序号。序号零(0)有特殊用途,它是为屏幕保留的。无论GPU是否绑定到屏幕,你都可以分配页,设定它们是否启用,以及对它们进行读写。连接与断开屏幕,甚至是绑定到新屏幕,都不会释放GPU的页;而当电脑关机或重启时,页会被释放。每个GPU都有其独立的显存和页。 | + | 每个缓冲区页都有序号,GPU会查找下一个可用序号。序号零(0)有特殊用途,它是为屏幕保留的。无论GPU是否绑定到屏幕,你都可以分配页,设定它们是否启用,以及对它们进行读写。连接与断开屏幕,甚至是绑定到新屏幕,都不会释放GPU的页;而当电脑关机或重启时,页会被释放。每个GPU都有其独立的显存和页。 |
资源配额与能耗 | 资源配额与能耗 | ||
----------- | ----------- | ||
- | 对显存的更新操作(set、copy和fill等)几乎没有消耗。这些操作不会耗能,也不会消耗额外的资源配额。每次直接组件调用(GPU方法即为直接调用)都只消耗很少的系统资源配额,但是GPU本身在显存更新操作中不会增加资源消耗。将显存传输到屏幕时会有一定的资源消耗,类似于屏幕更新时产生的资源消耗。传输脏的(修改过的)显存后备缓冲区需要一次性消耗一定的资源,消耗的量随源缓冲区的大小而增加。而后续从干净的后备缓冲区到屏幕的传输只需要消耗极少的资源。 | + | 对显存的更新操作(set、copy和fill等)几乎没有消耗。这些操作不会耗能,也不会额外消耗资源配额。每次直接组件调用(GPU方法即为直接调用)都只消耗很少的系统资源配额,但是GPU本身在显存更新操作中不会增加资源消耗。将显存传输到屏幕时会有一定的资源消耗,类似于屏幕更新时产生的资源消耗。传输脏的(修改过的)显存后备缓冲区需要一次性消耗一定的资源,消耗的量随源缓冲区的大小而增加。而后续从干净的后备缓冲区到屏幕的传输只需要消耗极少的资源。 |
- `getActiveBuffer(): number` | - `getActiveBuffer(): number` | ||
- | 返回当前选中缓冲区的编号。0被保留给屏幕,且就算没有屏幕也有可能会返回0。 | + | 返回当前选中缓冲区的编号。0被保留给屏幕,且就算没有屏幕也有可能会返回0。 |
+ | \\ | ||
- `setActiveBuffer(index: number): number` | - `setActiveBuffer(index: number): number` | ||
- | 将活动缓冲区设定为`index`。0被保留给屏幕,且就算没有屏幕也可以设定。若编号无效则返回`nil`(0就算在没有屏幕的情况下也有效)。 | + | 将活动缓冲区设定为`index`。0被保留给屏幕,且就算没有屏幕也可以设定。若编号无效则返回`nil`(0就算在没有屏幕的情况下也有效)。 |
+ | \\ | ||
- `buffers(): table` | - `buffers(): table` | ||
- | 返回包含当前所有页编号的数组(列表中不包含0,此编号保留给屏幕)。 | + | 返回包含当前所有页编号的数组(列表中不包含0,此编号保留给屏幕)。 |
+ | \\ | ||
- `allocateBuffer([width: number, height: number]): number` | - `allocateBuffer([width: number, height: number]): number` | ||
- | 分配一个大小为`width`x`height`的新页(默认大小为GPU的最大分辨率)。返回此缓冲区的编号,若剩余显存不足则报错。即使GPU未绑定到屏幕也可以分配缓冲区。编号0永久保留给屏幕,因此分配出的缓冲区的编号最小从1开始。 | + | 分配一个大小为`width`x`height`的新页(默认大小为GPU的最大分辨率)。返回此缓冲区的编号,若剩余显存不足则报错。即使GPU未绑定到屏幕也可以分配缓冲区。编号0永久保留给屏幕,因此所分配缓冲区的编号最小从1开始。 |
+ | \\ | ||
- `freeBuffer([index: number]): boolean` | - `freeBuffer([index: number]): boolean` | ||
- | 移除编号为`index`(默认为当前缓冲区编号)的缓冲区。若成功移除此缓冲区则返回`true`。如果你移除了当前选中的缓冲区,GPU会自动切换回编号0(为屏幕保留)。 | + | 移除编号为`index`(默认为当前缓冲区编号)的缓冲区。若成功移除此缓冲区则返回`true`。如果你移除了当前选中的缓冲区,GPU会自动切换回编号0(为屏幕保留)。 |
+ | \\ | ||
- `freeAllBuffers()` | - `freeAllBuffers()` | ||
- | 移除全部缓冲区,释放所有显存。在调用此函数后活动缓冲区编号一定为0。 | + | 移除全部缓冲区,释放所有显存。在调用此函数后活动缓冲区编号一定为0。 |
+ | \\ | ||
- `totalMemory(): number` | - `totalMemory(): number` | ||
- | 返回GPU的显存总量。此值不包括屏幕。 | + | 返回GPU的显存总量。此值不包括屏幕。 |
+ | \\ | ||
- `freeMemory(): number` | - `freeMemory(): number` | ||
- | 返回未分配给缓冲区的空闲显存总量。此值不包括屏幕。 | + | 返回未分配给缓冲区的空闲显存总量。此值不包括屏幕。 |
+ | \\ | ||
- `getBufferSize([index: number]): number, number` | - `getBufferSize([index: number]): number, number` | ||
- | 返回编号为`index`(默认为当前缓冲区编号)的缓冲区的大小。若编号为0则返回屏幕的分辨率。若编号无效则返回`nil`。 | + | 返回编号为`index`的缓冲区(默认为当前缓冲区)的大小。若编号为0则返回屏幕的分辨率。若编号无效则返回`nil`。 |
+ | \\ | ||
- `bitblt([dst: number, col: number, row: number, width: number, height: number, src: number, fromCol: number, fromRow: number])` | - `bitblt([dst: number, col: number, row: number, width: number, height: number, src: number, fromCol: number, fromRow: number])` | ||
将一个矩形区域从缓冲区复制到缓冲区,从屏幕复制到缓冲区或从缓冲区复制到屏幕。 | 将一个矩形区域从缓冲区复制到缓冲区,从屏幕复制到缓冲区或从缓冲区复制到屏幕。 | ||
Line 162: | Line 171: | ||
* src = 当前缓冲区 | * src = 当前缓冲区 | ||
* fromCol, fromRow = 1,1 | * fromCol, fromRow = 1,1 | ||
- | bitblt(位块传输)函数在反复调用时应当执行得很快。若缓冲区是脏的,那么与目标对象同步缓冲区的初始成本会更高。如果你需要大量进行更新,导致频繁进行位块传输,那么可以考虑分配数量多而尺寸小的缓冲区。如果你希望使用一个静态缓冲区(很少或不进行更新),那么分配大的缓冲区即可。 | + | bitblt(位块传输)在反复进行时应当执行得很快。若缓冲区是脏的,那么与目标对象同步缓冲区的初始成本会更高。如果你需要大量进行更新,导致频繁进行位块传输,那么可以考虑分配数量多而尺寸小的缓冲区。如果你希望使用一个静态缓冲区(很少或不进行更新),那么分配大的缓冲区即可。 |
操作成功后会返回`true`。 | 操作成功后会返回`true`。 | ||