2011-08-04 4 views
1

나는 집에서 만든 렌더링 엔진을 포함하는 정적 라이브러리 Xcode 4 프로젝트를 가지고 있으며,이 엔진을 여러 애플 리케이션에서 재사용합니다. 이 엔진은 OpenGL ES 2.0을 사용하고 확장하여 쉐이더를 사용합니다. 셰이더가 점점 복잡해지면서 NSString을 소스 파일에 저장하지 않고 이제는 .vert 및 .frag 확장명을 가진 독립 실행 형 텍스트 파일로 저장합니다.정적 리브에 리소스를 포함시키는 현명한 해결책은 무엇입니까?

이것은 자신의 출처에있는 렌더링 엔진을 포함하는 응용 프로그램에서 잘 작동합니다. 셰이더는 응용 프로그램의 "Copy Bundle Resources"빌드 단계에 간단히 추가되고 런타임시 NSString에로드되어 컴파일되고 링크됩니다.

이 쉐이더를로드하는 렌더링 엔진이 정적 라이브러리 프로젝트에서; 자원을 복사 할 번들이 없습니다. 저는 현재 static lib 렌더링 엔진의 모든 클라이언트 프로젝트에 자체 "Copy Bundle Resources"빌드 단계에서 쉐이더의 복사본을 포함시켜야합니다. 이것은 거대한 고통이며, 처음부터 렌더링 엔진을 정적 인 lib로 만드는 편리함의 많은 부분을 무효로 만듭니다.

"정적 라이브러리의 리소스"라는보다 일반적인 문제의 특정 인스턴스라고 가정합니다. 내가 생각할 수있는 최선의 해결책은 셰이더 파일의 내용을 헤더 파일의 문자열로 복사하는 것이며, 렌더링 엔진의 소스에 포함됩니다. 일부 "Run Scripts"빌드 마술로 .frag에서 .h 로의 변환을 자동화 할 수도 있지만, 불행하게도 복잡해 보입니다.

내가 빠진 것이 있습니까?

답변

1

프레임 워크를 만들려고 할 수도 있지만 필요에 맞게 만들 수 있습니다. 이 페이지에 iOS 용 같은 프레임 워크를 만드는 방법에 대한 예제가있다 :

http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/

가이드가 실제로 his own iOS 3D engine project를 배포하는이 기술을 사용하여 쓴 사람.

편집 : 가이드의 최신 버전에 링크되어 있습니다.

+0

음, 흥미 롭습니다. 나는 프레임 워크가 iOS에서 불가능하지 않다는 인상을 받았다. 동적 라이브러리를 iOS의 정적 라이브러리로 대체하여 수동으로 "프레임 워크"구조를 만드는 것처럼 보입니다. 나는 이것을 시도해 볼 수 있습니다. –

+0

Nineveh GL 베타 프레임 워크를 다운로드하여 가이드 작성자가 어떻게 작동하는지 확인하십시오. 무료입니다. –

+0

오케이, 바이올린을 치고 나서 공식적으로이 작업이 가능하다고 말하면 꽤 좋습니다. 클라이언트 애플리케이션을 실행하는 동안 프레임 워크로 디버깅 할 수있는 능력이 없다는 것입니다. 프로젝트 참조와 정적 라이브러리로 할 수 있습니다. 내 엔진이 많이 개발 되었기 때문에 Xcode의 공유 프로젝트 중단 점에 익숙해졌습니다. 이것이 더 완성 된 프로젝트라면, 나는 분명히이 접근법을 취할 것입니다. 좋은 참조. –

2

나는 정적 인 라이브러리와 리소스가 잘 어울리지 않는다는 것을 느낀다. 가장 쉬운 방법은 이미 언급 한 것입니다. 쉐이더를 읽고 적절하게 이스케이프 처리하고 C 호환 코드로 랩핑하는 스크립트를 작성하십시오.

