好的,我正在为 Iphone 用 OpenGL 绘制图表。一切都很好,直到我使用那个 Texture2D 类来绘制 X 轴标签和 Y 轴标签。绘制标签的功能是在每一帧执行,我认为这很耗时。为了解决动画变慢,我有两个想法,但我仍然找不到如何实现它们: 1. 绘制标签 1 次,但下一次只是重用它们,重用矩阵或纹理,如果有任何可能性(对不起,我是新手,我可能会写一些不够充分的东西);2. 清理缓冲区时 (glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) 只清理屏幕的一部分,而不是整个渲染场景,我也很高兴知道是否有可能不清理整个屏幕而是清理绘制的对象(例如在柱形图中,仅清除列,不是背景,也不是标签或传说)。非常感谢您的帮助。
问问题
586 次
2 回答
2
glLoadIdentity(); // Added line
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
NumberFormatter *lFormater = [[NumberFormatter alloc] init];
int i = 0;
for (NSNumber *lNumber in mColXLabelCoord) {
NSNumber *lUnformated = [NSNumber numberWithInteger:[[NSString stringWithString:[mColYLabelsArray objectAtIndex:i]] integerValue]];
NSString *lFormated = [NSString stringWithString:[lFormater stringFromNumber:lUnformated withMask:[[mGraphArray objectAtIndex:0] mGraphMask]]];
Texture2D* lWord= [[Texture2D alloc] initWithString:lFormated dimensions:CGSizeMake(40, 15) alignment:UITextAlignmentLeft fontName:@"Helvetica" fontSize:13];
glColor4f(RedFromRGB(0xFFFFFF), GreenFromRGB(0xFFFFFF), BlueFromRGB(0xFFFFFF), 1.0);
[lWord drawInRect:CGRectMake([lNumber floatValue]+2, 470,40,15) rotation:-90];
[lWord release];
i++;
}
[lFormater release];
i = [mColYCoord count]-1;
for (NSNumber *lNumber in mColYCoord) {
Texture2D* lWord= [[Texture2D alloc] initWithString:[NSString stringWithFormat:((GraphValue*)[mGraphValuesArray objectAtIndex:i]).mGraphValueXLabel,[lNumber floatValue]]
dimensions:CGSizeMake(40, 15)
alignment:UITextAlignmentCenter
fontName:@"Helvetica" fontSize:12];
if ([mColYCoord count] < kOptimalLabelNumber) {
glColor4f(RedFromRGB(0xFFFFFF), GreenFromRGB(0xFFFFFF), BlueFromRGB(0xFFFFFF), 1.0);
[lWord drawInRect:CGRectMake(10, [lNumber floatValue]+15, 40, 15) rotation:-90];
}else {
glColor4f(RedFromRGB(0xFFFFFF), GreenFromRGB(0xFFFFFF), BlueFromRGB(0xFFFFFF), 1.0);
[lWord drawInRect:CGRectMake(2, [lNumber floatValue]+5, 40, 15) rotation:-30];
}
[lWord release];
i--;
}
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
于 2010-10-29T13:40:29.817 回答
0
如果您每次都清除完整的渲染缓冲区,事情会变得更简单,也更顺利。只需将轴预渲染为单个纹理并在每次传递时渲染纹理。
于 2010-10-29T13:07:00.333 回答