这一直困扰着我.gcc/g ++如何编译自己?我猜测每个修订版都使用以前构建的修订版进行编译.这是真的?如果是的话,是否意味着最古老的g ++/gcc版本是用汇编语言编写的?
自从我开始编程以来,我已经在每个地方阅读,以避免不惜一切代价浪费分支机构.
这很好,虽然没有一篇文章解释了为什么我应该这样做.CPU解码分支指令并决定跳转时到底发生了什么?什么是"东西"使它比其他指令(如添加)慢?
language-agnostic architecture compiler-construction cpu optimization
我想知道GL_MAX_TEXTURE_SIZE变量是否返回一个轴的纹理像素尺寸或两者都加起来(x,y).
例如,在我的电脑上我得到了8192.这是否意味着我可以加载8192*8192*4(256mb)或4096*4096*4(64mb)的纹理?如果是这样,为什么当我的显卡有1GB的视频内存时会发生这种情况?
让我们说我有以下数组:
float QuadVertices[4 * 2];
float QuadNormals[4 * 2];
Run Code Online (Sandbox Code Playgroud)
我用这种方式填写:
//Fill vertices for a 2d quad
Renderer->FillVertices(QuadVertices,GL_QUADS,x,y,width,height);
Run Code Online (Sandbox Code Playgroud)
现在在这一点上一切都很好我可以渲染四边形,纹理,拉伸它和所有这些.
但现在我想计算四边形的法线:
for (int i = 0; i < 8;i++)
{
QuadNormals[i] = ??
}
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚我应该如何计算一个简单的2d顶点数组的法线,该数组包含GL_QUADS的4vertices或GL_TRIANGLES的4vertices ....
我有以下变量:
这是我到目前为止的代码.
void Zoom(int pointOfInterestX,int pointOfInterstY,int screenWidth,
int screenHeight,int zoomLevel)
{
glScalef(1,1,1);
glTranslatef( (pointOfInterestX/2) - (screenWidth/2), (pointOfInterestY/2) - (screenHeight/2),0);
glScalef(zoomLevel,zoomLevel,1);
}
Run Code Online (Sandbox Code Playgroud)
我想放大/缩小,但保持在屏幕中间的兴趣点.但到目前为止,我的所有尝试都失败了.
我有一些值是多维数组的偏移量,看起来像这样:
static const int TILE_SIZE = 32;
int Offset2D = (y * TILE_SIZE) + (x * TILE_SIZE);
int Offset3D = (y * TILE_SIZE) + (x * TILE_SIZE) + (z * TILE_SIZE);
Run Code Online (Sandbox Code Playgroud)
现在我想要做的是将偏移量转换为x,y,z对,如下所示:
void ConvertBack(int offset,int size,int& x,int& y,int& z)
{
//What's wrong with this code ?
x = offset / size;
y = offset % size;
z = ??; //How to get Z?
}
Run Code Online (Sandbox Code Playgroud)
要么
//Get back offsets from any dimension ?
void ConvertBackComplex(unsigned int offset,int size,int* vector,int len)
{ …Run Code Online (Sandbox Code Playgroud) 我已经为我的渲染包装器创建了一个简单的linux 32位共享库(.so),但是当我发现我只能通过32位应用程序使用它们时,我已经碰壁了.............. ......
这是我的代码的样子:
RendIFace.h:
//Basic renderer interface
struct Renderer
{
int type;
...other things
};
Run Code Online (Sandbox Code Playgroud)
GLRend.c:
#include "RendIFace.h"
struct Renderer* GLRendererCreate(int width,int height,int bytesPerPixel)
{
struct Renderer* rend = (struct Renderer*)malloc(sizeof(Renderer));
rend->type = GLR;
..other things
return rend;
}
Run Code Online (Sandbox Code Playgroud)
SDLRend.c:
#include "RendIFace.h"
struct Renderer* SDLRendererCreate(int width,int height,int bytesPerPixel)
{
struct Renderer* rend = (struct Renderer*)malloc(sizeof(Renderer));
rend->type = SDLR;
..other things
return rend;
}
Run Code Online (Sandbox Code Playgroud)
我编译为共享32位库(.so)并通过主应用程序加载它们...
但现在有一个大问题.我的库都是32位并返回32位指针,这意味着我不能通过64位应用程序使用它们而无需重建所有的库代码库(!!!).
所以我想问更有经验的人:我该如何处理这个问题?是否可以只为一个架构使用一个共享库?
我在一个文档中读到你可以用逻辑替换mod操作,如下所示:
代替:
int Limit = Value % Range;
Run Code Online (Sandbox Code Playgroud)
你做:
int Limit = Value & (Range-1);
Run Code Online (Sandbox Code Playgroud)
但是编译器仍然生成mod指令,我的问题基本上是:如果编译器工作相同,为什么编译器不使用最有效的方法呢?