저는 전문가가 아니지만, 연결시 Mach-O 실행 파일의 일부 섹션에 셰이더 데이터를 추가 할 수 있습니까? 그러나 이것은 결국 위에서 언급 한 것과 동일한 해결책으로 귀결됩니다. 단점은 당신이 그 못생긴 부분을 남겨두고 있다는 것입니다.

일부 쉘 스크립트를 사용하여 문자열 상수를 사용하려고합니다. 내 경험에 비추어 볼 때 PHP는 이런 종류의 작업을하는 데 꽤 능숙합니다. 그리고 당연히 bash 스크립트도 있지만, 나는 그렇게 잘하지 않습니다.

+0

어쩌면 나는이 기회를 이용해 펄을 배울 것이다. 다른 답변에서 언급 한 iOS 프레임 워크 옵션은 꽤 멋지지만 내 프로젝트 공유 중단 점이 있어야합니다. –

3

후손을 위해서 내가 사용하기 시작한 솔루션을 공유하겠습니다. 높은 수준에서 문제의 리소스를 애플리케이션 바이너리로 컴파일하여 리소스를 번들로 복사 할 필요가 없습니다.

모든 파일 데이터를 이진 파일로 컴파일하는 일반적인 방법은 파일 내용을 헤더 파일의 정적 바이트 배열에 저장하는 것입니다. 이미 헤더 파일이 생성되어 정적 lib 타겟에 추가되었다고 가정하면 다음 bash 스크립트를 사용하여 파일을 읽고 그 내용을 C 구문의 16 진수 리터럴의 바이트 배열로 씁니다.나는 다음 컴파일 소스 및 복사 헤더 구축 단계 전에 구축 단계 을 "스크립트 실행"에서 스크립트를 실행

#!/bin/bash 
# Hexify.sh reads an input file, and hexdumps its contents to an output 
# file in C-compliant syntax. The final argument is the name of the array. 

infile=$1 
outfile=$2 
arrayName=$3 

fileSize=$(stat -f "%z" $infile) 
fileHexString=$(hexdump -ve '1/1 "0x%.2x, "' $infile) 

prefix=$arrayName 
suffix="Size" 
variableName=$arrayName$suffix 
nullTermination="0x00" 

echo "//" > $headerFile 
echo "// This file was automatically generated by a build script." >> $headerFile 
echo "// Do not modify; the contents of this file will be overwritten on each build." >> $headerFile 
echo "//" >> $headerFile 
echo "" >> $headerFile; 
echo "#ifndef some_arbitrary_include_guard" >> $headerFile 
echo "#define some_arbitrary_include_guard" >> $headerFile 
echo "" >> $headerFile 
echo "static const int $variableName = $((fileSize+1));" >> $outfile 
echo "static const char $arrayName[$variableName] = {" >> $outfile 
echo -e "\t$fileHexString$nullTermination" >> $outfile 
echo "};" >> $outfile 
echo "#endif" >> $headerFile 

따라서, 예를 들어, 나는 리소스 파일 example.txt이있는 경우 :

Hello this 
is a file 

내가 ./Hexify.sh example.txt myHeader.h exampleArray을 실행했다, 헤더는 다음과 같이 보일 것이다 :

// 
// This file was automatically generated by a build script. 
// Do not modify; the contents of this file will be overwritten on each build. 
// 

#ifndef some_arbitrary_include_guard 
#define some_arbitrary_include_guard 

static const int exampleArraySize = 21; 
static const char exampleArray[exampleArraySize] = { 
    0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0a, 
    0x69, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x00 
}; 
#endif 

지금, 나는 넣은 것 어떤 시점에서 메인 번들에서 말한 리소스, 대신 그 헤더 파일의 바이트 배열을 참조 할 수 있습니다. 내 버전의 스크립트는 데이터가 문자열 객체를 만드는 데 적합하도록 null로 끝나는 바이트를 추가합니다. 모든 경우에 적용되는 것은 아닙니다.

마지막 부록으로, bash 스크립트가 실제 bash 프로그래머를 괴롭히는 경우 사과드립니다. 나는 bash로 내가 뭘하는지 거의 모른다.

관련 문제