例如,在WebGL中渲染浮点纹理的支持级别方面存在一些混淆.OES_texture_float扩展似乎并不强制要求它,因为可选支持FLOAT纹理作为FBO附件(不推荐使用),但看起来有些供应商继续实施它.因此,我的基本理解是渲染到浮点纹理实际上可以在非ES桌面环境中工作.我无法直接从浮点渲染目标中读取.
我的问题是,是否有一种方法可以使用WebGLContext :: readPixels()调用和Float32Array目标从浮点纹理中读取?提前致谢.
附件是一个成功读取字节纹理的脚本,但浮动纹理失败:
<html>
<head>
<script>
function run_test(use_float) {
// Create canvas and context
var canvas = document.createElement('canvas');
document.body.appendChild(canvas);
var gl = canvas.getContext("experimental-webgl");
// Decide on types to user for texture
var texType, bufferFmt;
if (use_float) {
texType = gl.FLOAT;
bufferFmt = Float32Array;
} else {
texType = gl.UNSIGNED_BYTE;
bufferFmt = Uint8Array;
}
// Query extension
var OES_texture_float = gl.getExtension('OES_texture_float');
if (!OES_texture_float) {
throw new Error("No support for OES_texture_float");
}
// …Run Code Online (Sandbox Code Playgroud) 请考虑以下javascript.我原本以为循环中的分配将允许使用集合来防止溢出堆.它在Firefox中正确地实现了这一点,但是在Chrome(在OSX上测试)中,片段在几次迭代后崩溃了打开的选项卡.
for (var i = 0; i < 1024; ++i) {
// Allocate a 16mb buffer
var buffer = new Float32Array(1024*1024*4);
// Try to explicitly mark it for free by either
delete buffer;
// or
buffer = null;
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
这个脚本本身并不是那么有用.但我正在尝试优化我的Javascript应用程序,以便它使用更少的内存.所以我想你的意见.这是Chrome中的错误吗?您是否知道在代码执行期间显式调用垃圾收集的任何变通方法(在FF和IE中它们似乎存在)?谢谢!
修改:Chrome Inspector上似乎存在一个名为"收集垃圾"的按钮.它是Inspector"时间轴"面板下方栏上的第7个按钮.这不是表示存在从Javascript调用GC的方法吗?毕竟,不是用Javascript编写的Inspector的一部分吗?
我创建了一个简单的 Dagre 示例,用于在单击图中的现有节点时动态添加节点。但是,重新渲染会在同一层内创建不同的相对顺序。无论如何,这个问题有解决办法吗?
小提琴可以在这里找到: http: //jsfiddle.net/gke2dann/
提前致谢。
// Create a new directed graph
var g = new dagreD3.Digraph();
/* populate graph... see fiddle */
var renderer = new dagreD3.Renderer();
var layout = dagre.layout();
var render = function() {
layout.run(g);
renderer.run(g, d3.select("svg g"));
};
render();
svg.onclick = function(evt) {
var nodeId = evt.target.__data__;
for (var i = 0; i <= Math.random() * 10; ++i) {
var newNodeId = nodeId + "_sub" + i;
g.addNode(newNodeId, { label: "Bla" });
g.addEdge(null, newNodeId, nodeId); …Run Code Online (Sandbox Code Playgroud) 我已经习惯了通过让编译器找出所涉及的魔法来以下列方式初始化std :: strings
std::string my_string = "hello";
Run Code Online (Sandbox Code Playgroud)
以下操作无效,因为两种类型之间没有明确的转换:
boost::optional<std::string> my_optional_string = "hello";
Run Code Online (Sandbox Code Playgroud)
但这确实有效:
boost::optional<std::string> my_optional_string = std::string("hello");
Run Code Online (Sandbox Code Playgroud)
现在,有没有办法菊花链式隐式调用单arg构造函数来允许第二种形式?我问的原因(我不想打扰你的细节)是有一大堆类可以填充可选成员.必须明确键入所有内容似乎是一种负担(我并不担心自己,但我正在开发一个开源API,并希望尽可能多地为我的用户提供安慰).任何建议表示赞赏.
编辑:对不起伙计我是新手,应该提供更多澄清代码示例.我有一些类(没有自己建模,只是在C++中实现它们),可选成员要填充,如下所示:
Class Class1 {
public:
Class1(const boost::optional<std::string>& arg_1, /*... ,*/ const boost::optional<std::string>& arg_n );
};
Run Code Online (Sandbox Code Playgroud)
我希望我的API用户能够指定的是:
Class1 my_class("hello","there",NULL,"stackoverflow");
/* ( Note: NULL is actually risky here, as some classes might also have members of type boost::optional<int> ) */
Run Code Online (Sandbox Code Playgroud)
并不是:
Class1 my_class(std::string("hello"),/*or*/boost::optional<std::string>("there"),boost::optional<std::string>(),std::string("stackoverflow"));
Run Code Online (Sandbox Code Playgroud)
再次感谢.