编写库时,最重要的规则和最佳实践之一是将库的所有符号放入特定于库的命名空间.由于namespace关键字,C++使这很容易.在C中,通常的方法是在标识符前面加上一些特定于库的前缀.
C标准的规则放在那些一些限制(安全编译):AC编译器可以看只是一个标识符的前8个字符,所以foobar2k_eggs并foobar2k_spam可能被解释为有效相同标识符-但是每一个现代的编译器允许任意长标识符所以在我们这个时代(21世纪),我们不应该为此烦恼.
但是如果你面对一些你无法改变符号名称/标识符的库呢?也许你只有一个静态二进制文件和标题或者不想要,或者不允许自己调整和重新编译.
我花了18个月的时间来掌握函数式编程,从学习OCaml开始,现在已经有几个星期的Haskell了.现在我想采取下一步并实现一些实际的应用程序:一个简单的实时地形编辑器.我写了很多实时地形渲染引擎,所以这是一个熟悉的主题.使用的递归算法和数据结构似乎非常适合功能实现.
由于这是一个实时应用程序,我自然而然地寻找我能得到的最佳性能.现在,与OCaml或F#相比,OCaml的一些(恕我直言,非常烦人)支持者反对Haskell的频率很慢.但根据计算机语言基准测试游戏 Haskell经常击败OCaml,如果只是相当小的分数 - 仍然存在问题,这个基准测试只需要非常具体的样本.
正确的做法当然是用两种语言实现程序并进行比较,但我根本不想做双重工作.
但也许其他人在OCaml和Haskell中做了类似的应用程序并提供了一些数据?
我目前正在构建一个网页,其中一些元素放置在靠近顶边的固定位置.所以每当我导航到锚点时,那些就会被放置在那些固定元素下面.我想知道是否有一些样式或其他方法,当导航到锚点时,会发生一些额外的偏移/边距?
示例源代码
<html>
<body>
<div style="position:fixed; top:0px; height:100px; background:white;">
This covers the top 100px of the screen.
</div>
<div style="position:absolute; top:0px;">
<div>
<a name="foo" id="foo"><h2>Foo</h2></a>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea
rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum
dolor sit amet. Lorem ipsum dolor sit …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一些用Haskell编写的Web应用程序.所有Haskell库都是静态链接的; 虽然这会"膨胀"可执行文件,但它不是一个问题,因为它将是服务器上运行的唯一Haskell程序.
但是,我也想摆脱依赖libgmp.so,即我想将multiprecision库静态链接到程序中,但保持所有其他系统库(如pthread,libc和libm)动态链接.
哪个链接器切换到ghc做那个技巧?
是否可以禁用标准库的默认链接,默认情况下将其引入每个Haskell程序?像GCC这样的东西相当于-nostdlib?
我想使用GL_POINT_SPRITE_ARB + VBO进行粒子系统渲染.我已经用point_sprites完成了所有准备工作,但坚持使用VBO.似乎glEnableClientState,不起作用.我读到它在现代openGL中已被弃用.那么,我应该用什么呢?
假设一个API,其中每个函数都返回一个错误代码,在没有错误的情况下为零,对于错误值则为零.
让
int foo(...);
int bar(...);
Run Code Online (Sandbox Code Playgroud)
是这个API中的函数.让一个代码片段在其中foo并且bar必须按顺序调用,并且应始终调用foo和bar ,而不管先前的错误,但是要传播第一个返回的非零错误代码,即
int foobar(...)
{
int rc = 0, rc_;
/* ... */
rc_ = foo(...); rc = rc ? rc : rc_;
rc_ = bar(...); rc = rc ? rc : rc_;
return rc;
}
Run Code Online (Sandbox Code Playgroud)
编写rc,rc_多路复用是累人的并且容易出错(无论是否使用三元运算符,if/else或其他东西).
让传播辅助函数出错
static inline
int rc_propagate(int r, int p){ return p ? p : r; }
Run Code Online (Sandbox Code Playgroud)
这可以foobar像这样使用
int foobar(...)
{
int rc = 0;
/* ... */
rc …Run Code Online (Sandbox Code Playgroud) 我是否可以在OpenGL 2.0中使用纹理(图像)准备模板,以便图像的某些部分是透明的,因此它将按原样传输
到模板缓冲区,然后使用此模板缓冲区进行进一步绘制.
@datenwolf非常感谢您的回复,但没有成功:(这是我的代码
- (void)render
{
[EAGLContext setCurrentContext:context];
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
glUseProgram(program);
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
glViewport(0, 0, backingWidth, backingHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// Set the stencil clear value
glClearStencil ( 0x1 );
// Set the depth clear value
glClearDepthf( 0.75f );
////////
////
GLfloat threshold = 0.5f;//half transparency
/* the order in which orthogonal OpenGL state is set doesn't matter */
glEnable(GL_STENCIL_TEST);
glEnable(GL_ALPHA_TEST);
/* don't write to color or depth buffer */
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, …Run Code Online (Sandbox Code Playgroud) 我在opengl ES2.0中开发了一个android应用程序.在这个应用程序中,我曾经通过GL surfaceView中的触摸事件绘制多个线条和圆圈.
由于opengl依赖于GPU,目前它在Google Nexus 7(ULP GeForce)中运行良好.
在三星Galaxy Note 2(MALI 400MP)中,我试图绘制多条线,但它清除了前一条线,并将当前线绘制为新线.
在Sony Xperia Neo V(Adreno 205)中,我试图画一条新线,它会使表面崩溃,如下图所示.
是否可以使其在所有设备上运行,或者我是否需要为单个GPU编写代码?
//in OnCreate method of my activity, i set the glsurfaceview and renderer
final ActivityManager activityManager =
( ActivityManager ) getSystemService( Context.ACTIVITY_SERVICE );
final ConfigurationInfo configurationInfo =
activityManager.getDeviceConfigurationInfo( );
final boolean supportsEs2 = ( configurationInfo.reqGlEsVersion >= 0x20000
|| Build.FINGERPRINT.startsWith( "generic" ) );
if( supportsEs2 ) {
Log.i( "JO", "configurationInfo.reqGlEsVersion:"
+ configurationInfo.reqGlEsVersion + "supportsEs2:"
+ supportsEs2 );
// Request an OpenGL ES 2.0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在光栅化3D点的过程中进行简单的透视投影.这是所有的矩阵和其他信息.所有矩阵都是行专业.坐标系是Right Handed.
相机位于[0,0,-1],点位于[0,0,0](矩阵运算时w = 1)
模型视图矩阵(凸轮矩阵的逆,即tx = 0; ty = 0; tz = 1):
[1 0 0 tx]
[0 1 0 ty]
[0 0 1 tz]
[0 0 0 1 ]
Run Code Online (Sandbox Code Playgroud)
透视矩阵:
[f/aspect,0,0,0]
0,f,0,0
0,0,-(near+far)/(near-far),2*far*near/(near-far)
0,0,1,0]
Run Code Online (Sandbox Code Playgroud)
aspect等于1,因为视口是方形的.远= 100且近= 0.1 f = 1/tan(fovDegress*M_PI/360);
结果矩阵是:
1.94445, 0, 0, 0
0, 1.944445, 0, 0
0, 0, 1.020202, -2.020202
0, 0, 1, 0
Run Code Online (Sandbox Code Playgroud)
现在我将模型视图矩阵然后投影矩阵应用于点向量,然后我得到一个新点Pv = {x,y,z,w}然后我得到归一化的坐标x'= x/w; y'= y/w; 和z'= z/w; 只要该点在平截头体中,x'和y'总是位于[-1,1]之间.但z'的情况并非如此.随着接近相机的点,z'值呈指数增长.当点位于[0,0,0]时,z'的值等于-1.
现在,我需要剪切一些行,所以我需要z'值介于[1,-1]之间.我想知道我的手术有什么问题.谢谢.
假设我从 threading.Thread 派生:
from threading import Thread
class Worker(Thread):
def start(self):
self.running = True
Thread.start(self)
def terminate(self):
self.running = False
self.join()
def run(self):
import time
while self.running:
print "running"
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
任何具有启动线程的此类实例都必须主动终止其线程,然后才能进行垃圾回收(线程本身拥有引用)。所以这是一个问题,因为它完全违背了垃圾收集的目的。在这种情况下,有一些对象封装了一个线程,并且随着对象的最后一个实例超出范围,析构函数被调用以进行线程终止和清理。因此是一个析构函数
def __del__(self):
self.terminate()
Run Code Online (Sandbox Code Playgroud)
不会做的伎俩。
我认为很好地封装线程的唯一方法是使用低级thread内置模块和weakref弱引用。或者我可能遗漏了一些基本的东西。那么有没有比在weakref意大利面条式代码中纠缠不清更好的方法呢?
c ×2
haskell ×2
opengl ×2
3d ×1
android ×1
benchmarking ×1
c++ ×1
collision ×1
css ×1
destructor ×1
directx ×1
gpu ×1
html ×1
libraries ×1
linker ×1
ocaml ×1
optimization ×1
perspective ×1
projection ×1
python ×1
static ×1
symbols ×1
textures ×1
vbo ×1