几年前,我用OpenGL2.1编写了许多使用基本功能(主要是立即模式)而不关心整个着色器方法的演示.
现在我再次需要OpenGL用于个人项目,从我正在阅读的这种API的整个方法发生变化,因为现在几乎所有内容都是由GPU通过顶点/像素着色器直接创建的.
我想知道实际的最新技术(我的意思是开发效率和结果)与我使用的OpenGL相比有哪些主要差异.
是否存在任何关于谁来自旧方法的教程?我是否应该放弃手工应用变换,绘图等的旧想法glBegin..glEnd?
由于我正在使用Java,我想使用一个好的库,你有什么建议吗?我发现LWJGL似乎也很好,如果一切都已经管理好了,我想知道是否值得使用它,或者只是根据需要坚持一些更重要的写作组件(比如数学相关对象).
我的drawString()方法中有一个paintComponent方法.有没有办法让drawString() 粗体绘制文字?另外,有没有办法让文字更大?我想避免使用JLabels,除非绝对必要.
我偶然发现了一个我无法理解的有趣问题.
背景是:
-Os现在我意识到,在启用优化的情况下进行编译时,某些代码存在问题.
代码是,逐字:
static int foo(int tx, int sx, int w)
{
int vs = 60;
if (sx < vs*2 && tx > w - vs*2)
return (sx + w - tx);
else if (sx > w - vs*2 && tx < vs*2)
return -(w - sx + tx);
else
return sx - tx;
}
Run Code Online (Sandbox Code Playgroud)
现在,通过使用LLDB,我逐步执行代码来追踪一个奇怪的错误,这让我意识到if的第一个分支是用输入的
sx = 648
tx = 649
w = 768
vs = 60
Run Code Online (Sandbox Code Playgroud)
(这些值直接来自XCode中的locals表,我无法查询lldb,vs因为我猜它会得到优化.) …
在C++ 11函数中使用一些本地lambda对象时,我很想将它们声明为const static auto lambda = ...让编译器知道只std::function需要一个对象(并且可能优化调用和/或内联它)但我意识到捕获在这种情况下通过引用的本地值导致奇怪的行为.
请考虑以下代码:
void process(const Data& data, const std::function<void(DataElement&>& lambda) {
...
}
void SomeClass::doSomething()
{
int foo = 0;
const static auto lambda = [&foo] () { .... ++foo; .... }
process(data, lambda);
}
Run Code Online (Sandbox Code Playgroud)
这不适用于多次调用,doSomething()但机制尚不清楚.
foo在第一次调用时绑定,然后绑定到堆栈地址,该地址在连续调用时变为无效?static在这种情况下,我被迫如此堕落吗?标准中指定了这种行为在哪里?考虑到它是一个static变量在哪里构建?懒惰第一次调用doSomething()(以便第一次调用工作)或在程序启动时?
我在OCaml中遇到了以下仿函数问题.我粘贴一些代码只是为了让你理解.基本上
我将这两个模块定义为pctl.ml:
module type ProbPA = sig
include Hashtbl.HashedType
val next: t -> (t * float) list
val print: t -> float -> unit
end
module type M = sig
type s
val set_error: float -> unit
val check: s -> formula -> bool
val check_path: s -> path_formula -> float
val check_suite: s -> suite -> unit
end
Run Code Online (Sandbox Code Playgroud)
以及以下仿函数:
module Make(P: ProbPA): (M with type s = P.t) = struct
type s = P.t
(* implementation *) …Run Code Online (Sandbox Code Playgroud) 我正在开发OCaml中的一些算法,这些算法需要一些部分是"可插拔的",因此部分计算留给特定的计算器.
举个例子假设我有一个像这样的签名:
module type Algorithm = sig
val feed : float -> unit
val nth : int -> (float -> float)
end
Run Code Online (Sandbox Code Playgroud)
而两种不同的实现,这将是Alg1和Alg2.该Algorithm模块应该代表这两个实现的各种实现的接口.
现在我需要另一个组件,让我们称它为Executor将使用Alg1或Alg2通过其接口的模块.
阅读仿函数似乎我需要一个仿函数来获取Algorithm并生成一个ConcreteExecutor具有我需要的算法的特定实现.所以这Executor是一种在其中一个组件上进行参数化的模块.
我对吗?这是获得我需要的最佳方式吗?我想这些想法是因为我来自Java/C++背景所以我习惯使用接口和抽象类,我需要以正确的方式进入这个functor/module抽象问题.
获取我想要的东西的正确语法是什么?
提前致谢
在我的项目中,我使用了多个枚举类,我需要根据需要在何处使用它们轻松地在它们之间进行转换。它们基本上描述相同的东西,但命名不同,以使代码更易于使用。以下是枚举类:
enum class tetroType {
None, I, O, T, J, L, S, Z
};
enum class gridBlock {
Empty, Blue, Green, Orange, Purple, Red, Teal, Yellow
};
Run Code Online (Sandbox Code Playgroud)
tetroType 中的每个值都对应于 gridBlock 中的一个值(fe tetroType::I = gridBlock::Teal),但第一个包含有关 tetronimo 形状的信息(在 tetronimo 类中),第二个包含有关块颜色的信息(在网格类)。我知道我可以只使用一个枚举,但这样你就不会丢失任何信息。如果可能的话,我还需要将其转换为字符串。这就是我想使用它的方式:
gridBlock grid = (gridBlock)tetroType::I;
string texture = (string)grid;
Run Code Online (Sandbox Code Playgroud)
现在我设置它的方式是这样的。每当我需要将一个枚举转换为另一个枚举或字符串时,我都会在其他方法的中间使用此开关:
switch (type) {
case tetroType::I:
block = gridBlock::Teal;
break;
case tetroType::O:
block = gridBlock::Yellow;
break;
case tetroType::T:
block = gridBlock::Purple;
break;
case tetroType::J:
block = gridBlock::Blue;
break;
case tetroType::L:
block = gridBlock::Orange;
break; …Run Code Online (Sandbox Code Playgroud) 我需要将stdout转发到不同的文件,以分离生成的一些打印和恢复到正常的标准输出.
我freopen以这种方式切换到文件:
char name[80];
memset(name, 0, 80);
strcpy(name, "./scripts/asm/");
strcat(name, m_func->m_name->m_value);
strcat(name, ".shasm");
freopen(name, "w", stdout);
Run Code Online (Sandbox Code Playgroud)
它确实有效,但在过程结束时(请注意,stdout以前一种方式重定向多次)我无法将其恢复为原始标准输出.我尝试了以下方法:
freopen("/dev/stdout", "w", stdout);
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用..只是为了我正在macosx上开发的信息.
我该怎么办?
提前致谢
也许我只是在一个非常简单的事情中失败,但我正在开发一个用OCaml编写的解释器,使用ocamllex和ocamlyacc等标准工具,我有这种情况:
定义各种指令的指令类型impossible.ml在解析器中是必需的,但impossible.ml它使用定义的解析器,iparser.mly因此它们都需要彼此正确编译.
有没有办法.cmi为我生成文件impossible.ml?通过这种方式,解析器将知道定义的类型,impossible.ml并且它将允许我编译impossible.cmo/.cmi并稍后编译impossible.cmo.然后我可以将所有这些链接在一起.
到目前为止,我的编译脚本是:
ocamlyacc iparser.mly
ocamlc -c iparser.mli
ocamllex ilexer.mll
ocamlc -c ilexer.ml
ocamlc -c iparser.ml
ocamlc -c impossible.ml
ocamlc -o imp.exe ilexer.cmo iparser.cmo impossible.cmo
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为ocamlc -c iparser.ml至少impossible.cmi需要知道类型.
有什么建议?提前致谢..
我想知道是否有一种优雅的方法来解决这个问题.假设有一个共同的标题,例如
// common.h
#ifndef COMMON_H
#define COMMON_H
#define ENABLE_SOMETHING
//#define ENABLE_SOMETHING_ELSE
#define ENABLE_WHATEVER
// many others
#endif
Run Code Online (Sandbox Code Playgroud)
现在包含这个文件,比方说100个其他头文件,各种#define用于启用或禁用某些仅限于1-2个文件的代码部分.
每次#define更改一个单元时,整个项目似乎都在重建(我正在研究Xcode 5.1),这是有道理的,因为它必须在代码周围完全替换,编译器无法知道它的使用位置.
我正在尝试找到一种更好的方法来管理它,以避免长时间的编译,因为这些定义确实已经多次改变.拆分每个定义在相应的文件/文件中可能是一个解决方案但我想要实际的方法将所有东西打包在一起.
所以我想知道是否有一种通常用于解决这个问题的模式,我正在考虑拥有
// common.h
class Enables
{
static const bool feature;
};
// common..cpp
bool Enables::feature = false;
Run Code Online (Sandbox Code Playgroud)
在编译优化二进制文件时,这在语义上是否等效?(例如,false内部的代码将完全消失).