当我使用glBufferData
时,我得到一个float(byte)缓冲区作为返回类型,我可以用来修改服务器端的数据。
但这样做有什么性能优势吗?
我有一个例子
方法1:
我创建了一个带顶点数据的浮点缓冲区,并直接将其传递给function myFunction(time,v) {
var p="price"+time;
var d="demo"+time;
var y = document.getElementById(p).value;
var z = v;
var ans=y*z;
document.getElementById(d).value = ans;
}
function my(time,ans) {
//alert('You have not Login !!');
var p="demo"+time;
var y = document.getElementById(p).value;
//var z=y+ans;
document.getElementById("total").innerHTML = ans;
}
。
方法2:
我使用<table>
<?php
$i=0;
while($i<=10)
{
?>
<tr>
<td> <input id="price<?php echo $i; ?>" type="text" readonly value="5"></td>
<td><input id="qty" type="number" value="0" onChange="myFunction(<?php echo $i; ?>,this.value)" ></td>
<td><input id="demo<?php echo $i; ?>" type="text" value="0" onChange="my(<?php echo $i; ?>,this.value)" >
</td>
</tr>
<?php
$i++;
}?>
<h4> Total :- <span id = "total"></span></h4>
</table>
分配空间,我没有传递数据......
我得到浮点缓冲区的引用...
我将浮点值写入...并取消映射缓冲区。
两种方法的优点和缺点是什么
我在两者上都这样做吗?
我认为第二种方法避免了重复的缓冲区。
答案 0 :(得分:2)
这有两个非常相关的方面:
使用传入的数据调用glBufferData()
包括以下内容:
glBufferData()
时,OpenGL实现会为数据分配内存。将此与使用缓冲区映射执行相同操作时发生的情况进行比较:
glBufferData()
时,OpenGL实现会为数据分配内存。glMapBuffer()
时,OpenGL实现会返回指向其内存的指针。如果比较两个序列,则在第一个序列中有额外的内存分配,这意味着它总共需要大约两倍的内存。 OpenGL实现必须在第一个中复制缓冲区数据,而在第二个中则不是这样。
实际上,事情会变得复杂一些。特别是在具有专用图形存储器(VRAM)的系统上,可能存在更多数据副本。但原则仍然是,你减少了额外的内存分配和复制。
要记住的另一个方面是,如果要在缓冲区已经使用之后修改缓冲区的内容,那么除了最初使用缓冲区之外还会发生什么。同样,glMapBuffer()
通常会减少额外数据复制的数量,但可能会以不希望的同步为代价。因此,为glBufferData()
或glBufferSubData()
所需的额外副本支付价格以避免同步点可能更有效。
如果您经常修改缓冲区数据这些更复杂的情况,您确实需要开始基准测试,并且您必须预期供应商之间存在差异。您还可以查看使用缓冲区映射的方案,但使用循环缓冲池而不是单个缓冲区,以减少/避免同步带来的性能损失。
除此之外,如果您在功率/散热考虑因素发挥作用的设备上工作,除了执行速度之外,您可能还需要测量功耗。因为最快的解决方案可能不一定是最节能的。