Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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`。